INSERT en db de Variables
nono72i
Messages postés
6
Statut
Membre
-
jordane45 Messages postés 40050 Statut Modérateur -
jordane45 Messages postés 40050 Statut Modérateur -
Bonjour,
Avant toute chose voici la structure de ma bdd :
client(id_cli[PK], nom, prenom..)
commande(id[PK], id_client[FK] date, etat)
commande_contenu(id_commande[PK][FK], id_produit[PK][FK], quantite)
produit(id_produit[PK], id_famille[FK] nom, prix ..)
famille(id_fam[PK], nom)
J'essaye donc via un formulaire, d'insérer les id_produit, et quantite dans commande_contenu
Je pense qu'il me faut plusieurs requête à la suite, mais c'est là que je bloque, notamment à cause de l'id_commande.
voici mes requêtes :
(avec ce code, ça me dit : undefined index aux lignes de $quantite et $produit)
et mon formulaire :
Je ne sais pas si je vais être très clair, mais comment faire pour récupérer un 'id_commande' dans ma deuxième requête alors que je n'ai pas besoin de l'insérer dans la première.
Je suis perdu ...
Merci pour votre temps !
Avant toute chose voici la structure de ma bdd :
client(id_cli[PK], nom, prenom..)
commande(id[PK], id_client[FK] date, etat)
commande_contenu(id_commande[PK][FK], id_produit[PK][FK], quantite)
produit(id_produit[PK], id_famille[FK] nom, prix ..)
famille(id_fam[PK], nom)
J'essaye donc via un formulaire, d'insérer les id_produit, et quantite dans commande_contenu
Je pense qu'il me faut plusieurs requête à la suite, mais c'est là que je bloque, notamment à cause de l'id_commande.
voici mes requêtes :
$quantite=$_POST['quantite'];
$produit=$_POST['id_produit'];
// Requêtes d'ajout d'ouvrages à la commande
if(isset($_POST['commander'])){
$commander = mysqli_real_escape_string($con, htmlspecialchars($_POST['commander']));
$commande1="INSERT INTO commande('id_commande','id_client','etat_commande')
VALUES ('".$_POST['id_commande']."' , 1, 'en attente')";
$commande2="INSERT INTO commande_contenu('id_commande','id_produit','quantite')
VALUES ('".$_POST['id_commande']."', '".$_POST['id_produit']."', '".$_POST['quantite']."')";
}
(avec ce code, ça me dit : undefined index aux lignes de $quantite et $produit)
et mon formulaire :
<!-- Affichage des produits proposés -->
<?php
while($ligne = $resultat->fetch_assoc()){
?>
<tr>
<td><?php echo $ligne['id_produit']; ?></td>
<td><?php echo $ligne['nomProduit']; ?></td>
<td><?php echo $ligne['nom']; ?></td>
<td><?php echo $ligne['prixProduit']; ?>€</td>
<td>
<form method ='POST' action = 'recherche_produits.php'>
<center>
<input type="number" step="1" value="qte" name="<?php echo $quantite; ?>" min="0" max="20">
<input type="submit" value="Commander" name="commander" class="btn btn-sm btn-primary">
</center>
</form>
</td>
</tr>
<?php
}
?>
Je ne sais pas si je vais être très clair, mais comment faire pour récupérer un 'id_commande' dans ma deuxième requête alors que je n'ai pas besoin de l'insérer dans la première.
Je suis perdu ...
Merci pour votre temps !
Configuration: Windows / Chrome 87.0.4280.88
A voir également:
- INSERT en db de Variables
- Touche insert - Guide
- Fichier .db ✓ - Forum Windows
- Disk boot failure insert system disk and press enter - Guide
- Pas de touche insert sur mon clavier - Forum Clavier
- Touche insert sur clavier portable hp ✓ - Forum Clavier
6 réponses
Bonjour,
Déjà, merci de poster correctement ton code sur le forum en précisant dans les balises de code, le Langage (ici php )
Explications ( à lire ENTIEREMENT !! ) disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Ensuite :
Donc aux lignes
Ce qui semble normal... puisque tu n'a aucun champ portant ces "noms" dans ton formulaire...
D'ailleurs;. d'où vient ce "name" que tu essais de mettre
.. non !! le name.. c'est
( à mon avis, tu as inversé avec l'attribut value ..
et pour avoir l'id du produit, il faudrait ajouter, dans ton form, un input hidden avec la valeur correspondante
Une fois que ça sera corrigé ... on passe ensuite à tes requêtes....
Déjà, tu as une erreur dans la première .. ce n'est pas id_commande ... mais id (tout court !! )
J'espère, au passage, que ce champ est en auto-incrément ...
Si c'est le cas, tu ne dois pas le mettre dans la requête d'insert
donc,
devient
Si c'est le cas, tu pourras récupérer l'id nouvellement créé via l'instruction : mysqli_insert_id
Voila ... avec tout ça.. tu devrais pouvoir t'en sortir...
Reste à écrire le code proprement et correctement..
Je t'invite à lire ceci : https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
N'hésites pas non plus à afficher le contenu de ta variable $_POST ( via un var_dump ou un print_r ) histoire de voir ce qu'elle contient lorsque tu "submit" ton formulaire..
Déjà, merci de poster correctement ton code sur le forum en précisant dans les balises de code, le Langage (ici php )
Explications ( à lire ENTIEREMENT !! ) disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Ensuite :
avec ce code, ça me dit : undefined index aux lignes de $quantite et $produit)
Donc aux lignes
$quantite=$_POST['quantite']; $produit=$_POST['id_produit'];
Ce qui semble normal... puisque tu n'a aucun champ portant ces "noms" dans ton formulaire...
D'ailleurs;. d'où vient ce "name" que tu essais de mettre
name="<?php echo $quantite; ?>"
.. non !! le name.. c'est
name="quantite">tout simplement !!
( à mon avis, tu as inversé avec l'attribut value ..
value="qte"
et pour avoir l'id du produit, il faudrait ajouter, dans ton form, un input hidden avec la valeur correspondante
<form method ='POST' action = 'recherche_produits.php'> <input type="hidden" name="id_produit" value="<?php echo $ligne['id_produit']; ?>" />
Une fois que ça sera corrigé ... on passe ensuite à tes requêtes....
Déjà, tu as une erreur dans la première .. ce n'est pas id_commande ... mais id (tout court !! )
J'espère, au passage, que ce champ est en auto-incrément ...
Si c'est le cas, tu ne dois pas le mettre dans la requête d'insert
donc,
$commande1="INSERT INTO commande('id_commande','id_client','etat_commande')
VALUES ('".$_POST['id_commande']."' , 1, 'en attente')";
devient
$commande1="INSERT INTO commande('id_client,etat_commande)
VALUES (1, 'en attente')";
Si c'est le cas, tu pourras récupérer l'id nouvellement créé via l'instruction : mysqli_insert_id
$commande1="INSERT INTO commande('id_client,etat_commande)
VALUES (1, 'en attente')";
//exécution de la requete
if(!mysqli_query($con, $commande1) ){
echo("Erreur dans la requete : " . $commande1 . ' <br>Erreur :' . mysqli_error($con));
}
// récupération de l'id nouvellement inséré en BDD
$id_commande = mysqli_insert_id($con);
Voila ... avec tout ça.. tu devrais pouvoir t'en sortir...
Reste à écrire le code proprement et correctement..
Je t'invite à lire ceci : https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
N'hésites pas non plus à afficher le contenu de ta variable $_POST ( via un var_dump ou un print_r ) histoire de voir ce qu'elle contient lorsque tu "submit" ton formulaire..
Wow, merci pour cette réponse + que détaillée, et désolé pour les codes sans balises !
J'ai une petite dernière question...
Mon formulaire se présente sous cette forme :

Est-il possible que, si l'internaute saisit plusieurs quantités sur différents produits, cela insère tous les champs des produits voulus et pas seulement celui ou le clic est effectué ?
Je ne pense pas mais sait-on jamais ...
Pour rappel voici mon formulaire :
Merci pour ton temps jordane45 !
J'ai une petite dernière question...
Mon formulaire se présente sous cette forme :
Est-il possible que, si l'internaute saisit plusieurs quantités sur différents produits, cela insère tous les champs des produits voulus et pas seulement celui ou le clic est effectué ?
Je ne pense pas mais sait-on jamais ...
Pour rappel voici mon formulaire :
<?php
while($ligne = $resultat->fetch_assoc()){
?>
<tr>
<td><?php echo $ligne['id_produit']; ?></td>
<td><?php echo $ligne['nomProduit']; ?></td>
<td><?php echo $ligne['nom']; ?></td>
<td><?php echo $ligne['prixProduit']; ?>€</td>
<td>
<form method ='POST' action = 'recherche_produits.php'>
<center>
<input type="number" step="1" value="qte" name="quantite" min="0" max="20">
<input type="submit" value="Commander" name="commander" class="btn btn-sm btn-primary">
<input type="hidden" name="id_produit" value="<?php echo $ligne['id_produit']; ?>" />
</center>
</form>
</td>
</tr>
<?php
}
?>
Merci pour ton temps jordane45 !
Déplace tes balises FORM en dehors de ton while
et modifie le name de tes input en "array"
Dans ta variables $_POST tu va récupérer des ARRAY avec les différents champs remplis...
Il te suffit de faire une boucle dessus ( un FOREACH par exemple) pour tous les traiter..
Fais un print_r de $_POST pour voir ce que ça te retourne quand tu remplis un ... puis plusieurs produits..
Puis
<form method ='POST' action = 'recherche_produits.php'>
<?php
while($ligne = $resultat->fetch_assoc()){
?>
... le reste de ton code
<?php
}
?>
</form>
et modifie le name de tes input en "array"
<input type="hidden" name="id_produit[]" value="<?php echo $ligne['id_produit']; ?>" /> <input type="number" step="1" value="qte" name="quantite[<?php echo $ligne['id_produit']; ?>]" min="0" max="20"> <input type="submit" value="Commander" name="commander" class="btn btn-sm btn-primary">
Dans ta variables $_POST tu va récupérer des ARRAY avec les différents champs remplis...
Il te suffit de faire une boucle dessus ( un FOREACH par exemple) pour tous les traiter..
Fais un print_r de $_POST pour voir ce que ça te retourne quand tu remplis un ... puis plusieurs produits..
Puis
<?php
// Pour voir ce que contient la variable $_POST
echo "<pre>";
print_r($_POST);
echo "</pre>";
// récupération PROPRE des variables AVANT de les utiliser
$id_produits = !empty($_POST['id_produit']) ? $_POST['id_produit'] : NULL;
$quantites= !empty($_POST['quantite']) ? $_POST['quantite'] : NULL;
// Si il y a des quantités renseignées ...
if($quantites ){
// Création de la commande
// .. je te laisse remettre le code qui sert à créer la commande
// Puis boucle sur le/les produit(s) pour les ajouter dans la commande
foreach($quantites as $id_p => $qte ){
echo "<br> ID : ". $id . " Quantité : " . $qte ;
// ... puis le reste du code pour ajouter le ou les produits à ta commande
// ...
}
}
?>
C'est donc possible super.
En revanche quand je modifie les input en array j'ai l'erreur suivante :
Notice: Array to string conversion in C:\wamp64\www\bon_commande\requetes_produits.php on line 49
J'ai donc essayé ça :
Ce qui m'occasionne une nouvelle erreur ;
Erreur :Incorrect integer value: '' for column 'quantite' at row 1
Bonne journée et merci.
En revanche quand je modifie les input en array j'ai l'erreur suivante :
Notice: Array to string conversion in C:\wamp64\www\bon_commande\requetes_produits.php on line 49
J'ai donc essayé ça :
$i=1;
$commande2="INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`)
VALUES ('".$id_commande."', '".$_POST['id_produit'][$i]."', '".$_POST['quantite'][$i]."')";
Ce qui m'occasionne une nouvelle erreur ;
Erreur :Incorrect integer value: '' for column 'quantite' at row 1
Bonne journée et merci.
Visiblement ... tu lis en diagonale les réponses que je te donne ...
As tu fais les print_r que je t'ai demandé ??
As tu vus, tel que je te l'ai indiqué, que désormais c'était des array contenant toutes les valeurs ?
As tu vu le bout de code que je t'ai donné avec la boucle ?
L'as tu pris en compte dans ton code ? (j'en doute)..
Donc relis bien ma réponse précédente .. applique ce que j'y ai écrit .. et reviens nous voir avec le code COMPLET une fois que ça sera fait si tes soucis persistent...
As tu fais les print_r que je t'ai demandé ??
As tu vus, tel que je te l'ai indiqué, que désormais c'était des array contenant toutes les valeurs ?
As tu vu le bout de code que je t'ai donné avec la boucle ?
L'as tu pris en compte dans ton code ? (j'en doute)..
Donc relis bien ma réponse précédente .. applique ce que j'y ai écrit .. et reviens nous voir avec le code COMPLET une fois que ça sera fait si tes soucis persistent...
Désolé, pour t'expliquer ma situation je suis en stage de 1ère année de BTS sans aide informatique sur place et tout ça je n'ai encore jamais fait. Je ne comprends pas grand chose à ce qu'il faut mettre dans les boucles.
J'ai bien fait les print_r, mais où placer le if et le foreach je n'en sais rien..
Je vais essayer de me documenter et revenir ici si j'ai quelque chose à partager.
Bonne soirée.
J'ai bien fait les print_r, mais où placer le if et le foreach je n'en sais rien..
Je vais essayer de me documenter et revenir ici si j'ai quelque chose à partager.
Bonne soirée.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bon... j'en suis arrivé là. C'est probablement très nul, désolé d'avance.
Je n'y arrive pas.
Les array fonctionnent et m'indiquent bien la quantité et l'id.
L'insertion ne se fait plus.
Je n'y arrive pas.
Les array fonctionnent et m'indiquent bien la quantité et l'id.
L'insertion ne se fait plus.
$id_produits = !empty($_POST['id_produit']) ? $_POST['id_produit'] : NULL;
$quantites= !empty($_POST['quantite']) ? $_POST['quantite'] : NULL;
// Requêtes d'ajout d'ouvrages à la commande
if(isset($_POST['commander'])){
if($quantites>0){
// Création de la commande
$commander = mysqli_real_escape_string($con, htmlspecialchars($_POST['commander']));
$commande1="INSERT INTO commande(`id_client`,`etat_commande`)
VALUES (1, 'en attente')";
//exécution de la requete
if(!mysqli_query($con, $commande1) ){
echo("Erreur dans la requete : " . $commande1 . ' <br>Erreur :' . mysqli_error($con));
}
// récupération de l'id nouvellement inséré en BDD
$id_commande = mysqli_insert_id($con);
// Puis boucle sur le/les produit(s) pour les ajouter dans la commande
foreach($quantites as $id_produits => $qte ){
echo "<br> ID : ". $id_produits . " Quantité : " . $qte ;
$commande2="INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`)
VALUES ('".$id_commande."', '".$_POST['id_produit']."', '".$_POST['quantite']."')";
//exécution de la requete 2 avec le même id_commande.
if(!mysqli_query($con, $commande2) ){
echo("Erreur dans la requete : " . $commande2 . ' <br>Erreur :' . mysqli_error($con));
}
// ... puis le reste du code pour ajouter le ou les produits à ta commande
}
}
}
// Pour voir ce que contient la variable $_POST
echo "<pre>";
print_r($_POST);
echo "</pre>";
$id_produits = !empty($_POST['id_produit']) ? $_POST['id_produit'] : NULL;
$quantites= !empty($_POST['quantite']) ? $_POST['quantite'] : NULL;
// Requêtes d'ajout d'ouvrages à la commande
if(isset($_POST['commander'])){
if($quantites>0){
// Création de la commande
// $commander = mysqli_real_escape_string($con, htmlspecialchars($_POST['commander'])); // ne sert à rien
$commande1="INSERT INTO commande(`id_client`,`etat_commande`)
VALUES (1, 'en attente')";
//exécution de la requete
if(!mysqli_query($con, $commande1) ){
echo("Erreur dans la requete : " . $commande1 . ' <br>Erreur :' . mysqli_error($con));
}
// récupération de l'id nouvellement inséré en BDD
$id_commande = mysqli_insert_id($con);
// Puis boucle sur le/les produit(s) pour les ajouter dans la commande
foreach($quantites as $id_produits => $qte ){
echo "<br> ID : ". $id_produits . " Quantité : " . $qte ; // ça.. ça t'affiche quoi ??
$commande2="INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`)
VALUES ('".$id_commande."', '".$id_produits."', '".$qte."')";
//exécution de la requete 2 avec le même id_commande.
if(!mysqli_query($con, $commande2) ){
echo("Erreur dans la requete : " . $commande2 . ' <br>Erreur :' . mysqli_error($con));
}
}
}
}
Je sais pas trop comment te remercier...
Ca m'affiche ça :
ID : 3 Quantité : 2
ID : 1 Quantité : 1
Et il y'a aussi ça mais j'imagine que c'est la preuve que ça fonctionne mais que ces id n'ont pas été séléctionnés:
ID : 4 Quantité : Erreur dans la requete : INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`) VALUES ('44', '4', '')
Erreur :Incorrect integer value: '' for column 'quantite' at row 1
ID : 2 Quantité : Erreur dans la requete : INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`) VALUES ('44', '2', '')
Erreur :Incorrect integer value: '' for column 'quantite' at row 1
Merci beaucoup !
echo "<br> ID : ". $id_produits . " Quantité : " . $qte ; // ça.. ça t'affiche quoi ??
Ca m'affiche ça :
ID : 3 Quantité : 2
ID : 1 Quantité : 1
Et il y'a aussi ça mais j'imagine que c'est la preuve que ça fonctionne mais que ces id n'ont pas été séléctionnés:
ID : 4 Quantité : Erreur dans la requete : INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`) VALUES ('44', '4', '')
Erreur :Incorrect integer value: '' for column 'quantite' at row 1
ID : 2 Quantité : Erreur dans la requete : INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`) VALUES ('44', '2', '')
Erreur :Incorrect integer value: '' for column 'quantite' at row 1
Merci beaucoup !
Il faut corriger dans la boucle for
// Puis boucle sur le/les produit(s) pour les ajouter dans la commande
foreach($quantites as $id_produits => $qte ){
echo "<br> ID : ". $id_produits . " Quantité : " . $qte ; // ça.. ça t'affiche quoi ??
if( !empty( $qte) && !empty($id_produits) ) {
$commande2="INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`)
VALUES ('".$id_commande."', '".$id_produits."', '".$qte."')";
//exécution de la requete 2 avec le même id_commande.
if(!mysqli_query($con, $commande2) ){
echo("Erreur dans la requete : " . $commande2 . ' <br>Erreur :' . mysqli_error($con));
}
}
}