INSERT en db de Variables

Signaler
Messages postés
6
Date d'inscription
lundi 11 janvier 2021
Statut
Membre
Dernière intervention
12 janvier 2021
-
Messages postés
30982
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 janvier 2021
-
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 :


$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

6 réponses

Messages postés
30982
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 janvier 2021
3 169
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 :
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://www.commentcamarche.net/faq/48399-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..



Cordialement,
Jordane
Messages postés
6
Date d'inscription
lundi 11 janvier 2021
Statut
Membre
Dernière intervention
12 janvier 2021

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 :

<?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 !
Messages postés
30982
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 janvier 2021
3 169
Déplace tes balises FORM en dehors de ton while
 <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
     // ...

  }
}
?>
Messages postés
6
Date d'inscription
lundi 11 janvier 2021
Statut
Membre
Dernière intervention
12 janvier 2021

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 :
$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.
Messages postés
30982
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 janvier 2021
3 169
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...
Messages postés
6
Date d'inscription
lundi 11 janvier 2021
Statut
Membre
Dernière intervention
12 janvier 2021

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.
Messages postés
6
Date d'inscription
lundi 11 janvier 2021
Statut
Membre
Dernière intervention
12 janvier 2021

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.

$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
           
      
        }
      }    
}
Messages postés
30982
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 janvier 2021
3 169

// 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));
            }
      
      
        }
      }    
}

Messages postés
6
Date d'inscription
lundi 11 janvier 2021
Statut
Membre
Dernière intervention
12 janvier 2021

Je sais pas trop comment te remercier...

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 !
Messages postés
30982
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 janvier 2021
3 169
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));
              }
            }
      
        }