Page 1 sur 2

Array

Posté : 01 avr. 2021, 16:46
par XaaE
Bonjour,

Je souhaite créer des pages PHP permettant à l'utilisateur d'inscrire son équipe à un tournois. Pour ça, j'ai scindé le code en 3 fichiers. J'ai un problème concertant le fichier 3, qui doit insérer dans le BDD l'ensemble des joueurs de l'équipe dans la table 'joueur' de la BDD. Cependant, le "execute(array(...)) " ne fonctionne pas. Quand je renseigne plusieurs joueurs, la fonction print_r($_POST["nomJoueurs"]) et print_r($_POST["emailJoueurs"]) n'affiche que le nom et l'email du dernier joueur. Pouvez-vous m'aider ? Merci d'avance pour vos réponses ;)

Fichier 2 :

Code : Tout sélectionner

<section> <?php ?> <form action="inscriptionEquipe3.php" method="POST"> <?php if((!(empty($_POST["nomEquipe"]))) && (!(empty($_POST["adresseEmail"])))){ $id = (intval($_POST["id_du_tournois"])); echo $id; $req = $bdd->prepare('INSERT INTO equipe(nom, niveau, contact, idT) VALUES(:nom, :niveau, :contact, :idT)'); $req->execute(array( 'nom'=>$_POST["nomEquipe"], 'niveau'=>$_POST["nivEquipe"], 'contact'=>$_POST["adresseEmail"], 'idT'=>$id )); for ($i = 0; $i < $_POST["nbrJoueursEquipe"]; $i++){ echo "<p><label>Nom du joueur ".($i+1)." : "."<input type=\"text\" name=\"nomJoueurs\" /></label> "; echo "<label>Email du joueur ".($i+1)." : "."<input type=\"email\" name=\"emailJoueurs\" /></label> "; echo "<select name=\"role\">"."<br />"; echo "<option value=\"capitaine d'equipe\">Capitaine d'équipe"; echo "<option value=\"joueur\">Joueur"; echo "</select></p>"; } echo"<p><input type=\"submit\" value=\"Etape suivante\" />"; } else{ echo "<p>Veuillez renseigner tous les champs de l'étape précédente</p>"; } ?> </form> </section>
Fichier 3

Code : Tout sélectionner

<section> <form action="confirmationInscription.php" method="POST"> <?php echo $_SESSION["nbrJoueurs"]; echo "<pre>"; print_r($_POST["nomJoueurs"]); echo "</pre>"; echo "<pre>"; print_r($_POST["emailJoueurs"]); echo "</pre>"; $req1 = $bdd->prepare('SELECT DISTINCT idEquipe FROM equipe WHERE nom = ?'); $req1->execute(array($_SESSION["nom_equipe"])); $idEq = $req1->fetch(); $req = $bdd->prepare('INSERT INTO joueur(nom, email, idEquipe) VALUES(:nom, :email, :idEquipe)'); for($i = 0; $i < $_SESSION["nbrJoueurs"]; $i++){ $req = $bdd->prepare('INSERT INTO joueur(nom, email, idEquipe) VALUES(:nom, :email, :idEquipe)'); $req->execute(array( 'nom'=>$_POST["nomJoueurs"][$i], 'email'=>$_POST["emailJoueurs"][$i], 'idEquipe'=>intval($idEq) )); } ?> </form> </section> </body> </html>

Re: Array

Posté : 01 avr. 2021, 18:27
par Maitrepylos
Bonjour

dans votre formulaire pour l'ajout du nom de joueur, vous utilisez un name simple

Code : Tout sélectionner

name="nomJoueurs"
Vous devez créer un tableau de votre name, sinon seul le derniers inscrit sera visible dans le post

Code : Tout sélectionner

name='nomJoueurs[]'


Je vous laisse vous renseigner sur l'envoi de tableau des inputs :)

Re: Array

Posté : 01 avr. 2021, 21:30
par XaaE
Super ça fonctionne merci pour ta réponse. J'avais un parallèle un autre problème :
Lors d'un passage de données avec $_POST. Dans le fichier 1 je crée une liste déroulante qui affiche des données présente dans une BDD (un nom de tournois, et un ID de tournois). Je veux ensuite récupérer dans le fichier 2 l'ID du tournois correspondant au choix que l'utilisateur aura fait.

Et donc je ne comprends pas pourquoi dans le fichier 2, $_POST["id_du_tournois"] ne fonctionne pas et me renvoie une erreur "Incorrect integer value". J'ai donc utilisé la fonction intval() mais avec ça la valeur est toujours à 0.

Voici le fichier 1 :

Code : Tout sélectionner

<section> <?php ?> <h2>Informations à remplir pour inscrire votre équipe</h2> <form action="inscriptionEquipe2.php" method="POST"> <p><label>Nom de l'equipe : <input type="text" name="nomEquipe" /></label></p> <p><label>Adresse email du capitaine d'équipe : <input type="email" name="adresseEmail" /></label></p> <p><label>Niveau de l'équipe : <input type="number" name="nivEquipe" min=1 max=100 value=1 /></label></p> <p><label>Nombre de joueurs dans l'équipe : <input type="number" name="nbrJoueursEquipe" min=1 max=25 value=1 /></label></p> <?php $req0 = "SELECT idTournoi FROM tournois ORDER BY idTournoi DESC LIMIT 1"; $req2 = $bdd->prepare($req0); $req2->execute(); $maxId = $req2->fetch(); $maxId = $maxId['idTournoi']; echo (intval($maxId)); $req3 = $bdd->prepare('SELECT nom FROM tournois WHERE idTournoi = ?'); echo "<p><label>Nom du tournois où vous souhaitez inscrire votre équipe : "."</label>"; echo "<select name= \"id_du_tournois\" type=\"number\">"; for($i = 0; $i <= (intval($maxId)); $i++){ $req3->execute(array($i)); while($nomT = $req3->fetch()){ echo "<option value='".$i['idTournoi']."'>".$nomT['nom']." --> ID : ".$i."</option>"; } } echo " </select></p>"; echo"<p><input type=\"submit\" value=\"Etape suivante \" />"; ?> </form> </section>
et le fichier 2 (le même que celui de mon premier message) :

Code : Tout sélectionner

<section> <?php ?> <form action="inscriptionEquipe3.php" method="POST"> <?php if((!(empty($_POST["nomEquipe"]))) && (!(empty($_POST["adresseEmail"])))){ $id = (intval($_POST["id_du_tournois"])); echo $id; $req = $bdd->prepare('INSERT INTO equipe(nom, niveau, contact, idT) VALUES(:nom, :niveau, :contact, :idT)'); $req->execute(array( 'nom'=>$_POST["nomEquipe"], 'niveau'=>$_POST["nivEquipe"], 'contact'=>$_POST["adresseEmail"], 'idT'=>$id )); for ($i = 0; $i < $_POST["nbrJoueursEquipe"]; $i++){ echo "<p><label>Nom du joueur ".($i+1)." : "."<input type=\"text\" name='nomJoueurs[]' /></label> "; echo "<label>Email du joueur ".($i+1)." : "."<input type=\"email\" name='emailJoueurs[]' '/></label> "; echo "<select name=\"role\">"."<br />"; echo "<option value=\"capitaine d'equipe\">Capitaine d'équipe"; echo "<option value=\"joueur\">Joueur"; echo "</select></p>"; } echo"<p><input type=\"submit\" value=\"Etape suivante\" />"; } else{ echo "<p>Veuillez renseigner tous les champs de l'étape précédente</p>"; } ?> </form> </section>

Re: Array

Posté : 01 avr. 2021, 21:49
par or 1
echo "<option value='".$i['idTournoi']."'>".$nomT['nom']." --> ID : ".$i."</option>";

il faut regarder dans la source de la page, le code html généré par le php.

Re: Array

Posté : 01 avr. 2021, 22:57
par XaaE
Oui j’avais regardé et aux balises option il y avait la chaîne vide mais je comprends pas pourquoi

Re: Array

Posté : 01 avr. 2021, 23:06
par or 1
les 3 champs sont vides ? ou seulement le champ value ?

Re: Array

Posté : 01 avr. 2021, 23:33
par XaaE
Les trois champs options lorsqu’il y a 3 donnés dans ma BDD... j’utilise bien la bonne méthode pourtant non ?

Re: Array

Posté : 01 avr. 2021, 23:39
par or 1
echo "<option value='".$i['idTournoi']."'>".$nomT['nom']." --> ID : ".$i."</option>";
cette ligne affiche 3 variables. quel est le code html généré par l'exécution de ce code ?

Re: Array

Posté : 01 avr. 2021, 23:39
par XaaE
J’ai précisément ça :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<section>
<h2>Informations à remplir pour inscrire votre équipe</h2>
<form action="inscriptionEquipe2.php" method="POST">
<p><label>Nom de l'equipe : <input type="text" name="nomEquipe" /></label></p>
<p><label>Adresse email du capitaine d'équipe : <input type="email" name="adresseEmail" /></label></p>
<p><label>Niveau de l'équipe : <input type="number" name="nivEquipe" min=1 max=100 value=1 /></label></p>
<p><label>Nombre de joueurs dans l'équipe : <input type="number" name="nbrJoueursEquipe" min=1 max=25 value=1 /></label></p>
9<p><label>Nom du tournois où vous souhaitez inscrire votre équipe : </label><select name= "id_du_tournois"><br />
<b>Warning</b>: Trying to access array offset on value of type int in <b>/opt/lampp/htdocs/projetinfo/boostrap_test/inscriptionEquipe1.php</b> on line <b>58</b><br />
<option value=''>Montpellier's tournaments --> ID : 1</option><br />
<b>Warning</b>: Trying to access array offset on value of type int in <b>/opt/lampp/htdocs/projetinfo/boostrap_test/inscriptionEquipe1.php</b> on line <b>58</b><br />
<option value=''>tournoisTest --> ID : 5</option><br />
<b>Warning</b>: Trying to access array offset on value of type int in <b>/opt/lampp/htdocs/projetinfo/boostrap_test/inscriptionEquipe1.php</b> on line <b>58</b><br />
<option value=''>EURO2021 --> ID : 9</option> </select></p><p><input type="submit" value="Etape suivante " />
</form>
</section>

Re: Array

Posté : 02 avr. 2021, 10:05
par Maitrepylos
Bonjour, j'ai un peu réorganisé le code de la première partie pour que cela soit plus clair.
Et je pense avoir trouver cotre souci dans le select.
Dite moi si c'est cela que vous voulez obtenir

Code : Tout sélectionner

<section> <h2>Informations à remplir pour inscrire votre équipe</h2> <form action="inscriptionEquipe2.php" method="POST"> <p> <label>Nom de l'equipe : <input type="text" name="nomEquipe"/> </label> </p> <p> <label>Adresse email du capitaine d'équipe : <input type="email" name="adresseEmail"/> </label> </p> <p> <label>Niveau de l'équipe : <input type="number" name="nivEquipe" min=1 max=100 value=1/> </label> </p> <p> <label>Nombre de joueurs dans l'équipe : <input type="number" name="nbrJoueursEquipe" min=1 max=25 value=1/> </label> </p> <?php $req0 = "SELECT idTournoi FROM tournois ORDER BY idTournoi DESC LIMIT 1"; $req2 = $bdd->prepare($req0); $req2->execute(); $maxId = $req2->fetch(); $maxId = $maxId['idTournoi']; echo((int)$maxId); $req3 = $bdd->prepare('SELECT nom FROM tournois WHERE idTournoi = ?'); ?> <p> <label>Nom du tournois où vous souhaitez inscrire votre équipe : " . "</label>"; <select name="id_du_tournois" type="number"> <?php for ($i = 0; $i <= $maxId; $i++): ?> <?php $req3->execute(array($i)) ?> <?php while ($nomT = $req3->fetch()): ?> <option value='<?php echo $i ?>'> <?php echo $nomT['nom'] ?> --> ID : <?php echo $i ?></option> <?php endwhile; ?> <?php endfor ?> </select> </p> <p> <input type="submit" value="Etape suivante" /> </form> </section>

Re: Array

Posté : 02 avr. 2021, 11:01
par XaaE
Bonjour, c'est exactement ça merci beaucoup ! Quelle était mon erreur ? En tout cas, vous m'avez enlevé une sacré épine du pied ;)

Re: Array

Posté : 02 avr. 2021, 11:10
par XaaE
Juste avec ton code les champs qui doivent être préremplies avec des 1 sont vides, alors que tu as mis value=1, c'est bizarre non ?

Re: Array

Posté : 02 avr. 2021, 13:07
par or 1
Quelle était mon erreur ?
le code html demandé le dit :
<b>Warning</b>: Trying to access array offset on value of type int in <b>/opt/lampp/htdocs/projetinfo/boostrap_test/inscriptionEquipe1.php</b> on line <b>58</b><br />
<option value=''>tournoisTest --> ID : 5</option>
En tout cas, vous m'avez enlevé une sacré épine du pied ;)
l'id du tournoisTest est bien 5 ? si ce n'est pas le cas, alors, cela ne fonctionne pas.

Re: Array

Posté : 02 avr. 2021, 13:33
par Maitrepylos
Bonjour, Alors le code n'est toujours pas exempt d'erreur , car je n'ai pas tout le contexte.
Mais ton erreur se situais ici :

Code : Tout sélectionner

$i['idTournoi']
$i est une variable qui est incrémenté dans une boucle for et non pas un parcours de tableau, du coup seul $i contient une valeur numérique.

Bon là je prend ma casquette de formateur :)

Ici, vous faite la requête suivante :

Code : Tout sélectionner

$req0 = "SELECT idTournoi FROM tournois ORDER BY idTournoi DESC LIMIT 1";
C'est à dire que vous allez rechercher l'id le plus grand et j'imagine même que cet id est autoincrémenté dans votre db ?

En suite vous réalisez une boucle pour définir l'ensemble des id que vous passerez dans une autre requête et vous faites donc un menu déroulant.

La requête préparé (bonne habitude :) )

Code : Tout sélectionner

$req3 = $bdd->prepare('SELECT nom FROM tournois WHERE idTournoi = ?');
ensuite vous faites la boucle

Code : Tout sélectionner

<select name="id_du_tournois" type="number"> <?php for ($i = 0; $i <= $maxId; $i++): ?> <?php $req3->execute(array($i)) ?> <?php while ($nomT = $req3->fetch()): ?> <option value='<?php echo $i ?>'> <?php echo $nomT['nom'] ?> --> ID : <?php echo $i ?></option> <?php endwhile; ?> <?php endfor ?> </select>
Ici se pose plusieurs souci de conceptualisation.

1 : vous faites un for de zéro à <= du plus grand id retrouvé que vous mettez dans la variable $i
Du coup votre requête préparé va être testé avec un idTournoi = 0 , ce qui n'est pas possible.
2 : vous partez du constat que le plus grand id en faisant un décompte, vous allez retrouvé tout les id, je dirais oui, à condition de n'avoir jamais supprimé de tournoi !
Je m'explique, imaginons que vous 5 tournois dans db :

1 tournois1
2 tournois2
3 tournois3
4 tournois4
5 tournois5

Dans votre code vous sélectionnez le plus grand id (5) puis vous faites un for de 0 à 5, donc votre menu sera :
0 1 2 3 4 5
imaginons que nous supprimons le tournoi 2 et 4 et qu'on rajoute 1 tournoi (en autoincrément on ne remplace pas les places vides)
nous aurions alors :
1 tournois1
3 tournois3
5 tournois5
6 tournois6

Votre boucle va donner 0 1 2 3 4 5 6 et ce même si 0 2 4 n'existe pas dans la db.

Il faudrait alors aller rechercher tout les id et pas seulement le plus grand id.

3 : vous aller créer des id à la volée, pour aller rechercher les tournois dans la même table ?????
Pourquoi ne pas le faire en une seule passe sans faire toutes vos requêtes.
Voici POUR MOI, une solution plus viable et cohérente de ce que je comprend, à ce que vous essayez de faire :

Code : Tout sélectionner

<section> <h2>Informations à remplir pour inscrire votre équipe</h2> <form action="inscriptionEquipe2.php" method="POST"> <p> <label>Nom de l'equipe : <input type="text" name="nomEquipe"/> </label> </p> <p> <label>Adresse email du capitaine d'équipe : <input type="email" name="adresseEmail"/> </label> </p> <p> <label>Niveau de l'équipe : <input type="number" name="nivEquipe" min=1 max=100 value=1/> </label> </p> <p> <label>Nombre de joueurs dans l'équipe : <input type="number" name="nbrJoueursEquipe" min=1 max=25 value=1/> </label> </p> <?php $req3 = $bdd->prepare('SELECT idTournoi,nom FROM tournois'); $req3->execute(); $tournois = $req3->fetchAll(PDO::FETCH_ASSOC); ?> <p> <label>Nom du tournois où vous souhaitez inscrire votre équipe : " . "</label>"; <select name="id_du_tournois" type="number"> <?php foreach ($tournois as $tournoi): ?> <option value='<?php echo $tournoi['idTournoi'] ?>'> <?php echo $tournoi['nom'] ?> --> ID : <?php echo $tournoi['idTournoi'] ?></option> <?php endforeach ?> </p> <p> <input type="submit" value="Etape suivante" /> </form> </section>

Re: Array

Posté : 02 avr. 2021, 14:55
par XaaE
Effectivement l'idTournois est auto incrémenté dans la DB. Je mettais fait la même réflexion pour la boucle, si comme vous l'avez dit nous avons des "trous" d'ID dans la BDD, cela devrait poser problème. Et pourtant, en pratique, avec 3 tournois qui ont pour ID respectivement 1, 5 et 9, la liste déroulante affiche bien que 3 tournois avec les bons ID. Peut être qu'une ligne vide dans la BDD n'est pas prise en compte dans la boucle for ? J'avais aussi une question sur votre syntaxe, il me semble que vous utilisez des ":" à la place des accolades pour les boucles non ? Comme fonctionne exactement cette syntaxe car je ne l'ai vu nul part ailleurs ?