Requête SQL inserer plusieurs enregistrements

  • Auteur de la discussion Auteur de la discussion webac
  • Date de début Date de début
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
 
Le mieux est encore d'ouvrir un recordset editable (avec un transaction), et de faire une boucle pour insérer tes enregistrements.
 
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
 
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.
 
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)
 
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 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++
}
}
 
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.
 
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.
 
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.
 
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
 
Merci Bacteries ça fonctionne impec!

et merci également a tous les autres et a WRI biensur!
 
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?
 
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>'; 

?>
 
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
 
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?
 
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é.
 
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.
 
toujours pareil enregistrement en double très chiant comme tu dis.
je vais m'arracher les cheveux si ça continue
 
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é)
 
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!
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut