Je souhaiterais insérer dans une base 2, 3, 4 ou plus lignes d'un coup. Les données proviennent d'un form. Pour cela j'ai créé un tableau associatif, j'ai preparé mon INSERT INTO mais après je ne sais pas comment faire le EXECUTE dans la boucle foreach.
Le tableau passé à execute doit avoir pour clés les positions et pour valeurs les… valeurs à insérer. Ce qui implique qu'avec la requête ainsi préparée ligne 11, tu dois l'exécuter une fois par enregistrement souhaité, à chaque fois avec les valeurs correctes.
Tu aurais une autre possibilité qui serait de construire ta requête préparée en "multipliant" la partie des valeurs ((?, ?, ?), (?, ?, ?), …) autant de fois que d'enregistrement à insérer, mais du coup tu devrais avoir une valeur pour chacun des marqueurs, donc potentiellement dupliquer certaines dans ton tableau.
Une possibilité pour éviter de devoir dédoubler les valeurs communes à chaque enregistrement : utiliser les marqueurs nommés et activer (je ne sais plus si c'est le cas par défaut) l'émulation des requêtes préparées, ce qui permet de réutiliser un marqueur nommé à plusieurs endroits. En revanche, les clés doivent du coup être les noms des marqueurs.
Exécuter une fois la requête par enregistrement c'est ce que je souhaite mais le problème qui me bloque c'est qu'à la première exécution je veux entrer LastId / id_joueur1 / score1 mais à la deuxième exécution c'est LastId (le même à nouveau) / id_joueur2 / score2 et ainsi de suite et je ne sais pas comment changé ces valeurs entre deux exécutions.
Tu veux dire que mon array devrait ressembler à ça :
Et du coup à 4 joueurs ça va faire une ligne démente
"potentiellement dupliquer certaines dans ton tableau" certaines valeurs sont dupliquées (lastId justement).
J'avais pensé à faire ça ((?, ?, ?), (?, ?, ?), …) mais pareil, je ne sais pas faire le execute après.
Quand j'insère une seule ligne ça fonctionne mais dès que dans mon form j'ai 2, 3 ou 4 joueurs ça bloque. Bref je tourne en rond depuis 2 jours sans comprendre comment faire le execute proprement (et surtout pour qu'il fonctionne
Pas de souci parce que là vraiment je lutte je suis preneur de tout conseils.
Voilà le form (exemple pour 2 joueurs) :
<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="id_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_joueur1'>";
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="id_joueur2">Joueur 2</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_joueur2'>";
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>
OK, alors on va oublier les nombres directement concaténés dans name et on va utiliser de quoi faire en sorte que tu puisses récupérer des tableaux pour faire une boucle qui va exécuter la requête.
Je te propose de lire un autre sujet qui, s'il part d'un cas un peu différent, se voit expliquer le même principe que je te recommande.
Oui pour les name je ne savais pas faire autrement car on ne peut pas donner le même nom à deux variables. Quelqu'un m'avait dit de faire joueur[] mais je n'ai pas su quoi faire avec ça...
Bon et puis même quand je laisse un case à remplir, je n'arrive pas à faire le execute.
Juste le echo me renvoie le lastid et c'est tout
//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();
$lastid = $bdd->lastInsertId();
//echo $lastid;
//On ajoute les détails de la partie dans la table detail
$resultat = $bdd->prepare('INSERT INTO plays_details (detail_partie, detail_joueur, detail_score) VALUES(?, ?, ?)');
//$resultat->execute(array($lastid, $_POST[0], $_POST[1]));
$resultat = array ($lastid, $_POST[0], $_POST[1]);
foreach($resultat as $element)
{
echo $element . '<br />'; // affichera $donnees[0], $donnees[1] etc.
}
OK, alors on va oublier les nombres directement concaténés dans name et on va utiliser de quoi faire en sorte que tu puisses récupérer des tableaux pour faire une boucle qui va exécuter la requête.
Je te propose de lire un autre sujet qui, s'il part d'un cas un peu différent, se voit expliquer le même principe que je te recommande.
- Edité par Ymox 7 mai 2021 à 15:11:19
Bon désolé je n'arrive pas à faire mon execute derrière. Je ne vois pas comment mettre mes $_POST dans le Foreach. Si jamais quelqu'un peut m'aiguiller. Merci
C'est ça que de mettre un message "Je vais voir", puis d'éditer en mettant des questions parce qu'il n'y a pas eu assez de temps pour remettre un autre message : les questions ne se voient pas
bol2ry a écrit:
Mais du coup je peux quand même faire un select pour récupérer la liste des pseudo de la base à la place du input ??
Je n'y vois pas d'inconvénient.
bol2ry a écrit:
Parce que dès que je passe en select il gueule
[…]
Bon et puis même quand je laisse un case à remplir, je n'arrive pas à faire le execute.
Mais encore ? Si tu te limites à "ça ne marche pas", moi j'aurai tendance à te dire "pourtant ça peut marcher", et on ne sera pas plus avancés.
Tu as regardé ce que tu recevais dans $_POST, au moins ?
C'est ça que de mettre un message "Je vais voir", puis d'éditer en mettant des questions parce qu'il n'y a pas eu assez de temps pour remettre un autre message : les questions ne se voient pas
Oui c'est vrai mais au moins ça m'a obligé à chercher pendant 2 jours et à me torturer les méninges au lieu d'attendre une solution
Pour le select, je demandais car quand je l'ai ajouté de la même manière qu'avant, il plantait mon form. Je pense que je n'ai pas la syntaxe correct, j'ai mis ça "<select name='[ echo $i; ][id_joueur]'"; mais le echo n'est pas de la bonne couleur dans mon editeur.
Encore moi... décidément ce thread ne veut pas en finir.
J'arrive à récupérer tout ce que je rentre dans le form ça c'est cool. La première table se remplit, ça c'est cool aussi. Et je voudrais remplir la deuxième avec plusieurs lignes (une par joueur d'où le foreach), mais avec le bout de code de julp, j'obtiens ça :
1 : : 3002 : : 4004 : : 200
id : : score id2 : : score2 id3 : : score3
Je ne comprends pas pourquoi il récupère deux fois les " : ". entre chaque variable id_joueur et score.
> En utilisant la proposition de Julp name="joueurs[][id_score]" et name="joueurs[][score]
Non, il faut que tu mettes la même valeur entre les [] ci-dessus pour faire correspondre les deux via une même clé (noter que j'y avais bien mis $i) sinon comme le montre ton var_dump tu crées un sous-tableau pour chaque élément (au lieu d'avoir les 2 dans le même)
Oui c'est ce que j'avais fait direct. ça fonctionne bien ! <- homme heureux.
Je clos le sujet et je m'attaque à la suite !
Merci !!!
execute un INSERT INTO d'un array dans un foreach
× 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.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli