Enregistrer une à une les données reçues d'un formulaire dynamique

Résolu
iKelSilver - Modifié le 4 févr. 2019 à 18:31
 iKelSilver - 4 févr. 2019 à 23:16
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

1 réponse

jordane45 Messages postés 38154 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 344
4 févr. 2019 à 19:38
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';
 }

?>
0
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.
0
jordane45 Messages postés 38154 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 344
4 févr. 2019 à 23:07
Ce n'est pas possible...
Fais donc un print_r($_POST) au début du script et colles nous ce que ça t'affiche...
0
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
0
Rejoignez-nous