Insert multiples dans une table

Invité
Invité n'ayant pas de compte PHPfrance

08 déc. 2006, 00:06

Bonsoir,

Je cherche à faire plusieurs insert simultanés dans une même table mais cela me pose des problèmes.

J'ai trouvé un post à ce sujet qui donne une piste mais je ne sais pas comment l'exploiter :

J'ai une page qui affiche une liste de produits avec leurs codes, leurs libellés et leur prix. Les données proviennent d'une base.
<?php
    
    include ("connect.inc.php");
    include ("connect_mysql.inc.php"); 
    

    //récupération des données de la base
    $req= "SELECT * FROM articles_fleurs";
    $res= mysql_query($req);
    while ($ligne= mysql_fetch_array($res))
    { ?>
    <tr> 
    <td class="td" width="25" ><b>5:</b></td>
    <td class="td" width="100"><input class="input" type="text" name="Code" size="10" value="<?php print $ligne['code']; ?>"></td>
    <td class="td" width="150"><input class="input" type="text" name="Design" size="20" value="<?php print $ligne['design']; ?>"></td>
    <td class="td" width="100"><input class="input" type="text" name="Quantite" size="4" value=""></td>
    <td class="td" width="100"><input class="input" type="text" name="Prix" size="10" value="<?php print $ligne['prixU']; ?>"></td>
    <td class="td" width="100">&nbsp;</td>
    </tr>
    <?php } ?>
L'utilisateur doit saisir les quantités. Le formulaire est traité dans la page commande1.php. Je voudrais que toutes les quantités saisies ainsi que les code produits et l'email du client soit insérer dans une table:
<?php
include ("connect.inc.php");
include ("connect_mysql.inc.php");
     

//insertion des données dans la table commande
  $Code= (isset($_POST['Code']));
  $courriel= (isset($_POST['courriel']));
  $Quantite= (isset($_POST['Quantite']));  

  $req1="INSERT INTO commande (id_produit, email_client, quantite) VALUES (\"$Code\", \"$courriel\", \"$Quantite\")";
  $rep= mysql_query($req1);

  ?>

La piste que j'ai trouvé indique qu'il faut obtenir quelque chose du type :
$req1="INSERT INTO commande (id_produit, email_client, quantite) VALUES (\"$Code\", \"$courriel\", \"$Quantite\") (\"$Code1\", \"$courriel1\", \"$Quantite1\") ";
  $rep= mysql_query($req1);

Et donc boucler autant de fois que j'ai de ligne à insérer.
Mais je ne réussis pas à le traduire en code.

Merci de votre aide.

Invité
Invité n'ayant pas de compte PHPfrance

08 déc. 2006, 00:48

J'essaie d'avancer et je voulais vérifier en transformant ma variable $code en tableau combien il contient de valeur et quelles sont elles. Je devrais avoir 5 valeurs d'enregistrées or mon tableau m'en retourne 1 et la dernière valeur?
<?php

if (isset($_POST['nom']))
$nom= strtoupper($_POST['nom']);
if (isset($_POST['rcs']))
$rcs= strtoupper($_POST['rcs']);
if (isset($_POST['adresse1']))
$adresse1= strtoupper($_POST['adresse1']);
if (isset($_POST['adresse2']))
$adresse2= strtoupper($_POST['adresse2']);
if (isset($_POST['codepostal']))
$codepostal= strtoupper($_POST['codepostal']);
if (isset($_POST['ville']))
$ville= strtoupper($_POST['ville']);
if (isset($_POST['courriel']))
$courriel= ($_POST['courriel']);
if (isset($_POST['Code']))
$Code[]= $_POST['Code'];
if (isset($_POST['Design']))
$Design= $_POST['Design'];
if (isset($_POST['Quantite']))
$Quantite= $_POST['Quantite'];
if (isset($_POST['Prix']))
$Prix= $_POST['Prix'];
if (isset($_POST['total']))
$total= $_POST['total'];

include ("connect.inc.php");
include ("connect_mysql.inc.php");

$new=array();
$new=$Code;
$compte=count($new);
print_r($new);
     

//insertion des données dans la table commande
  $Code= (isset($_POST['Code']));
  $courriel= (isset($_POST['courriel']));
  $Quantite= (isset($_POST['Quantite']));  

  $req1="INSERT INTO commande (id_produit, email_client, quantite) VALUES (\"$Code\", \"$courriel\", \"$Quantite\")";
  $rep= mysql_query($req1);

  ?>

ViPHP
ViPHP | 1961 Messages

08 déc. 2006, 00:51

Bonsoir,

De la façon dont tu présentes ton code (tu ne récupères qu'un article à la fois)
La concaténation des valeurs à insérer n'a aucun intérêt.

C'est intéressant si tu recevais 30, 40, 50, ... ou plus articles dans ta page de traitement car ce qui est couteux c'est l'accès à la base (ouverture de connexion)

Parcontre ce qui serait bien c'est que tu sépares las variables PHP du reste de la requête
$req1='INSERT INTO commande (id_produit, email_client, quantite) VALUES ("' . $Code. '", "' . $courriel . '", "' . $Quantite . '")';
Et que tu testes le retour de MySQL
$rep= mysql_query($req1) or die ('ERR_SQL ' . $req1 . '<br />' . mysql_error());
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 19672 Messages

08 déc. 2006, 00:57

Salut,
premier problème : ton formulaire : tu as plusieurs champs ayant le même nom, donc tu ne peux pas tout récupérer. Pour corriger ça, il faut que les valeurs dans les attributs name soient des tableaux. On fait ça en ajoutant des crochets [], ce qui donne :
<?php
include ("connect.inc.php");
include ("connect_mysql.inc.php");


//récupération des données de la base
$req= "SELECT * FROM articles_fleurs";
$res= mysql_query($req);
while ($ligne= mysql_fetch_array($res))
{
    ?>
  <tr> 
    <td class="td" width="25" ><b>5:</b></td>
    <td class="td" width="100"><input class="input" type="text" name="Code[]" size="10" value="<?php print $ligne['code']; ?>"></td>
    <td class="td" width="150"><input class="input" type="text" name="Design[]" size="20" value="<?php print $ligne['design']; ?>"></td>
    <td class="td" width="100"><input class="input" type="text" name="Quantite[]" size="4" value=""></td>
    <td class="td" width="100"><input class="input" type="text" name="Prix[]" size="10" value="<?php print $ligne['prixU']; ?>"></td>
    <td class="td" width="100">&nbsp;</td>
  </tr>
<?php
}
?>
Ensuite, tu récupères les valeurs : comme je l'ai mentionné, ce sont des tableaux, donc :
$Code = $_POST['Code'];
$Design = $_POST['Design'];
//... etc...
Ensuite, il faut créer dynamiquement ta requête avec chaque ligne. Tu auras le nombre en comptant un des tableaux obtenus :
$nb = count($Code);
Enfin, il te reste à construire la requête : deux phases, d'abord le début de la requête, et ensuite les séries de valeurs :
$sql = "INSERT INTO commande (id_produit, email_client, quantite) VALUES";
/* On crée un tableau pour stocker les séries de valeurs */
$valeurs = array();
for($i = 0; $i < $nb; $i++)
{
    $valeurs[] = " ('". $Code[$i] ."', '". $courriel ."', ". $Quantite[$i] .")";
}
/* On regroupe les valeurs pour les ajouter à la requête de base: */
$sql .= implode(",", $valeurs);
/* Affichage de débugage : */
echo("<code>". $sql ."</code>\n");
Et ensuite tu peux exécuter.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

08 déc. 2006, 00:58

Salut,

La synatxe de récupération des variables POST n'est pas fausse mais va renvoyer un booleen (Vrai, Faux) pas le vrai contenu.
Regarde ce post pour l'opérateur ternaire

faudrait ajouter des [] à l'attribut "name" (name="quantite[]" )des input du formulaire, pour pouvoir récupérer toutes les données (sous forme de tableau) et non seulement le derier champ.

ensuite tu peux par exemple boucler sur $_POST['Quantite'] (j'utilise $quantite après l'utilisation de l'opérateur ternaire.. tu verra :wink: ).
//tableau qui va contenir les différents "insert"
$sql = array();
foreach($quantite => $cle as $val)
{
    // ce qui doit donner (152,'[email protected]',4)...en supposant le code comme "chiffre"
   $sql[] = " (".$code[$cle].", '".$courriel."', ".$val.") ";
} 
// l'implode concatènera toutes les valeurs du tableau 
$req1="INSERT INTO commande (id_produit, email_client, quantite) VALUES ".implode(",",$sql);

// ne sert que de test de visualisation
echo "<p>la requete générée est : ".$req1</p>";
$rep= mysql_query($req1); 
Edit: Quasi la même chose Cyrano.... ça veut dire que je suis bon moi aussi :lol:
(par contre plus rapide quoi moi :ordi: )
Modifié en dernier par Truc le 08 déc. 2006, 01:10, modifié 2 fois.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

08 déc. 2006, 01:00

J'ai testé mais mysql ne me renvoie aucun message!

Pour précision, je devrais récupérer 5 articles différents avec 5 quantités différentes et les insérés simultanément dans une table.

Mammouth du PHP | 19672 Messages

08 déc. 2006, 01:02

Fais afficher la requête créée et affiche-nous ça ici :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

08 déc. 2006, 01:11

Merci pour votre aide. Je suis en train de tester les infos de Cyrano que je comprends mieux mais j'avoue que je n'aurais pas trouver.

Invité
Invité n'ayant pas de compte PHPfrance

08 déc. 2006, 01:35

Mon script fonctionne.

Merci pour votre aide et pour la clarté des explications.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

08 déc. 2006, 02:05

Pense à t'inscrire avant les éventuelles autres questions. tu pourras profiter des avantages des membres et tagger toi même le sujet [Résolu] :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute