Requête SQL inserer plusieurs enregistrements

WRInaute occasionnel
Bonjour, je souhaite pouvoir inserer plusieurs enregistrement dans ma table avec une seule requête voici mon code :

Code:
<? 

include ('connexion.php');
$ids = @implode(',' , $_POST['commande']) ;
$stock = @implode(',', $_POST['stock']) ;
$qte = @implode(',', $_POST['qte']) ;
$magasin = @implode(',', $_POST['magasin']) ;

$sql = "INSERT INTO lignedecommande ('produit', 'magasin', 'stock', 'qte') VALUES ('$ids','$magasin', '$stock', '$qte')" ;

mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 

echo '<center><font color="red" size ="14">Commande transmise avec succès.</center></font>'; 

?>

Actuellement j'obtiens ceci :

Code:
Erreur SQL !INSERT INTO lignedecommande ('produit', 'magasin', 'stock', 'qte') VALUES ('ABRICOT,AUBERGINE,AVOCAT,BANANE,BREABURN,CANADA PLATEAU 1 RANG,CAROTTE,CERISE,CHANTECLERC PLATEAU 1 RANG,CHOU FLEUR,CHOUX BLANC,CITRON,CONCOMBRE,COURGETTE,ENDIVES SACHET 1KG,ENDIVES VRAC,FENOUIL,GALA PLATEAU IMPORT 3 RANG,GOLDEN PLATEAU 1 RANG,GOLDEN SACHET,GRANY PLATEAU IMPORT 3 RANG,KIWI,LAITUE ICEBERG,MACHE,MANGUE,MELON VERT,MELON CHARENTAIS,MELON GALIA,MELON JAUNE,NASHI,NAVET,NECTARINE,OIGNON BLANC FILET,OIGNON ROUGE FILET,ORANGE FLT,ORANGE VRAC,PACKAMS PLATEAU,PASTEQUE,PECHE,PIMENT VERT,PINK LADY PLATEAU 1 RANG,POIRE CONFERENCE,POIREAU,POIVRON ROUGE,POIVRON VERT,POMELOS,POMME DE TERRE VRAC,PRUNE ROUGE,RAISIN BLANC,RAISIN NOIR RED GLOBE,RED PLATEAU IMPORT 3 RANG,ROUGE SACHET,TOMATE,TOMATE CERISE BARQUETTE,TOMATE COCKTAIL 500G,TOMATE GRAPPE','test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test,test', '1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0', '2,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0')
Erreur de syntaxe près de ''produit', 'magasin', 'stock', 'qte') VALUES ('ABRICOT,AUBERGINE' à la ligne 1

comment coder pour pouvoir inserer tous ces enregistrement en une seule fois?

Merci de votre aide
 
WRInaute passionné
Le mieux est encore d'ouvrir un recordset editable (avec un transaction), et de faire une boucle pour insérer tes enregistrements.
 
WRInaute occasionnel
peux tu m'expliquer plus en détail car je n'ai pas bien saisi ta réponse étant débutant en php j'avoue que je ne comprends pas trop.
Merci
 
WRInaute passionné
webac> Tu mets tes variables dans des tableaux. Tu fais une boucle et à chaque passage de la boucle tu créé un enregistrement dans la base de données.
 
WRInaute accro
Sinon la syntaxe pour faire de l'insert multiple, il me semble que c'est plutôt comme ça :

Code:
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
 
WRInaute occasionnel
C'est exactement ce que j'essaye de reproduire grace aux implode UsagiYojimbo mais apparament ce n'est pas bon si vous avez une autre piste à me fournir j'en seraiqs très heureux.
 
WRInaute passionné
En supposant que tes variables soit des tableaux bien en forme & cie (exemple avec juste commande, et stock).

Code:
$ok=0;
$ko=0;
for ($i = 0; $i < sizeof($_POST['commande']); $i++) {
    $sql = "INSERT INTO lignedecommande ('produit', 'magasin', 'stock', 'qte') VALUES ('" . $_POST['commande'][$i] . "','$magasin', '" . $_POST['stock'][$i] . "', '$qte')" ;

if (mysql_query($sql))
{ 
   $ok++
} else {
    $ko++
}
}
 
WRInaute accro
webac a dit:
C'est exactement ce que j'essaye de reproduire grace aux implode UsagiYojimbo mais apparament ce n'est pas bon si vous avez une autre piste à me fournir j'en seraiqs très heureux.

En fait le souci vient de ton implode.

Toi ce que tu fais c'est plutôt ça au final :

Code:
INSERT INTO table (a,b,c) VALUES ('1,2,3','4,5,6')

Donc normal que ça marche pas.
 
WRInaute occasionnel
pouvez vous me donner un petit coup de main j'ai testé ton code Bacteries mais ça ne fonctionne pas quand je fais un echo de $ok j'obtiens 0 et quand je fais un echo $ko j'obtiens 56.
 
WRInaute passionné
Tu as bien 56 élément dans ton tableau?
Fais des écho de ta requête et teste là sous phpmyadmin voir l'erreur SQL.
 
WRInaute occasionnel
j'ai bien 56 elements dans mon tableau.

j'obtiens une erreur de syntaxe :

Code:
MySQL a répondu: 

#1064 - Erreur de syntaxe pr�s de ''Produit', 'Mag', 'Stock', 'Qte') VALUES ('TOMATE GRAPPE','test'' � la ligne 1
 
WRInaute occasionnel
Merci Bacteries ça fonctionne impec!

et merci également a tous les autres et a WRI biensur!
 
WRInaute occasionnel
dernier petit problème que je viens de constater les données s'inserent en double dans ma table, savez vous d'ou cela peut provenir?
 
WRInaute occasionnel
non je n'ai pas fais F5 je n'appelle pas non plus deux fois la requête voici mon code final :

Code:
<? 

include ('connexion.php');

$ok=0; 
$ko=0; 
for ($i = 0; $i < sizeof($_POST['commande']); $i++) { 
    $sql = "INSERT INTO lignedecommande (Produit, Mag, Stock, Qte, Date) VALUES ('" . $_POST['commande'][$i] . "','" . $_POST['magasin'][$i] . "', '" . $_POST['stock'][$i] . "', '" . $_POST['qte'][$i] . "','" . $_POST['dat'][$i] . "')" ; 

if (mysql_query($sql)) 
{ 
   $ok++ ;
} 
else { 
    $ko++ ;
} 
} 


echo '<center><font color="red" size ="14">Commande transmise avec succès.</center></font>'; 

?>
 
WRInaute occasionnel
voila ce que me retourne print_r($_POST['commande']) :

Array ( [0] => ABRICOT [1] => AUBERGINE )

j'ai bien abricot et aubergine en double dans ma table
 
WRInaute passionné
Ton code est bon (sauf si j'ai loupé un truc, mais vu la taille je doute), donc je penche pour un include fait deux fois, un script lancé deux fois, ... un problème plus haut du coup.

Ton script est-il inclut d'une autre page?
 
WRInaute occasionnel
j'ai un autre soucis en plus de ça les champs quantité et stock ne s'inserent pas dans la table pour certains articles.

voici le code de la page du formulaire pour l'erreur de doublon :

Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
function Check_all(container_id,state)
 {
  var checkboxes = document.getElementById(container_id).getElementsByTagName('input');
  for (var i=0;i<checkboxes.length;i++)
   {
    if(checkboxes[i].type == 'checkbox')
     {
      checkboxes[i].checked = state;
     }
   }
  return true;
 }
</script>
<script langage='javascript'>
function Cloturer(){
document.forms['form1'].action ='commande2.php';
document.forms['form1'].submit();
}
</script>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Commande</title>
</head>
<body>
  
<div align="left">
  <? include ('connexion.php'); ?>
  <div align="left"> 
  <form id="form1" name="form1" method="post" target="_self">
   <table width="50%" border="1" align="center" bordercolor="#FFFFFF" style="border: 1 solid #FFFFFF">
  
   <br />
</div>
<td bgcolor="#5389EE" class="intitule Style5"><div align="left">    <span class="Style6">Produits<br />
        <span class="Style8">Cochez les produits que vous souhaitez commander puis saississez votre stock et la quantit&eacute; souhait&eacute;e.</span></span></div></td>
  <td bgcolor="#5389EE" class="intitule Style3"><div align="left">	      <b>En Stock</b>
  </div></td>
  <td bgcolor="#5389EE" class="intitule Style2"><div align="left" class="Style3">	      <b>Quantité</b>
  </div></td>
    <div align="left">
      <span class="Style2">
      <?php
$date = date("Y-m-d"); 
$magasin= exec('echo %username%');
$sql = "SELECT * from produits WHERE 1 ORDER BY lib ASC";

$resultat = mysql_query ($sql);

$nblignes = mysql_num_rows($resultat); 
$i = 0;
while ($cl = mysql_fetch_array ($resultat))
{

$couleur = "#5389EE";
$i++;

	if ($i % 2 ==1)
	{
	$couleur = "#0066CC";
	}
  $lib  = $cl['lib'];
  $id   = $cl['id'];
  
  echo "<tr BGCOLOR=$couleur>";
  echo "<td><input type='checkbox' name='commande[]' value='$lib' /><font size=2 color=white><b>$lib<b>
  <input type='hidden' name='magasin[]' value='$magasin' />
  <input type='hidden' name='dat[]' value='$date' /></font></td>";
  echo "<td><font size=2 color=white><b><input type='text' name='stock[]' size='2' /></font></td>";
  echo "<td><font size=2 color=white><b><input type='text' name='qte[]' size='2'/></font></td>";
  echo "</tr>";
}

echo "</table>";
mysql_close()
?>
      </span><br />
    </div>
    <div align="center">Cliquez sur l'icone pour valider la commande<input name="Submit" type="image" src="good.gif" alt="Valider la commande" align="bottom" width="20" height="20" onClick="Cloturer()" value="Valider"/>      </div>
</body>
</html>

mais j'avoue que je n'ai rien trouvé.
 
WRInaute passionné
Etrange...

Change le nom de ta variable avec la requête pour voir. Change d'abord $sql = en $req =
Test, regarde si ça plante et/ou si t'as encore des enregistrement qui s'ajoute.

Puis change le mysql_query($sql) en mysql_query($req), retest.

Ca sent l'erreur bête mais chiante à trouver.
 
WRInaute occasionnel
toujours pareil enregistrement en double très chiant comme tu dis.
je vais m'arracher les cheveux si ça continue
 
WRInaute passionné
Quand tu as changé que le nom de ta requete :
Code:
$req = "INSERT INTO lignedecommande (Produit, Mag, Stock, Qte, Date) VALUES ('" . $_POST['commande'][$i] . "','" . $_POST['magasin'][$i] . "', '" . $_POST['stock'][$i] . "', '" . $_POST['qte'][$i] . "','" . $_POST['dat'][$i] . "')" ;

if (mysql_query($sql))

Ca à quand même planté? (ou au moins rien enregistré)
 
WRInaute occasionnel
c'est bon ça fonctionne j'ai remplacé :

Code:
<input name="Submit" type="image" src="good.gif" alt="Valider la commande" align="bottom" width="20" height="20" onClick="Cloturer()" value="Cloturer">

par :
Code:
<img style="cursor: pointer" src="good.gif" onClick="Cloturer();">

et ça passe nickel sur FF et IE

Merci pour ton aide Bacteries!
 
Discussions similaires
Haut