Enregistrer une à une les données reçues d'un formulaire dynamique [Résolu]

-
Bonjour,
Je suis sur un projet qui demande à ce que l'utilisateur puisse remplir un formulaire dynamique comme ci-dessous. Avec un seul enregistrement dans la base de données, tout se passe très bien. Mais, le problème vient du moment ou la table contient plus d'un enregistrement. Quand je valide le formulaire, un seul enregistrement est réalisé et les autres sont ignorés. Je sais que avec une boucle, ça résoudre ce problème, mais, je ne sais laquelle utilisée.
Voici mon code :

<?php 
 include('connexion.php');
 $afficherPproduits = $bdd->query(" SELECT *  FROM produits"); 
?>
<form method="POST" action="enregistrer_commande.php">
<?php while ($contenuPproduits = $afficherPproduits->fetch()) { ;?>
 <input name="nom_produit" placeholder="Nom du produit: " value="<?php echo $contenuPproduits['nom_produit']; ?>" />
 <input name="prix_produit" placeholder="Prix du produit: "  value="<?php echo $contenuPproduits['prix_produit']; ?>"  />
 <input name="quantite_produit" type="number" placeholder="Quantité:  " />
 <input type="submit" name="bouton" value="Enregistrer" />
<?php }$afficherPproduits->closeCursor(); ?>
</form>


Fichier: enregistrer_commande.php

<?php 
 $nom_produit       =!empty($_POST['nom_produit'])?$_POST['nom_produit']:NULL;
 $prix_produit      =!empty($_POST['prix_produit'])?$_POST['prix_produit']:NULL;
 $quantite_produit  =!empty($_POST['quantite_produit'])?$_POST['quantite_produit']:NULL;
 include('connexion.php');
 if(isset($_POST['bouton'])){
 $req = $bdd->prepare('INSERT INTO   commande
          (id_produit,
              nom_produit,
           prix_produit,
           quantite_produit)
        VALUES(?, ?, ?)');
 $req->execute(array( $id_produit,
       $nom_produit,       
       $prix_produit,       
       $quantite_produit
      ));
 echo 'Données bien envoyées';
 }
 else{
  echo 'Aucune donnée reçue';
 }
?>
</php>

Mon problème vient du faire que si la table qui affiche le formulaire contient plus d'un enregistrement, l'enregistrement à la page suivante n'effectue qu'une seule entrée dans l'autre table
commande
.

Comment puis-je le faire afin que tous les enregistrements puissent bien se passer au niveau de l'autre table ?

Merci
Afficher la suite 

Votre réponse

1 réponse

Messages postés
24400
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 février 2019
360
0
Merci
Bonjour,

Déjà.. niveau formulaire.. je le modifierai comme ceci:
<form method="POST" action="enregistrer_commande.php">
  <?php 
    $i=0;
    while ($contenuPproduits = $afficherPproduits->fetch()) { 
     echo '
    <input type="hidden" name="prd['.$i.'][id_produit]" value="'.$contenuPproduits['id_produit'].'" />
     <input type="text" name="prd['.$i.'][nom_produit]" placeholder="Nom du produit: " value="'.$contenuPproduits['nom_produit'].'" />
     <input type="text" name="prd['.$i.'][prix_produit]" placeholder="Prix du produit: "  value="'.$contenuPproduits['prix_produit'].'"  />
     <input  name="prd['.$i.'][quantite_produit]" type="number" placeholder="Quantité:  " />
    ';
    $i++;
  }
  $afficherPproduits->closeCursor(); 
  ?>
 <input type="submit" name="bouton" value="Enregistrer" />
</form>


Ensuite, pour le coté traitement php...
<?php
require_once 'connexion.php';

//récupération des variables POST
$prd = !empty($_POST['prd']) ? $_POST['prd'] : NULL;

if($prd){

   $req = $bdd->prepare('INSERT INTO   commande
          (id_produit,
              nom_produit,
           prix_produit,
           quantite_produit)
        VALUES(?, ?, ?)');

   //boucle sur les produits
  foreach($prd as $P){
    $id_produit       =!empty($P['id_produit'])?$P['id_produit']:NULL;
    $nom_produit       =!empty($P['nom_produit'])?$P['nom_produit']:NULL;
   $prix_produit      =!empty($P['prix_produit'])?$P['prix_produit']:NULL;
   $quantite_produit  =!empty($P['quantite_produit'])?$P['quantite_produit']:NULL;

   $req->execute(array( $id_produit,
       $nom_produit,       
       $prix_produit,       
       $quantite_produit
      ));

  }

}else{
  echo 'Aucune donnée reçue';
 }

?>
Bonsoir Jordane45,
Merci pour votre réponse. Mais, le problème n'est pas toujours résolu. C'est toujours un seul enregistrement qui est fait, les autres sont ignorés.
Je ne comprends toujours pas.
jordane45
Messages postés
24400
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 février 2019
360 -
Ce n'est pas possible...
Fais donc un print_r($_POST) au début du script et colles nous ce que ça t'affiche...
Jordane45,

Vous avez raison, ça a marché. Je n'avais pas utilisé le ID de la table dans le formulaire HTML. Je l'utilisais directement dans le fichier d'enregistrement.
Maintenant, ça a marché.
Grand merci à vous
Commenter la réponse de jordane45

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.