Bonjour à tous !
Il se peut que le problème soit sql et nom php. Néanmoins, je post ici car je pense que ça regarde plutôt le php.
Je dois pour un concours afficher la note de chaque juré donné a chaque participant. Tableau de la forme suivant :
Jure1 Jure2 Jure3
Part1 x x x
Part2 x x x
Part3 x x x
Part4 x x x
Les 'x' étant des notes ^^
Evidemment le nombre de juré et de participant est variable !
De plus il est possible que la note ne soit pas (encore) donnée.
Au niveau HTML je me suis basé sur un tableau tout simple.
Par une première requête j'ai trouvé les jurés (dans un array). Puis..
$jury = implode($req, '</TH><TH>');
Première ligne du tableau faite !
Le soucis est qu'ensuite, je n'arrive pas a afficher les notes correctement.
La requete est la suivante :
$sql = "SELECT nom, jure, note FROM participant LEFT JOIN notes ON participant.nom = notes.participant
WHERE notes.edition = '$ed' AND participant.edition = '$ed' ORDER BY nom ASC"
// $ed, vous l'aurez compris est l'édition du concours.
Cette requête me retourne donc un beau tableau :
Array (
[0] => Array ( [nom] => Part1 [jure] => Jure1 [note] => 3 )
[1] => Array ( [nom] => Part2 [jure] => Jure1 [note] => 6 )
[2] => Array ( [nom] => Part1 [jure] => Jure2 [note] => 6.9 )
....); // et tout ca dans le désordre !
Ma Question est donc : Comment afficher proprement les notes dans le tableau, même si elle sont inexistante ? :)
Je reste a votre entiere disposition pour n'importe qu'elle précision (meme si je pense avoir fait le tour).
Je suggère de changer le tableau :
Array( [0] => Array( [nom] => Part1 [note] => Array([1] => 3 [2] => 6.9 [3] => ))//jure 3 pas de note attribuée
[1] => Array( [nom] => Part1 [note] => Array([1] => 6 [2] => [3]=> ))
...]);
Possible ?
Merci ENORMEMENT :D
Ps: Les deux tableaux :
'notes' = edition jure participant note
'participant' = edition nom
SOLUTION TROUVEE !!!!!!!!!!!! :) :) :)
Petite explication pour les curieux :
$sql1 = $pdo->query("SELECT nom FROM site_gybs_participant WHERE edition = '$ed' ORDER BY nom ASC");
$Parts = $sql1->fetchAll(PDO::FETCH_ASSOC);
$sql2 = $pdo->query("SELECT nom FROM site_gybs_jury WHERE edition = '$ed' ORDER BY nom ASC");
$Jury = $sql2->fetchAll(PDO::FETCH_ASSOC);
$tab = array();
foreach($Parts as $P => $Part){
$participant = $Parts$P]'nom'];
echo "<tr><th height=\"25\" ALIGN=\"CENTER\" VALIGN=\"MIDDLE\">".$participant."</th>";
foreach($Jury as $J => $Jure){
$jure = $Jury$J]'nom'];
$sql = $pdo->query("SELECT note FROM site_gybs_notes WHERE edition = '$ed' AND participant = '".$participant."' AND jure = '".$jure."'");
$tab$participant]$jure] = $sql->fetchAll(PDO::FETCH_ASSOC);
echo "<td height=\"25\" width=\"".$width."\" ALIGN=\"CENTER\" VALIGN=\"MIDDLE\">".$tab$participant]$jure][0]'note']."</td>";
}
}
A l'aide de mes tableaux sql, j'ai restructuré un array plus logique sous la forme
Participant > Juré > Note
Et ensuite on affiche.
De sorte que si la requête ne retourne rien. ce n'est pas important ^^
En revanche je n'ai pas développé un système pour afficher "à venir" (ou un truc du type). Mais je pense qu'en remplaçant "$tab$participant]$jure][0]'note']" dans :
echo "<td height=\"25\" width=\"".$width."\" ALIGN=\"CENTER\" VALIGN=\"MIDDLE\">".$tab$participant]$jure][0]'note']."</td>";
..par..
if($tab$participant]$jure][0]'note'] == ""){
echo "à venir";
}else{
echo $tab$participant]$jure][0]'note'];
}
Merci à tous pour votre aide !
Love et paix aux Codeurs !
Hello !
Je te conseille de découper ça le plus possible.
Chaque table dans ta bdd doit avoir une seule fonctionnalité.
Par exemple, une table "voiture" doit gérer tout ce qui concerne une voiture, on s'en fout de savoir combien de roues à un camion.
Ici tu devrais essayer de faire de la même sorte.
C'est pourquoi je te propose d'avoir plusieurs tables, donc voici les noms avec leurs champs :
-juré (id, nom)
-participants (id, nom, prenom, sexe ...)
-note (id, note, idParticipant, idJuré)
En français ça donne ça :
un juré attribut une note et cette note concerne un partipant
un participant a plusieurs notes venant de plusieurs jurés
Au niveau de tes requêtes, quelque chose comme ça devrait faire l'affaire :
SELECT nomJure, nomParticipant, note
FROM jures, participants, notes
WHERE jures.idJure = notes.idJure
AND participants.idParticipants = notes.idParticipants
J'ai aussi cette troisieme table 'juré' mais je n'ai pas attribué d'id. Ce n'est pas important si je remplace
Jures.idjure = notes.idjure
Par
Jure.nom = notes.jure
?
Mais vrai question ensuite c'est comment traiter la requête ?!
Merci pour ton aide, et ton temps. :)
Alors, c'est vrai que ton tableau est un peu spécifique.
Pour ta première ligne, la liste des jurés, tu peux faire un "select nom from jures order by idJure" et tu affiches les noms.
Après, j'ai pensé que les participants, tu pourrait les afficher un à un.
Tu peux déjà faire un "select * from participants" pour récupérer tout les participants.
Après, tu boucle dessus (foreach) et pour chaque participant, tu vas chercher les notes en base avec ce type de requête :
SELECT jures.nom as "jury" , note , participants.nom as "participant"
from jures
LEFT OUTER JOIN notes ON jures.idJure=notes.idJure
LEFT OUTER JOIN participants ON participants.idParticipant = notes.idParticipant
WHERE participants.idParticipant = "1"
ORDER BY participants.idParticipant, jures.idJure ASC
Mais bon, il faut que chaque juré ait noté le participant. Pour ton cas, j'ai beau cherché, je ne trouve pas d'autres réponses.
Tu veux afficher les résultats des notes avant même que les jurés aient finis de noter.
Or, les tables se présentant comme ceci :
jurés ----- notes ----- participants
il n'y a aucun lien entre jurés et participant. Du coup le premier outer join fonctionne, mais le deuxième non et la requête ne retourne que les notes remplies pour un participants. Et même si tu met le champ jurée dans notes, tu ne pourras pas afficher le nom du jury avec le nom du participant sans la note parce que tu n'auras pas fait d'insertion dans la table note.
@Coloo
3 tables :
'jury' = edition nom //nom du juré
'notes' = edition jure participant note
'participant' = edition id nom //nom du participant
@Pewel : Je croyais que faire des requetes dans des requetes n'était pas du tout conseillé..
Parce que dans ce cas je pense avoir une solution !
Tu veux afficher les résultats des notes avant même que les jurés aient finis de noter.
N'y a t-il pas moyen de retourner une valeur par défaut si la requete de retourne rien ?
imaginons que le Jure2 n'ait pas encore noté le Part2 :
La requete que tu as écrit plus haut retourne donc aucun résultat. Dans ce cas on ne peut pas faire :
if($sql == array()){ //ou un truc plus plausible il faut voir ce que la requête retourne..
echo '<TD>..</TD>'
}
Pour moi il manque un id pour le jury et donc un jury_id dans les notes
Bon je vais juste donner mon idée
1 je recupère les id des jury
foreach (jurys as jury)
$tabJury'id']$i]=$jury'id'];
$tabJury'nom']$i]=$jury'nom'];
i++;
2 Je récupère les id et nom des participants
foreach blaba
$tab...
3 Je récupère dans la table note > jury_id,notes,participant_id
foreach blaba
$tab...
4 création de la première ligne
echo "<table><tr><td></td>"
for($v=0, $v>$i, $v++) {
echo "<td>".$tabJury'nom']$v]."</td>;}
echo "</tr>"
5 les lignes
for($v=0, $v>$ipartipants, $v++) {
echo "<tr><td>".$tabParticipant'nom']$v]."</td>;
for($t=0, $t>$i, $t++) {
if($tabNotes'jury_id']$t]==$tabJury'id']$v])
{
echo "<td>".$tabNotes'note']$t]."</td>";
}
}
echo "</tr>";
}
echo "</table>"
Voilà comment je procéderais ^^'
Ok, c'est tres jolie ^^
Mais c'est pas bon xD
J'ai corrigé quelques coquilles notamment au niveau de l'affichage ou tu appelles "$tabParts'jury_id']" qui n'existe pas puisque dans ce tableau il n'y a que les participants au concours. C'est plutot "$tabNotes'jury_id']" non ?
Ensuite je pense que ca ne répond pas aux attentes.
$tabParts'nom']$v] == $tabNotes'participant']$t]
..est une meilleure condition non ? :/
Enfin je pense qu'il faut une seconde condition.
On a cherché les notes attribuées aux joueurs. Maintenant il faudrait les classer par ordre de jury.
Et là je plante. ^^
En tout cas merci à vous deux pour votre aide vraiment précieuse ! :D
Pour le moment j'obtiens ce résultat
Tout est correct si et seulement tous les jurés ont noté chaque participant.
Je n'ai pas mis l'idée jury car il faut que je change tous les fichier de notations (flemme).
Mais si réellement cela change quelque chose de passer par l'id plutôt que par le nom. Je veux bien prendre le temps :)
J'ai pensé à une solution qui fonctionnerai peu importe si les tableaux sont remplis ou non.
Tout ce qu'il faut c'est un tableau mieux structuré.
De sorte que les résultat se récupere comme suit :
$tab[Part][Jure][Note]
Est-il possible de créer un tel tableau avec ce que l'on a ?
Je prendrais un peu de temps ce soir... Pour voir les dites coquilles que j'ai pu faire par manque de temps.
Donc là, tu n'as que la ligne du jury ?
Tout est bon sauf le fait que bah ce que tous craignaient : quand le juré n'a pas remplis, les résultats du tableaux ne sont pas en bonne position.
Je suis en train de créer un tableau plus adapté.
Les résultats seront plus simple à afficher, meme si la requete ne retourne rien. :
<?php echo '<td>'.$tab$part]$jure]$note].'</td>'; ?>
Il ne me manque qu'a créer ce tableau x)
..Et là.. une nouvelle fois : je sèche :D
pourquoi ne met tu pas une condition? genre si la ligne ne retourne pas de résultat tu fais un echo "à venir" par exemple
Si je fais cela, les résultat des lignes suivantes vont etre décalée.
Exemple : imaginons deux jurés et deux candidats !
et mettons en hypothèse que le juré1 ait noté les deux quandidats mais le Juré2 aucun :
Juré1 Juré2
Part1 x à venir
Part2 à venir x
Le résultat "Part1-Jure1-Note" existe et correspond au résultat souhaité pour la premiere ligne.
En seconde ligne : "Part1-Jure1-Note" existe et ne correspond pas au résultat souhaité donc "a venir"
"Part2-Jure1-Note" existe et correspond au résultat souhaité. Mais il vient apres le précedant. Donc il est décalé!
Tu peux nous mettre ton dernier code ? Ca nous permettra de voir l'avancé
edit de mon code pour les anomalies =')... enfin de base, c'était pour donner une idée ^^'
Voici mon code actuel :
résultat
<?php
$sql1 = $pdo->query("SELECT nom, id FROM site_gybs_jury WHERE edition = '$ed' ORDER BY nom ASC");
$jury = $sql1->fetchAll(PDO::FETCH_ASSOC);
$i=0;
foreach ($jury as $jure){
$tabJury'id']$i]=$jure'id'];
$tabJury'nom']$i]=$jure'nom'];
$i++; }
print_r($tabJury);
echo '<br/><br/>';
$sql2 = $pdo->query("SELECT nom, id FROM site_gybs_participant WHERE edition = '$ed' ORDER BY nom ASC");
$parts = $sql2->fetchAll(PDO::FETCH_ASSOC);
$j=0;
foreach ($parts as $part){
$tabParts'id']$j] = $part'id'];
$tabParts'nom']$j] = $part'nom'];
$j++; }
print_r($tabParts);
echo '<br/><br/>';
$sql3 = $pdo->query("SELECT participant, jure, note FROM site_gybs_notes WHERE edition = '$ed' ORDER BY participant, jure ASC");
$notes = $sql3->fetchAll(PDO::FETCH_ASSOC);
$k=0;
foreach ($notes as $note){
$tabNotes'participant']$k] = $note'participant'];
$tabNotes'jure']$k] = $note'jure'];
$tabNotes'note']$k] = $note'note'];
$k++; }
print_r($tabNotes);
for($v = 0; $v <= $j; $v++){
echo "<tr><th height=\"25\" ALIGN=\"CENTER\" VALIGN=\"MIDDLE\">".$tabParts'nom']$v]."</th>";
for($t = 0; $t <= $j; $t++){
if($tabParts'nom']$v] == $tabNotes'participant']$t]){
echo "<td height=\"25\" width=\"".$width."\" ALIGN=\"CENTER\" VALIGN=\"MIDDLE\">".$tabNotes'note']$t]."</td>";
}
}
}
?>
Autant pour moi, j'ai pas enlever les vérification de session!
Ce doit être bon maintenant :)