Partage
  • Partager sur Facebook
  • Partager sur Twitter

Boucle pour insérer plusieurs lignes dans une tabl

a partir de plusieurs input dans un form

    6 mai 2021 à 16:32:55

    Bonjour,

    voilà mon problème : j'ai plusieurs select et input dans un form et je voudrais les insérer dans plusieurs lignes d'une table.

    J'ai joueur1, joueurs2... dans des select qui récupèrent des id et score1, score2... dans des input et une variable nb_joueurs.

    Je voudrais faire une boucle for qui s'incrémente en récupérant le nombre de joueurs et qui me donne des variable genre ['joueur'][$i] et ['score'][$i].

    Ensuite j'insère l'id_joueur et le score qui correspondent dans plusieurs ligne d'une table, mais ça ne fonctionne pas

    Voilà le code du form :

    <form action="ajout_test.php" method="post">
        <p>
            <label for="id_jeu">Nom du jeu</label> :
                <?php
                //afficher la liste des jeux dans une liste déroulante
    
                //récupérer la liste des jeux pour la partie
                $reponse = $bdd->query('SELECT id_jeu, nom_jeu FROM plays_jeux');
    
                // On fait une boucle pour lister tout ce que contient la table :
                echo "<select name='id_jeu'>";
                while ($donnees = $reponse->fetch())
                    {
                     echo "<option value='".$donnees['id_jeu']."'>".$donnees['nom_jeu']."</option>";
                    }
                echo "</select>";
                ?>
    <br />
            <label for="joueur1">Joueur 1</label> :
                <?php
                //afficher la liste des joueurs dans une liste déroulante
    
                //récupérer la liste des joueurs pour le joueur 1
                $reponse = $bdd->query('SELECT id_joueur, pseudo FROM plays_joueurs');
    
                // On fait une boucle pour lister tout ce que contient la table :
                echo "<select name='id_joueur'>";
                while ($donnees = $reponse->fetch())
                    {
                     echo "<option value='".$donnees['id_joueur']."'>".$donnees['pseudo']."</option>";
                    }
                echo "</select>";
                ?>
            <label for="score1">Score</label> :  <input type="number" name="score1" id="score1" />
    <br />
            <label for="joueur1">Joueur 2</label> :
        <?php
        //afficher la liste des joueurs dans une liste déroulante
    
        //récupérer la liste des joueurs pour le joueur 2
        $reponse = $bdd->query('SELECT id_joueur, pseudo FROM plays_joueurs');
    
        // On fait une boucle pour lister tout ce que contient la table :
        echo "<select name='id_joueur'>";
        while ($donnees = $reponse->fetch())
            {
             echo "<option value='".$donnees['id_joueur']."'>".$donnees['pseudo']."</option>";
            }
        echo "</select>";
        ?>
    <label for="score2">Score</label> :  <input type="number" name="score2" id="score2" />
    <br />
            <label for="duree_partie">Durée de la partie</label> :  <input type="number" name="duree_partie" id="duree_partie" /><br />
            <label for="nb_joueurs">nombre de joueurs</label> :  <input type="number" name="nb_joueurs" id="nb_joueurs" /><br />
            <label for="evenement">Chahaignes 2021</label><input type="hidden" name="evenement" id="evenement" value="Chahaignes 2021" /><br />
            Date : <?php echo date('d/m/Y h:i:s'); ?><br />
    
            <input type="submit" value="Envoyer" />
    	  </p>
    </form>

    et voilà le traitement derrière :

    //On crée la partie et on récupère son id
    $req = $bdd->prepare('INSERT INTO plays_parties (partie_jeu, duree_partie, nb_joueurs, evenement, date_partie) VALUES(?, ?, ?, ?, NOW())');
    $req->execute(array($_POST['id_jeu'], $_POST['duree_partie'], $_POST['nb_joueurs'], $_POST['evenement']));
    
    //on affiche le dernier ID, ça fonctionne
    // echo $bdd->lastInsertId();
    
    //On ajoute les détails de la partie dans la table detail
    //$req = $bdd->prepare('INSERT INTO plays_details (detail_partie, detail_joueur, detail_score) VALUES(?, ?, ?)');
    //$req->execute(array($bdd->lastInsertId(), $_POST['id_joueur'], $_POST['score1']));
    
    //recuperation variables pour la boucle joueurs
            $comptage = $_POST['nb_joueurs'];
            for($i=0;$i<$comptage;$i++)
            {
            $id_joueur = $_POST['joueur'][$i];
            $score = $_POST['score'][$i];
            //Insertion dans la base presence participants
            $req = $bdd->prepare('INSERT INTO plays_details (detail_partie, detail_joueur, detail_score) VALUES(?, ?, ?)');
            $req->execute(array($bdd->lastInsertId(), $id_joueur, $score));
            }
    header('Location: ajout_bdd_test.php');

    La partie en // au milieu fonctionne bien quand j'insère une seule ligne.

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      6 mai 2021 à 16:36:34

      Définir "ne pas fonctionner" ?

      • Tu ne peux pas donner le même nom à plusieurs champs name='id_joueur' => name='id_joueur[]'
      • Lors de ta boucle, $bdd->lastInsertId() va te renvoyer l'id du joueur (?) inséré l'itération d'avant, pas celle de la partie (?) (sauf pour la première bien sûr) : il faut que tu mémorises/copies l'id de ta partie dans une variable avant de boucler.
      • Au lieu d'exécuter plusieurs fois la même requête (SELECT id_joueur, pseudo FROM plays_joueurs), ne la fais qu'une fois et copie son résultat en mémoire via fetchAll qui te permettra de (re)parcourir son résultat autant de fois que tu le veux (ou alors tu ne génères qu'une fois tes option via un buffer)
      • il manque des htmlspecialchars pour les XSS (surtout sur $donnees['pseudo'])
      • $_POST['nb_joueurs'] n'est pas nécessaire, tu pourrais faire un foreach sur $_POST['id_joueur']
      • pense à faire le tout dans une transaction histoire d'avoir un tout cohérent, là, si ça plante en plein milieu, tu te retrouves avec qu'une partie des données voulues

      -
      Edité par julp 6 mai 2021 à 16:50:18

      • Partager sur Facebook
      • Partager sur Twitter
        6 mai 2021 à 16:45:59

        Oui désolé ce n'était pas clair. En fait un crée bien la ligne dans la première table mais ensuite il retourne sur la première page php avec le header mais sans avoir rempli la deuxième table.

        Pour le lastInsertId(), c'est bon je le stock dans une variable et je l'insert après.

        Par contre je ne comprends pas pour le champs name='id_joueur[]' je suis sensé mettre quelque chose dans les [] (genre [1] puis [2] puis [3] pour 3 joueurs) ou ça se fera dans le traitement ?

        Et du coup pour le foreach sur $_POST['id_joueur'] Je ne saisi pas comment construire l'array. Pour l'instant j'ai ça pour un joueur ça fonctionne mais je ne sais pas comment l'étendre à plus

        $donnees = array ($lastid, $_POST['id_joueur1'], $_POST['score1']);
        
        foreach($donnees as $element)
        {
            //echo $element . '<br />'; // affichera $donnees[0], $donnees[1] etc.
            echo '<pre>';
            print_r($donnees);
            echo '</pre>';
        }

        Merci encore à julp pour toutes les réponses dans les précédents posts (j'avance bien !)

        -
        Edité par bol2ry 7 mai 2021 à 9:39:39

        • Partager sur Facebook
        • Partager sur Twitter

        Boucle pour insérer plusieurs lignes dans une tabl

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown