IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Plusieurs résultat sur 1 champ [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Epinal
    Inscrit en
    Mai 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Epinal

    Informations forums :
    Inscription : Mai 2020
    Messages : 6
    Par défaut Plusieurs résultat sur 1 champ
    Bonjour,
    Je suis nouveau sur ce forum. Rien qu'en lisant le titre certains vont surement s'arracher les cheveux. Je pense que mon problème est bénin et ça m'énerve de ne pas trouver de solutions.

    Bon je résume la situation, je dois faire un site web qui va être pour un collège, un espèce de pronote, tout cela est fait, j'ai 4 espaces de connexion. Élève, Parent, Enseignant, Administrateur. Je souhaiterais, quand un parent arrive dans son espace, que les prénom de ses enfants s'affichent. Mon problème est le suivant : m'a requête fonctionne, sauf que celle-ci doit me retourner 1 ou plusieurs valeurs. Or je ne récupère que la dernière.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $req2 = ("SELECT IdEleve FROM ParentsEleve WHERE IdParents = \"$ID\""); //ICI LE $ID PREND UNE VALEUR SUR UNE PRECEDENTE REQUETE
    	//printf("req2 = %s<br>", $req2);
    	$resultat2 = mysqli_query($bdd, $req2) or die ("Impossible d'envoyer la requete id eleve");
    	$nb2 = mysqli_num_rows($resultat2);
    	//printf("nb2 = %s<br>", $nb2);
    	for($i = 0; $i < $nb2; $i++)
    	{
    		printf("i = %s<br>", $i);
    		while($tableau2 = mysqli_fetch_array($resultat2))
    		{
    			$IdE[$i] = $tableau2[$i];
    			printf("ide = %s<br>", $IdE[$i]);
    		}
    Oui, j'ai utilisé un "for" mais c'étais juste pour essayer, cela fait la même chose avec et sans.
    Avec les valeur de cette requête, j'en créer une autre (ce pourquoi il n'y a pas l'accolade fermante du "for)

    voici la suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    		$req3 = ("SELECT Prenom, Nom, EleveClasse.IdClasse FROM Eleve, EleveClasse WHERE Eleve.IdEleve = \"$IdE[$i]\"");
    		printf("req3 = %s<br>", $req3);
    		$resultat3 = mysqli_query($bdd, $req3) or die ("Impossible d'envoyer la requete nom prenom idclasse eleve");
    		$nb3 = mysqli_num_rows($resultat3);
    		while($tableau3 = mysqli_fetch_array($resultat3))
    		{
    			$PrenomE[$i] = $tableau3[0];
    			$NomE[$i] = $tableau3[1];
    			$IdCE[$i] = $tableau3[2];
    			printf("nb = %s, Eleve[%s] : <br> - %s %s %s <br>", $nb3, $i, $PrenomE[$i], $Nom[$i], $IdCE[$i]);
    		}
    	}
     
    		$req4 = ("SELECT NomClasse FROM Classe WHERE IdClasse = \"$IdCE[$i]\"");
    		$resultat4 = mysqli_query($bdd, $req4) or die ("Impossible d'envoyer requete classe eleve");
    		$nb4 = mysqli_num_rows($resultat4);
    		for($j = 0; $j < $nb4; $j++)
    		{
    			while($tableau4 = mysqli_fetch_array($resultat4))
    			{
    				$ClasseE[$j] = $tableau4[0];
    			}
    		}	
     
     
    		printf("Bonjour %s %s <br>", $Prenom1, $Nom1);
    		if($nb2 == 1) 
    		{
    			Printf("Parents de l'élève : %s %s en classe de %s <br>", $PrenomE[0], $NomE[0], $ClasseE[0]);
    		}
     
    		if($nb2 > 1)
    		{
    			printf("Parents des élèves : <br>");
    			for($i = 0; $i < $nb3; $i++)
    			{
    				printf("- %s %s %s <br>", $PrenomE[$i], $NomE[$i], $ClasseE[$j]);
    			}
    		}
    Voila, mais rien ne fonctionne comme je le souhaiterais.
    Ma page affiche ceci (pour la partie du code que j'ai montré) :
    Nom : page.png
Affichages : 107
Taille : 60,2 Ko

    J’espère avoir été clair et que ma façon de coder ne va pas trop vous faire souffrir, je ne suis pas un expert (et j'ai appris de cette manière)(Je suis en BTS informatique) et j’espère surtout que vous pourrez m'aider.

    Merci d'avance

    Erwan

  2. #2
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    J'ai l'impression que la structure de ta base est à revoir.
    Je n'aurais pas associé un élève à un parent mais le contraire.

    Tant pis, c'est fait, tu te traîneras ce boulet durant toute la vie de ton application.

    Pour ce qui est de ta boucle, c'est assez simple en utilisant une jointure dans ta requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM ParentsEleve as p INNER JOIN Eleve as e ON p.idEleve = e.idEleve WHERE p.IdParents = :idParent
    Ensuite, tu boucles sur les résultats pour afficher tous les enfants d'un parent.

    Peut-être que j'ai cafouillé sur les noms des colonnes mais l'idée est là

    Avec la structure de tes tables, on pourrait mieux te conseiller

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2009
    Messages : 35
    Par défaut
    Bonjour
    Je rejoins l'idée du dernier post car je trouve ta structure très compliquée et je n'ai pas eu envie d'y entrer
    j'ai lu l'objectif "quand un parent arrive dans son espace, que les prénoms de ses enfants s'affichent"
    Donc je suppose qu'il y a 2 tables
    -Parent avec id et infos
    -Eleves avec id et un champ id_parent
    Donc avec le requete "SELECT * FROM ParentsEleve as p INNER JOIN Eleve as e ON p.idEleve = e.idEleve WHERE p.IdParents = :idParent"
    ça devrait donner les enfants (ça doit fonctionner aussi avec LEFT JOIN)

  4. #4
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    (ça doit fonctionner aussi avec LEFT JOIN)
    Oui, c'est même mieux, tu auras les parents, même ceux qui n'ont pas d'enfant.
    Tu peux même utiliser un LEFT OUTER JOIN

  5. #5
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 508
    Par défaut
    Salut,
    1) fait nous voir le relation entre la table parent et la table eleve.
    2) tu utilises les anciennes fonctions de php et je ne me sens pas à l'aise avec.
    3) Apprend à utiliser les requêtes prepare.

    Cordialement

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2009
    Messages : 35
    Par défaut
    Pour les requetes PDo
    fait comme moi, intégre et utilise une class PDO pour envoyer tes requetes classiques
    Sur le web avec les mots clefs "class pdo" il y plusierus exemples! CRUD est excellente à mon avis

  7. #7
    Membre à l'essai
    Homme Profil pro
    Epinal
    Inscrit en
    Mai 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Epinal

    Informations forums :
    Inscription : Mai 2020
    Messages : 6
    Par défaut
    Merci pour vos réponses.

    Tout d’abord, je vais juste dire que je ne connais pas INNER JOIN et LEFT OUTER JOIN, donc je vais me renseigner à leur sujet et essayer ce que vous m'avez proposé.

    Ensuite, il est vrai que j'aurai pu joindre ma BDD, alors non il n'y a pas 2 tables mais 3, une parents, une élève et une ParentsEleve qui sert de lien (sur conseil de mon prof qui nous a aidé pour le début).

    Ensuite, pour ce qui est des fonctions php, je redis que j'utilise ce que j'ai appris en cours. Je n'ai pas fait de classe en php pour les requête. Donc je ne connais pas la class PDO.

    Voici le Schéma entités relation de la BDD (validé par mon prof pour le projet je ne peux donc plus le changer) :
    Nom : SER.png
Affichages : 97
Taille : 70,0 Ko

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2009
    Messages : 35
    Par défaut
    Bonjour
    Effectivement la table parents -eleves sert de lien pour afficher tous les enfants d'un parent.
    Eh bien avec la table parent il est possible d'afficher tous les enfants avec une jointure

  9. #9
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 508
    Par défaut
    Salut, je penses que la table parentEleve ne devrait pas exister.
    Ce sont tes règles de gestion ici ? Parce que tout part des RG :
    1) Un parent est enregistré dans le système sauf s'il a au moins un enfant dans le collège.
    2) Un élève à un et un seul parent. Sauf si tu veux enregistrer le père et la mère.

    Base de données
    1er cas : enregistrement d'un parent
    [parent]--(1,n)--{a}--(1,1)--[eleve]
    Ici l'id du parent va migrer comme clé étrangère dans la table élève.

    2ème cas : cas où on enregistre les deux parents
    [parent]--(1,n)--{parentEleve}--(1,n)--[eleve]

    Comme la cardinalité max des deux côtés est n, l'association parentEleve devient une table avec pour clé primaire la concaténation des deux clés primaires participantes à la relation.

    QUEL EST LE CAS QUE TU UTILISES DANS TON SYSTÈME ?
    Cordialement

  10. #10
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    C'est mieux avec le MPD :-)
    Ici, ta table ParentsEleve est ce qu'on nomme une table de liaison, elle fait effectivement le lien entre la table Parents et la table Eleve

    - Pourquoi nommer la ta table Parents au pluriel et la table Eleve au singulier ?
    - La colonne idParentsEleve dans la table ParentsEleve n'a pas lieu d'exister.


    Tu peux récupérer les élèves rattachés à un parent avec le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $id_parents = 3;
    $sql = 'SELECT pe.idParents, p.Prenom, p.Nom, e.Prenom, e.Nom FROM ParentsEleve as pe LEFT JOIN ON pe.idParents = p.idParents LEFT JOIN Eleve as e ON pe.idEleve = e.idEleve WHERE pe.idParents = :idParents';
    $select = $db->prepare($sql);
    $select->bindValue(':idParents', $id_parents, PDO::PARAM_INT);
    $select->execute();
    $data = $select->fetchall();
    var_dump($data);

  11. #11
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    @Mannequin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Salut, je penses que la table parentEleve ne devrait pas exister.
    Je garderais la table de liaison, l'élève peut avoir des beaux-parents, des grands-parents qui peuvent avoir un compte donc, la table peut continuer à exister.

  12. #12
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 508
    Par défaut
    @ma5t3r

    Ça marche.

    Cordialement.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Epinal
    Inscrit en
    Mai 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Epinal

    Informations forums :
    Inscription : Mai 2020
    Messages : 6
    Par défaut
    Citation Envoyé par ma5t3r Voir le message
    C'est mieux avec le MPD :-)
    Ici, ta table ParentsEleve est ce qu'on nomme une table de liaison, elle fait effectivement le lien entre la table Parents et la table Eleve

    - Pourquoi nommer la ta table Parents au pluriel et la table Eleve au singulier ?
    - La colonne idParentsEleve dans la table ParentsEleve n'a pas lieu d'exister.


    Tu peux récupérer les élèves rattachés à un parent avec le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $id_parents = 3;
    $sql = 'SELECT pe.idParents, p.Prenom, p.Nom, e.Prenom, e.Nom FROM ParentsEleve as pe LEFT JOIN ON pe.idParents = p.idParents LEFT JOIN Eleve as e ON pe.idEleve = e.idEleve WHERE pe.idParents = :idParents';
    $select = $db->prepare($sql);
    $select->bindValue(':idParents', $id_parents, PDO::PARAM_INT);
    $select->execute();
    $data = $select->fetchall();
    var_dump($data);
    Encore une fois merci pour vos réponses, étant de retour chez moi je vais pouvoir essayer vos codes dans les deux jours qui viennent, je vous retiens au courant par la suite.

    Cordialement

  14. #14
    Membre à l'essai
    Homme Profil pro
    Epinal
    Inscrit en
    Mai 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Epinal

    Informations forums :
    Inscription : Mai 2020
    Messages : 6
    Par défaut
    Re bonjour à tous,

    J'ai pris le temps de tester 2 solutions :

    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ParentsEleve as p INNER JOIN Eleve as e ON p.idEleve = e.idEleve WHERE p.IdParents = \"$ID\"
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $id_parents = 3;
    $sql = 'SELECT pe.idParents, p.Prenom, p.Nom, e.Prenom, e.Nom FROM ParentsEleve as pe LEFT JOIN ON pe.idParents = p.idParents LEFT JOIN Eleve as e ON pe.idEleve = e.idEleve WHERE pe.idParents = :idParents';
    $select = $db->prepare($sql);
    $select->bindValue(':idParents', $id_parents, PDO::PARAM_INT);
    $select->execute();
    $data = $select->fetchall();
    var_dump($data);
    La 2ème ne fonctionne pas et étant donné que je ne connais pas vraiment cette méthode je ne sais pas trop pourquoi ça ne fonctionne pas (j'ai tester la requête dans PhpMyAdmin et elle ne fonctionne pas).

    Quand à la 1ère, elle me retourne tous les résultat de la BDD donc en soit j'ai les résultats que je veux, mais comme avant les résultats sont écrasés et je n'arrive à récupérer que le dernier enfant.

  15. #15
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Et quel sont les messages d'erreurs ?
    - quand tu lances la requête dans phpMyAdmin.
    - et quand tu le lances dans ta page PHP.

  16. #16
    Membre à l'essai
    Homme Profil pro
    Epinal
    Inscrit en
    Mai 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Epinal

    Informations forums :
    Inscription : Mai 2020
    Messages : 6
    Par défaut
    Citation Envoyé par ma5t3r Voir le message
    Et quel sont les messages d'erreurs ?
    - quand tu lances la requête dans phpMyAdmin.
    - et quand tu le lances dans ta page PHP.
    Excusez moi j'ai oublié de le mettre

    Pour phpmyadmin j'ai ça :
    Nom : sol2.png
Affichages : 77
Taille : 58,4 Ko

    Pour ma page php rien ne s'affiche.

  17. #17
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Normal, il y a une erreur dans la requête :-)
    La table Parents as p sur le LEFT JOIN a été oubliée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT pe.idParents, p.Prenom, p.Nom, e.Prenom, e.Nom FROM ParentsEleve as pe LEFT JOIN Parents as p ON pe.idParents = p.idParents LEFT JOIN Eleve as e ON pe.idEleve = e.idEleve WHERE pe.idParents = :idParent

  18. #18
    Membre à l'essai
    Homme Profil pro
    Epinal
    Inscrit en
    Mai 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Epinal

    Informations forums :
    Inscription : Mai 2020
    Messages : 6
    Par défaut
    Citation Envoyé par ma5t3r Voir le message
    Normal, il y a une erreur dans la requête :-)
    La table Parents as p sur le LEFT JOIN a été oubliée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT pe.idParents, p.Prenom, p.Nom, e.Prenom, e.Nom FROM ParentsEleve as pe LEFT JOIN Parents as p ON pe.idParents = p.idParents LEFT JOIN Eleve as e ON pe.idEleve = e.idEleve WHERE pe.idParents = :idParent
    Je vous redis sous peu, désoler de mon temps de réponse je n'étais pas disponible.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche de plusieurs résultats sur plusieurs critères
    Par Chen norris dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/08/2011, 17h18
  2. Réponses: 5
    Dernier message: 24/09/2009, 14h11
  3. Accepeter plusieurs mail sur un champs input
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/03/2009, 16h51
  4. Plusieurs validation sur un champs ?
    Par rad_hass dans le forum ASP.NET
    Réponses: 1
    Dernier message: 16/09/2008, 15h13
  5. Plusieurs résultats sur une seule ligne
    Par Morphorpse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/08/2007, 19h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo