Array

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Array

Re: Array

par XaaE » 03 avr. 2021, 17:18

Merci infiniment pour votre aide :D

Re: Array

par Ryle » 02 avr. 2021, 18:32

En complément de la réponse de Maitrepylos, pour ce qui est de ta base de données, la requête SQL qui te permet de récupérer les enregistrements qu'elle contient se contente de te retourner les enregistrements qu'elle contient :)

Elle ne se soucie pas de savoir s'il y a des "trous" dans une éventuelle numérotation qui d'un point de vue métier pourrait te sembler incohérente. Il y a trois valeur à retourner, elle te retourne les 3 valeurs telles qu'elle les a trouver, à toi d'en faire bon usage ;)

Re: Array

par Maitrepylos » 02 avr. 2021, 16:59

Bonjour,
Le remplacement des : par des accolades, c'est une possibilité offerte par PHP, on l'utilise surtout dans les vue HTML, cela évite incompréhension des accolades, mélangés avec des balises html. Mais c'est standard en PHP

Re: Array

par XaaE » 02 avr. 2021, 14:55

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 ?

Re: Array

par Maitrepylos » 02 avr. 2021, 13:33

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

par or 1 » 02 avr. 2021, 13:07

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

par XaaE » 02 avr. 2021, 11:10

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

par XaaE » 02 avr. 2021, 11:01

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

par Maitrepylos » 02 avr. 2021, 10:05

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

par XaaE » 01 avr. 2021, 23:39

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

par or 1 » 01 avr. 2021, 23:39

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

par XaaE » 01 avr. 2021, 23:33

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

par or 1 » 01 avr. 2021, 23:06

les 3 champs sont vides ? ou seulement le champ value ?

Re: Array

par XaaE » 01 avr. 2021, 22:57

Oui j’avais regardé et aux balises option il y avait la chaîne vide mais je comprends pas pourquoi

Re: Array

par or 1 » 01 avr. 2021, 21:49

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.