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

Langage PHP Discussion :

Soucis avec le résultat d'une requête (double boucles while)


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Soucis avec le résultat d'une requête (double boucles while)
    Bonjour tout le monde,

    Je termine une application qui va permettre à des Maitres de stage d'évaluer des étudiants.

    Un maître de stage peut donc avoir plusieurs étudiants.

    J'ai une liste déroulante qui devrait afficher les maitres de stage avec leur étudiants :

    Exemple :

    MDS1 == Etudiant1
    MDS1 == Etudiant2
    MDS2 == Etudiant3
    ...

    Donc, un maitre de stage peut avoir plusieurs étudiants.

    Le problème est que j'obtiens bien ma liste déroulante avec tous les maitres de stages mais si ils ont plusieurs étudiants, ils apparaissent qu'une seule fois.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT * FROM etudiants";
    J'exécute la chaine dans la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = mysql_query($sql);
    Je parcours le résultat de la requête avec un mysql_fetch_array :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while($row = mysql_fetch_assoc($query)) 
    	{
    $sql_pour = "SELECT * FROM etudiants WHERE Matricule IN (SELECT id_etudiants FROM etudiants_pharmaciens WHERE id_pharmaciens = ".$row['INAMI'].")";
    				//echo $sql_pour;
    				$query_pour = mysql_query($sql_pour);
    				$pour = mysql_fetch_array($query_pour);
    				$return .='"'.$row["INAMI"].'":"'.$row["Nom"].' '.$row["Prenom"].' pour '.$pour['Nom'].' '.$pour['Prenom'].'",';
    }

    J'obtiens donc tous les maitres de stage n'apparaissant qu'une seule fois (même si certains devraient apparaitre plusieurs fois).

    J'ai essayé de mettre :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while($pour = mysql_fetch_array($query_pour))
    				{
    					$return .='"'.$row["INAMI"].'":"'.$row["Nom"].' '.$row["Prenom"].' pour '.$pour['Nom'].' '.$pour['Prenom'].'",';
    				}

    mais à ce moment là, j'obtiens le maitre de stage plusieurs fois si il a plusieurs étudiant mais je m'arrête au premier étudiant, les autres ne sont pas affichés dans la liste déroulante.

    Qu'en pensez-vous ?

    Merci d'avance pour votre aide.

    beegees

  2. #2
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonjour,

    je ne saisi pas pourquoi tu n'effectues pas une requete de ce style ?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM etudiants GROUP BY mds, etudiant;

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Madfrix Voir le message
    Bonjour,

    je ne saisi pas pourquoi tu n'effectues pas une requete de ce style ?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM etudiants GROUP BY mds, etudiant;
    Salut,

    Merci pour ta réponse.

    Je cherche une solution depuis des heures, et ceci, sans succès.

    En changeant ma chaine sql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql_pour = "SELECT * FROM etudiants WHERE Matricule IN (SELECT id_etudiants FROM etudiants_pharmaciens WHERE id_pharmaciens = ".$row['INAMI'].")";
    Par la tienne, ça donnerait quoi ?

    Encore merci pour ton aide.

    beegees

  4. #4
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    En fait, admettons que tu as une table formatée de cette manière :

    id --- mds --- etudiant
    1 --- MDS1 --- Etudiant1
    2 --- MDS1 --- Etudiant2
    3 --- MDS5 --- Etudiant3

    (en reprenant ton exemple donné précédemment), le GROUP BY comme son nom le permet de grouper tes résultats sur une ou plusieurs colonnes. Ainsi, une requete comme ca :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM etudiant GROUP BY mds;

    te donne ceci :

    id --- mds --- etudiant
    1 --- MDS1 --- Etudiant1
    3 --- MDS5 --- Etudiant3

    -> donc perte d'information concernant des etudiants

    Alors que cette requete :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM etudiant GROUP BY mds, etudiant;

    Te donne :

    id --- mds --- etudiant
    1 --- MDS1 --- Etudiant1
    2 --- MDS1 --- Etudiant2
    3 --- MDS5 --- Etudiant3

    Ainsi, via une seule requete, tu recuperes toutes les infos des tes mds et de tes etudiants et tu peux les traiter par une seule boucle while

  5. #5
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Re,

    Merci beaucoup pour tes explications mais cela n'arrange pas mon problème.

    Mon code (ci-dessous) n'affiche que deux résultats dans la liste déroulante (pour 1 seul étudiant) :

    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
    $sql_mds = "SELECT * FROM pharmaciens";
    				//echo $sql_mds;
    				$query_mds = mysql_query($sql_mds);
    				$nombre_Res = mysql_num_rows($query_mds);
     
     
    					while($res = mysql_fetch_array($query_mds))
    					{
    						$sql_pour = "SELECT Matricule, Nom, Prenom FROM etudiants WHERE Matricule IN (SELECT id_etudiants FROM etudiants_pharmaciens WHERE id_pharmaciens = '".$res['INAMI']."')";
    						//echo $sql_pour;
     
     
    						$query_pour = mysql_query($sql_pour);
    						while ($res_pour = mysql_fetch_array($query_pour))
    						{
    							$return .='"'.$res["INAMI"].'":"'.$res["Nom"].' '.$res["Prenom"].' pour '.$res_pour['Nom'].' '.$res_pour['Prenom'].'",';
    						}					
     
    					}
    Merci encore.

    beegees

  6. #6
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Cette ligne :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sql_pour = "SELECT Matricule, Nom, Prenom FROM etudiants WHERE Matricule IN (SELECT id_etudiants FROM etudiants_pharmaciens WHERE id_pharmaciens = '".$res['INAMI']."')";

    effectue une pseudo jointure qui peut directement etre faite par MySQL.

    Peux tu nous donner le shema de creation de tes tables afin de voir les relations ? Il suffit sur phpMyAdmin par exemple d'effectuer la requete suivante :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    show create table nom_de_ta_table

  7. #7
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Re,

    Merci pour ton dévouement.

    Voici le schéma de mes tables :

    etudiants :

    Matricule text Non
    Nom text Non
    Prenom text Non
    pharmaciens :

    ID int(11) Non
    Nom text Non
    Prenom text Non
    Sexe text Non
    Nationalite text Non
    Date_de_naissance date Non
    Lieu_de_naissance text Non
    Pays_de_naissance text Non
    Adresse_oficine text Non
    Adresse_oficine_numero int(5) Non
    Adresse_oficine_CP int(10) Non
    Adresse_oficine_localite text Non
    Tel_Officine text Non
    Fax_officine text Non
    Email text Non
    Adresse_privee text Non
    Adresse_privee_numero int(5) Non
    Adresse_privee_CP int(5) Non
    Adresse_privee_localite text Non
    Adresse_privee_tel text Non
    INAMI text Non
    MDP text Non
    Type_utilisateur text Non User ou administrator
    etudiants_pharmaciens :

    ID int(11) Non
    id_etudiants text Non
    id_pharmaciens text Non
    Cloture int(11) Oui NULL
    Date_cloture text Oui NULL
    J'espère que c'est assez.

    Merci encore pour l'aide.

    Edit:

    J'ai un peu avancé, j'ai maintenant une chaine sql qui fonctionne et qui renvoie tous les enregistrements des deux tables (etudiants et pharmaciens) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql_mds = "SELECT * , etudiants.Nom AS etudiant_nom, pharmaciens.Nom AS pharmacien_nom  FROM etudiants_pharmaciens INNER JOIN etudiants ON etudiants.Matricule = id_etudiants INNER JOIN pharmaciens ON pharmaciens.INAMI = id_pharmaciens ORDER BY pharmaciens.nom, etudiants.nom ";
    Le seule problème est qu'il n'affiche que deux enregistrements au lieu des 4 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $query_mds = mysql_query($sql_mds);
    while($res = mysql_fetch_array($query_mds))
    				{
     
    						$return .='"'.$res["INAMI"].'":"'.$res["pharmacien_nom"].' '.$res["Prenom"].' pour '.$res['etudiant_nom'].' '.$res['Prenom'].'",';					
     
    				}
    Le fait de copier/coller la chaine SQL dans mysql affiche tous les enregistrements, c'est donc un problème au niveau du mysql_fech_Array ?

    beegees

  8. #8
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    As tu essayé quelque chose de ce style ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $sql_mds =  "SELECT * FROM etudiants_pharmaciens as EP
    INNER JOIN etudiants as E
    ON E.Matricule = EP.id_etudiants 
    INNER JOIN pharmaciens as P
    ON P.INAMI = EP.id_pharmaciens 
    GROUP BY P.Nom, E.Nom
    ORDER BY P.nom, E.nom ";

Discussions similaires

  1. remplir un Tableau avec le résultat d'une requête SQL
    Par Jean-Claude Dusse dans le forum ASP.NET
    Réponses: 13
    Dernier message: 23/02/2009, 15h00
  2. Pb avec le résultat d'une requête
    Par cheppy dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/06/2008, 16h24
  3. Réponses: 1
    Dernier message: 25/06/2007, 16h33
  4. Ouvrir Excel avec le résultat d'une requête
    Par zoom61 dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/06/2007, 15h44
  5. problème avec les résultats d'une requête select top1
    Par kariiim dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 19/03/2007, 15h05

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