Affichage impossible des données de BDD obtenu par Jointure
jordane45 Messages postés 30426 Date d'inscription Statut Modérateur Dernière intervention -
Les données sont contenus dans 3 tables qui sont lié: Table Matière + Note + Moyenne
j'ai fait la Jointure entre ces differentes table voici le code:
<?php
//début de ton fichier php .... ça veut dire .. DEBUT !!!:
error_reporting ( E_ALL );
ini_set ( 'display_errors', TRUE );
ini_set ( 'display_startup_errors', TRUE );
$nom = !empty ( $_GET['nom'] ) ? $_GET['nom'] : NULL;
$prenom = !empty ( $_GET['prenom'] ) ? $_GET['prenom'] : NULL;
$cycle = !empty ( $_GET['cycle'] ) ? $_GET['cycle'] : NULL;
$ideleve = !empty ( $_GET['ideleve'] ) ? $_GET['ideleve'] : NULL;
$typenote1 = 'Note de devoir';
$typenote2 = 'Note d'examen';
$typenote3 = '1e seule note';
//Recherche les notes que des devoir et les moyennes de matière de classe
$sql = "SELECT N.* , M.*
FROM note N
LEFT JOIN moyenne M ON M.ideleve = N.ideleve2
WHERE N.typenote = ? AND N.ideleve2 = ?";
$datas = array($ideleve, $typenote1);
try {
$req = $bdd->prepare($sql);
$req->execute($datas);
$donnees = $req->fetchAll(); //on stocke le resultat de la requete dans un ARRAY
} catch(Exception $e){
die('Erreur : '.$e->getMessage());
}
//Recherche des matières et rien que les notes d'examen
$sql1 = "SELECT T.* , A.*
FROM note T
LEFT JOIN matiere A ON A.idmat = T.idmat
WHERE T.typenote = ? AND T.ideleve2 = ?";
$data = array($ideleve, $typenote2);
try {
$req1 = $bdd->prepare($sql1);
$req1->execute($data);
$don = $req1->fetchAll(); //on stocke le resultat de la requete dans un ARRAY
} catch(Exception $e){
die('Erreur : '.$e->getMessage());
}
// Trouver Le Nombre total des notes de devoir
$sql2 = 'SELECT max(notemat) FROM note WHERE typenote = ?';
try {
$req1 = $bdd->prepare ( $sql2 );
$req1->execute (array($typenote1));
$result = $req1->fetchColumn ();
$id = $result;
}
?>
Voici le code PHP où doit s'afficher les resultats de mes réquêtes
.
<table >
<thead>
<?php
//|| ($don['cycle']='LYCÉE TECHNIQUE')
echo '<tr>';
echo '<th>'; echo '<strong>#</strong>'; echo '</th>';
echo '<th>'; echo '<strong>Matière</strong>'; echo '</th>';
echo '<th colspan="';?> <?php echo $id;?> <?php echo ' ">'; echo '<strong>Note de classe</strong>'; echo '</th>';
echo '<th>'; echo '<strong>Note de composition</strong>'; echo '</th>';
echo '<th>'; echo '<strong>Moyenne(matière)</strong>'; echo '</th>';
echo '</tr>';
?>
</thead>
<tbody>
<?php
if(!empty($donnees)){
foreach($donnees as $j=>$D){
echo '<tr>';
echo '<td>' .$j .'</td>';
echo '<td>'.$D['nomat']. '</td>';
while($don) { echo '<td>'.$don['notemat'].'</td>'; }
echo '<td>'.$D['notemat'].'</td>';
echo '<td>'.$D['moyen'].'</td>';
echo '</tr>';
}
}
?>
</tbody>
</table>
Le problème que j'ai est que lorsque je lance l'execution les données de ma BDD ne s'affiche et je n'ai pas un retour d'erreur
SVP Quelqu'un peut-il m'aider pour afficher à bien les données de ma BDD?
5 réponses
Le problème porte sur l’affichage dans un tableau des matières, des notes de devoir et des moyennes liées par des jointures entre Matière, Note et Moyenne, sans que les données s’affichent.
Plusieurs répondants proposent de regrouper les résultats en deux fonctions, puis de construire des tableaux associatifs où chaque matière pointe ses notes et sa moyenne.
En cas de données manquantes ou de non-retour, il est recommandé d’activer l’affichage d’erreurs et de tester chaque requête séparément, puis d’utiliser print_r ou var_dump pour diagnostiquer les arrays retournés.
Certains mettent en garde contre les boucles imbriquées et suggèrent de vérifier les noms de colonnes comme nomat, idmat et notemat pour éviter les décalages d’affichage.
-
Bonjour,
Tu poses ta question dans le forum mysql ... c'est donc ton souci concerne les requêtes et le code PHP ne nous servira donc à rien..
Donc...
Pour commencer...
As tu testé tes différentes requêtes DIRECTEMENT dans ta bdd ( via phpmyadmin par exemple ou en lignes de commandes ) ?
Qu'est-ce qu'elles t'affichent ?
Les données sembles bonnes ?
-
-
Mon code PHP ne met signal aucune erreur, d'où je sais pas pourquoi ça n'affiche pas les resultats de ma BDD, du coup je me dit que c'est peut être la requête qui a un souci
- As tu lu la réponse données par JEE PEE ??????
Tu utilises de requêtes préparées ... avec des points d'interrogations.WHERE T.typenote = ? AND T.ideleve2 = ?";
Ces "?" correspondent aux variables que tu veux utiliser dans ta requête via ton array datas$data = array($ideleve, $typenote2);
L'ordre des variables que tu places dans cet array doit correspondre à l'ordre que ces variables ont dans ta requête...
Hors.... je doute fortement que tu veuilles utiliser le $ideleve pour le typenote ... et le $typenote pour le ideleve2
Ce n'est pourtant pas compliqué à comprendre.....
Même jee pee qui ne fait pas de php/mysql a sû voir où se trouvait le problème dès que tu as posté ta question...
Faut que tu fasses des efforts de compréhension et surtout que tu saches relire ton code en prenant du recul pour détecter ce genre d'erreur.
-
-
-
Bonjour,
Je ne fais toujours pas de php ou mysql ;-) mais il me semble bizarre en 40 et 43 que les 2 champs ne soient pas dans le même ordre. Idem en 22 25
-
Bonjour, ça a marché Merci BEAUCOUP, il affiche maintenant les résultats
j'ai rencontre juste un problème au niveau du tableau
<table > <thead> <?php //|| ($don['cycle']='LYCÉE TECHNIQUE') echo '<tr>'; echo '<th>'; echo '<strong>#</strong>'; echo '</th>'; echo '<th>'; echo '<strong>Matière</strong>'; echo '</th>'; echo '<th colspan="';?> <?php echo $id;?> <?php echo ' ">'; echo '<strong>Note d'évaluation</strong>'; echo '</th>'; echo '<th>'; echo '<strong>Note d'exam</strong>'; echo '</th>'; echo '<th>'; echo '<strong>Moyenne(matière)</strong>'; echo '</th>'; echo '</tr>'; ?> </thead> <tbody> <?php if(!empty($donnees)){ foreach($donnees as $j=>$D){ echo '<tr>'; echo '<td>' .$j .'</td>'; echo '<td>'.$D['nomat']. '</td>'; while($donnees) { foreach($don as $d=>$P){ echo '<td>'.$P['notemat'].'</td>'; } } // à ce niveau echo '<td>'.$D['notemat'].'</td>'; echo '<td>'.$D['moyen'].'</td>'; echo '</tr>'; } } ?> </tbody> </table>
en faite il ya plusieur note d'évaluation et jai envi que ces note s'affiche dynamiquement à la colonne " Note d'évaluation" voilà pourquoi j'ai utilisé Colspan au niveau de l'ent-tête.
Mais lorsque j'ai exécuté le code, j'ai l'impression que mon affichage s'est bloqué au niveau de la boucle while
while($donnees) { foreach($don as $d=>$P){ echo '<td>'.$P['notemat'].'</td>'; } } // à ce niveau
et du coup les autres resultats ne s'affiche pas,
Quelqu'un pourrai t-il m'aidé SVP?-
-
J'ai enlévé le while, cette fois-ci toutes les matières s'affiche mais juste qu'au des notes d'évalution il ya un affichage discontinue à tel point qu'il ya debordement de la taille du tableau , il devait normalement affiché que 3 ou 4 case de notes d'évalution puis afficher les autres notes
voici le code PHP :
<table > <thead> <?php //|| ($don['cycle']='LYCÉE TECHNIQUE') echo '<tr>'; echo '<th>'; echo '<strong>#</strong>'; echo '</th>'; echo '<th>'; echo '<strong>Matière</strong>'; echo '</th>'; echo '<th colspan="';?> <?php echo $id;?> <?php echo ' ">'; echo '<strong>Note d'évaluation</strong>'; echo '</th>'; echo '<th>'; echo '<strong>Note d'Exam </strong>'; echo '</th>'; echo '<th>'; echo '<strong>Moyenne(matière)</strong>'; echo '</th>'; echo '</tr>'; ?> </thead> <tbody> <?php if(!empty($don)){ foreach($don as $j=>$D){ echo '<tr>'; echo '<td>' .$j .'</td>'; echo '<td>'.$D['nomat']. '</td>'; foreach($donnees as $d=>$P){ echo '<td>'.$P['notemat'].'</td>'; } echo '<td>'.$D['notemat'].'</td>'; echo '<td>'.$donnees['moyen'].'</td>'; echo '</tr>'; } } ?> </tbody> </table> -
Normal... vu que tu boucles sur toutes les notes.... sans te préocuper dans quelle matière tu es.
Il faut donc, soit avec un IF pour gérer sur tu te trouves dans la matières à afficher...
Soit, retravailler l'array en amont afin que sa structure soit plus simples à manipuler.
Un truc du genre
$sql = "SELECT N.* , M.* FROM note N LEFT JOIN matiere M ON M.idmat = N.idmat WHERE N.typenote = ? AND N.ideleve2 = ?"; $data = array($typenote,$ideleve); try { $req = $bdd->prepare($sql); $req->execute($data); $arrTmp = $req->fetchAll(); //on stocke le resultat de la requete dans un ARRAY } catch(Exception $e){ die('Erreur : '.$e->getMessage()); } //On retravaille l'array $arrNotes = array(); if(!empty($arrTmp)){ foreach($arrTmp as $N){ $arrNotes[$N['nomat']][] = $N['notemat']; } }
//Puis dans la boucle d'affichageif(!empty($don)){ foreach($don as $j=>$D){ echo '<tr>'; echo '<td>' .$j .'</td>'; echo '<td>'.$D['nomat']. '</td>'; if(!empty($arrNotes[$D['nomat']])){ foreach($arrNotes[$D['nomat']] as $d=>$P){ echo '<td>'.$P.'</td>'; } } echo '<td>'.$donnees['moyen'].'</td>'; echo '</tr>'; } } -
Quand j'essaie avec ton compte on me signale '' Notice: Undefined index: nomat in /Applications/MAMP/htdocs/kela/note2.php on line ''
excuse moi Pourquoi tu as fait
$arrNotes[$N['nomat']][] = $N['notemat'];
je ne comprend pas
sachant que nomat: cè la table des noms des matières
et notemat: cè la table qui contient la valeur des notes -
-
-
Bon... reprenons...
Montres nous ton code actuel (complet ! )
Normalement, tu devrais y avoir une requête de la forme (vu le précédent message : https://forums.commentcamarche.net/forum/affich-36347406-affichage-impossible-des-donnees-de-bdd-obtenu-par-jointure#10 )
$sql = "SELECT N.* , M.* FROM note N LEFT JOIN matiere M ON M.idmat = N.idmat WHERE N.typenote = ? AND N.ideleve = ?"; $data = array($typenote,$ideleve); try { $req = $bdd->prepare($sql); $req->execute($data); $arrTmp = $req->fetchAll(); //on stocke le resultat de la requete dans un ARRAY } catch(Exception $e){ die('Erreur : '.$e->getMessage()); } //le temps des tests : echo "<pre>"; print_r($arrTmp); echo "</pre>"; //On retravaille l'array $arrNotes = array(); if(!empty($arrTmp)){ foreach($arrTmp as $N){ // on créé un tableau, qui pour chaque matière, associe la ou les notes correspondantes $arrNotes[$N['nomat']][] = $N['notemat']; } } //le temps des tests : echo "<pre>"; print_r($arrNotes); echo "</pre>";
Au passage, merci de vérifier que la requête fonctionne directement en BDD ( fais en nous une capture écran stp )
Bien entendu.. si la requête n'affiche rien directement en BDD;... commence par la corriger. ça ne sert à rien de continuer le code php tant que ce point ne sera pas résolu !
-
-
-
il affiche les valeurs mais ne s'affiche pas sur le tableau qui est en bas
voici le code de l'affichage du tableau
<table > <thead> <?php echo '<tr>'; echo '<th>'; echo '<strong>#</strong>'; echo '</th>'; echo '<th>'; echo '<strong>Matière</strong>'; echo '</th>'; echo '<th colspan="';?> <?php echo $id;?> <?php echo ' ">'; echo '<strong>Note de classe</strong>'; echo '</th>'; echo '<th>'; echo '<strong>Note de composition</strong>'; echo '</th>'; echo '<th>'; echo '<strong>Moyenne(matière)</strong>'; echo '</th>'; echo '</tr>'; ?> </thead> <tbody> <?php if(!empty($don)){ foreach($don as $j=>$D){ echo '<tr>'; echo '<td>' .$j .'</td>'; echo '<td>'.$D['nomat']. '</td>'; if(!empty($arrNotes[$D['nomat']])){ foreach($arrNotes[$D['nomat']] as $d=>$P){ echo '<td>'.$P.'</td>'; } } echo '<td>'.$donnees['moyen'].'</td>'; echo '</tr>'; } } ?> </tbody> </table> -
-
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Teste ça et dis moi ce que ça donne
<?php //début de ton fichier php .... ça veut dire .. DEBUT !!!: error_reporting ( E_ALL ); ini_set ( 'display_errors', TRUE ); ini_set ( 'display_startup_errors', TRUE ); $nom = !empty ( $_GET['nom'] ) ? $_GET['nom'] : NULL; $prenom = !empty ( $_GET['prenom'] ) ? $_GET['prenom'] : NULL; $cycle = !empty ( $_GET['cycle'] ) ? $_GET['cycle'] : NULL; $ideleve = !empty ( $_GET['ideleve'] ) ? $_GET['ideleve'] : NULL; $typenote1 = 'Note de devoir'; $typenote2 = 'Note de composition'; $typenote3 = '1e seule note'; function getMoyenneByMatieresForEleve($ideleve){ global $bdd; $sql = "SELECT MO.moyen as MOYENNEELEVE, MA.* FROM matiere MA LEFT JOIN moyenne MO ON MA.idmat = MO.idmat WHERE MO.ideleve = ?"; $datas = array($ideleve); try { $req = $bdd->prepare($sql); $req->execute($datas); $donnees = $req->fetchAll(); //on stocke le resultat de la requete dans un ARRAY } catch(Exception $e){ die('Erreur : '.$e->getMessage()); } return $donnees; } function getAllNotesByMatieresForEleve($ideleve){ global $bdd; $sql = "SELECT N.* , M.* FROM note N LEFT JOIN matiere M ON M.idmat = N.idmat WHERE N.ideleve = ?"; $data = array($ideleve); try { $req = $bdd->prepare($sql); $req->execute($data); $arrTmp = $req->fetchAll(); //on stocke le resultat de la requete dans un ARRAY } catch(Exception $e){ die('Erreur : '.$e->getMessage()); } $arrNotes = array(); if(!empty($arrTmp)){ foreach($arrTmp as $N){ // on créé un tableau, qui pour chaque matière, associe la ou les notes correspondantes $arrNotes[$N['idmat']][] = $N; } } //le temps des tests : //echo "<pre>"; //print_r($arrTmp); //echo "</pre>"; return $arrNotes; } $arrMoyennes = getMoyenneByMatieresForEleve($ideleve); $arrNotes = getAllNotesByMatieresForEleve($ideleve) // pour voir ce que ça donne... faudra juste que tu le réadaptes pour l'afficher comme tu le veux : if(!empty($arrMoyennes)){ foreach($arrMoyennes as $M){ $nomMat = $M['nomat']; $idMat = $M['idmat']; $moyenneEleve = $M['MOYENNEELEVE']; echo "<br> Matières : ". $nomMat ; echo "<br> Moyenne de l'elève : ". $moyenneEleve ; if(!empty($arrNotes[$idmat])){ echo "<pre>"; foreach($arrNotes[$idmat] as $k=>$N){ print_r($N,true); } echo "</pre>"; } } } ?>
-
Voici comment j'ai adapté ça sur mon code
<?php //début de ton fichier php .... ça veut dire .. DEBUT !!!: error_reporting ( E_ALL ); ini_set ( 'display_errors', TRUE ); ini_set ( 'display_startup_errors', TRUE ); $nom = !empty ( $_GET['nom'] ) ? $_GET['nom'] : NULL; $prenom = !empty ( $_GET['prenom'] ) ? $_GET['prenom'] : NULL; $cycle = !empty ( $_GET['cycle'] ) ? $_GET['cycle'] : NULL; $ideleve = !empty ( $_GET['ideleve'] ) ? $_GET['ideleve'] : NULL; $typenote1 = 'Note de devoir'; $typenote2 = 'Note de composition'; $typenote3 = '1e seule note'; function getMoyenneByMatieresForEleve($ideleve){ global $bdd; $sql = "SELECT MO.moyen as MOYENNEELEVE, MA.* FROM matiere MA LEFT JOIN moyenne MO ON MA.idmat = MO.idmat WHERE MO.ideleve = ?"; $datas = array($ideleve); try { $req = $bdd->prepare($sql); $req->execute($datas); $donnees = $req->fetchAll(); //on stocke le resultat de la requete dans un ARRAY } catch(Exception $e){ die('Erreur : '.$e->getMessage()); } return $donnees; } function getAllNotesByMatieresForEleve($ideleve){ global $bdd; $sql = "SELECT N.* , M.* FROM note N LEFT JOIN matiere M ON M.idmat = N.idmat WHERE N.ideleve = ?"; $data = array($ideleve); try { $req = $bdd->prepare($sql); $req->execute($data); $arrTmp = $req->fetchAll(); //on stocke le resultat de la requete dans un ARRAY } catch(Exception $e){ die('Erreur : '.$e->getMessage()); } $arrNotes = array(); if(!empty($arrTmp)){ foreach($arrTmp as $N){ // on créé un tableau, qui pour chaque matière, associe la ou les notes correspondantes $arrNotes[$N['idmat']][] = $N; } } //le temps des tests : //echo "<pre>"; //print_r($arrTmp); //echo "</pre>"; return $arrNotes; } $arrMoyennes = getMoyenneByMatieresForEleve($ideleve); $arrNotes = getAllNotesByMatieresForEleve($ideleve) // pour voir ce que ça donne... faudra juste que tu le réadaptes pour l'afficher comme tu le veux : ?>
Voici la partie du tableau
<table > <thead> <?php echo '<tr>'; echo '<th>'; echo '<strong>#</strong>'; echo '</th>'; echo '<th>'; echo '<strong>Matière</strong>'; echo '</th>'; echo '<th colspan="';?> <?php echo $id;?> <?php echo ' ">'; echo '<strong>Note de classe</strong>'; echo '</th>'; echo '<th>'; echo '<strong>Note de composition</strong>'; echo '</th>'; echo '<th>'; echo '<strong>Moyenne(matière)</strong>'; echo '</th>'; echo '</tr>'; ?> </thead> <tbody> <?php if(!empty($arrMoyennes)){ foreach($arrMoyennes as $M){$nomMat = $M['nomat']; $idMat = $M['idmat'];$moyenneEleve = $M['MOYENNEELEVE']; echo '<tr>'; echo '<td>' .$j .'</td>'; echo '<td>'.$nomMat. '</td>'; if(!empty($arrNotes[$idmat])){ foreach($arrNotes[$idmat] as $k=>$N){ echo '<td>'.$N.'</td>'; } } echo '<td>'.$moyenneEleve.'</td>'; echo '</tr>'; } ?> </tbody> </table>
Mais quand je lance le code il ya pas d'affichage -
-
-
-
-



