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 :

Problème while imbriqués [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Photographie
    Inscrit en
    Février 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Photographie

    Informations forums :
    Inscription : Février 2012
    Messages : 20
    Points : 9
    Points
    9
    Par défaut Problème while imbriqués
    Bonjour,

    J'ai un petit problème de while imbriqué.

    J'ai un problème un peu chiant, je vous explique

    J'ai trois tables MySQL, une avec la liste des régions de France, une avec la liste des département et une avec les communes.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    reg2012 : REGION tinyint(2), NCCENR text.
    depts2012 : REGION tinyint(2), DEP varchar(3), NCCENR text.
    comsimp2012 : REGION tinyint(2),  DEP varchar(3), ARTMIN text, NCCENR text.

    L'idée serait d'avoir le résultat suivant :

    REG1
    DEP1 by REG1
    COM1 by DEP1 & REG1
    COM2 by DEP1 & REG1

    DEP2 by REG1

    REG2
    DEP1 by REG2
    COM1 by DEP1 & REG2
    COM2 by DEP1 & REG2

    DEP2 by REG2



    J'ai pensé faire des while imbriqués, mais ça ne fonctionne pas et ça semblerait normal.

    EX : (je n'ai pas mis les cantons pour le test)
    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
    <?php
    //reg2012
    $sql1 = "SELECT REGION,NCCENR FROM reg2012 ORDER BY NCCENR ASC"; // Requette MySQL
    $req1 = mysql_query($sql1) or die('Erreur SQL !<br />\n'.$sql1.'<br />\n'.mysql_error());
     
    while($data1 = mysql_fetch_array($req1)) {
    	echo "<li>".$data1['NCCENR']." - ".$data1['REGION']."</li>\n";
    	$REGION=$data1['REGION'];
     
    	//depts2012
    	$sql2 = "SELECT * FROM depts2012 WHERE REGION=$REGION"; // Requette MySQL
    	$req2 = mysql_query($sql2) or die('Erreur SQL !<br />\n'.$sql2.'<br />\n'.mysql_error());
     
    	echo "<ul>";
    	while($data2 = mysql_fetch_array($req2)) {
    		echo "<li>".$data2['NCCENR']." - ".$data2['REGION']."</li>\n";
    	}
    	echo "</ul>";
     
     
    }
    mysql_free_result($req1); // Libération de la requette
    ?>
    Ça ne fonctionne pas et affiche un truc du genre :
    Alsace - 42
    Paris - 11
    Seine-et-Marne - 11

    Aquitaine - 72
    Paris - 11
    Seine-et-Marne - 11


    J'ai entendu parlé de mysql_data_seek, mais je ne vois pas comment l'utiliser dans le cas.
    Quelqu'un aurait une idée, je patauge pas mal.

    Merci d'avance.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 99
    Points : 127
    Points
    127
    Par défaut
    Salut,

    pour moi je n'ai pas trouvé de problèmes niveau syntaxe.

    j'ai continué ton code pour obtenir le résultat que tu souhaites.
    Je n'ai pas mis ton exemple de bdd, du coups je ne sais pas si cela fonctionne niveau bdd.

    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
     
    //reg2012
    $sql1 = "SELECT REGION,NCCENR FROM reg2012 ORDER BY NCCENR ASC"; // Requette MySQL
    $req1 = mysql_query($sql1) or die('Erreur SQL !<br />\n'.$sql1.'<br />\n'.mysql_error());
     
    while($data1 = mysql_fetch_array($req1))
    {
    	//affichage de la région en cours
    	$REGION=$data1['REGION'];
    	echo $REGION."<br>";
     
    	//depts2012
    	$sql2 = "SELECT * FROM depts2012 WHERE REGION=$REGION"; // Requette MySQL
    	$req2 = mysql_query($sql2) or die('Erreur SQL !<br />\n'.$sql2.'<br />\n'.mysql_error());
     
    	while($data2 = mysql_fetch_array($req2)) {
    		echo $data2['NCCENR']." by ".$data2['REGION']."<br>";
    		$DEPARTEMENT = $data2["NCCENR"];
    		$num_departement = $data2["DEP"];
     
    		//comsimp2012
    		$sql3 = "SELECT * FROM comsimp2012 WHERE DEP=$num_departement"; // Requette MySQL
    		$req3 = mysql_query($sql3) or die('Erreur SQL !<br />\n'.$sql3.'<br />\n'.mysql_error());
     
    		while($data3 = mysql_fetch_array($req3)) {
    			echo $data3['NCCENR']." by ".$DEPARTEMENT." by ".$REGION."<br>";
    	}
     
     
    }
    En espérant que cela puisse t'aider.

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Pourquoi ne pas faire une seule requête et traiter simplement les ruptures dans le tableau de résultat ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT r.region, d.departement, c.commune
    FROM comsimp2012 c
    INNER JOIN depts2012 d ON d.DEP = c.DEP
    	INNER JOIN reg2012 r ON r.REGION = d.REGION
    ORDER BY r.region, d.departement, c.commune

    À toi d'adapter aux vrais noms de colonnes de tes tables.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Futur Membre du Club
    Profil pro
    Photographie
    Inscrit en
    Février 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Photographie

    Informations forums :
    Inscription : Février 2012
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    anthony89> comme je l'ai marqué, je n'ai pas mis le code complet pour simplifier et soulever le problème.
    Il semblerait que faire des boucles imbriqué avec des mysql_fetch_array pose problème, le passage dans le premier while rendrait la ressource indisponible pour les suivantes.
    D'après quelques lecture de forum et autre, mysql_data_seek permettrait de déplacer le pointeur pour contourner le problème, mais je n'ai pas bien compris.

    CinePhil> Pourquoi ? Parce que je n'ai pas encore pratiquer les INNER JOIN, mais ça semble intéressant !

    Tu aurais quelques lectures à me conseiller pour me documenter là dessus ?

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    CinePhil> Pourquoi ? Parce que je n'ai pas encore pratiquer les INNER JOIN, mais ça semble intéressant !

    Tu aurais quelques lectures à me conseiller pour me documenter là dessus ?
    Tout est chez SQLPro et notamment son cours sur les jointures.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Futur Membre du Club
    Profil pro
    Photographie
    Inscrit en
    Février 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Photographie

    Informations forums :
    Inscription : Février 2012
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Merci pour la doc, c'est complet et on ne peut plus claire.

    Mais après avoir lu tout ça et réfléchi sur mon problème, je ne vois pas en quoi une jointure pourrait m'aider. Je ne cherche pas à extraire sur une même ligne des informations de tables différentes.
    Peut-être plus un case et pas sur que ce soit assez puissant pour ce que je veux faire.

    En gros l'idée c'est ça :

    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
    Boucle 1 {
     
    //Régions :
    SELECT REGION,CONCAT('',NCCENR,'\n') AS NCCENR
    FROM reg2012
    ORDER BY NCCENR ASC
     
    echo $NCCENR
    + définition de la variable REGION
     
    	Boucle 2 {
     
    	//Départements :
    	SELECT REGION,DEP,CONCAT('\t',NCCENR,'\n') AS NCCENR
    	FROM depts2012
    	WHERE REGION = $REGION de la boucle 1
    	ORDER BY NCCENR ASC
     
    	echo $NCCENR
    	+ définition de la variable DEP
     
    		Boucle 3 {
     
    		//Villes :
    		SELECT DEP,CONCAT_WS('','\t\t',NCCENR,ARTMIN,'\n') AS NCCENR
    		FROM comsimp2012
    		WHERE DEP = $DEP de la boucle 2
    		ORDER BY NCCENR ASC
     
    		echo $NCCENR
     
    		}
    	}
    }
    En gros, les tables sont composé de cette manière :

    reg2012 (liste de régions) :
    - REGION = ID région, partagé avec depts2012
    - NCCENR = le libellé de la région

    depts2012 (liste de départements) :
    - REGION = ID région, partagé avec reg2012
    - DEP = ID département, partagé avec comsimp2012
    - NCCENR = le libellé du département

    comsimp2012 (liste de communes) :
    - DEP = ID département, partagé avec depts2012
    - NCCENR = le libellé de la commune
    - ARTMIN = l'article de la commune que je concatène simplement à la commune

    L'idée étant simplement d'afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    région
    	département
    		ville
    		ville
    	département
    		ville
    région
    	département
    etc...

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Avec ma requête, tu récupères un truc de ce genre :
    r.region, d.departement, c.commune
    Midi-Pyrénées, Ariège, Foix
    Midi-Pyrénées, Ariège, Pamiers
    Midi-Pyrénées, Gers, Auch
    Midi-Pyrénées, Haute-Garonne, Toulouse

    En PHP, tu peux ensuite parcourir ce tableau et afficher ce que tu veux en gérant les ruptures de département et de région.

    Pas le temps de détailler le code maintenant mais ce n'est pas très difficile.
    Tu compares le département de la ligne que tu lis à celui stocké dans une variable initialisée lors de la lecture du premier département. Si le département est différent, tu génère ta ligne d'affichage du nouveau département et tu mets à jour la variable.
    Idem pour les régions.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Futur Membre du Club
    Profil pro
    Photographie
    Inscrit en
    Février 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Photographie

    Informations forums :
    Inscription : Février 2012
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Ok, je vois ce que tu veux dire...j'espère juste qu'un gros tableau de 45000 lignes ne va pas faire craquer php

    J'essaie ça, et je vous tiens au courant, merci.

  9. #9
    Futur Membre du Club
    Profil pro
    Photographie
    Inscrit en
    Février 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Photographie

    Informations forums :
    Inscription : Février 2012
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Voilà mon code, je l'ai limité à 100 réponses en Essonne pour ne pas faire fondre les perfs à chaque test.

    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
    <?php
     
    //reg2012
    $sql1 = "SELECT r.NCCENR,d.NCCENR,CONCAT_WS(' ',c.NCCENR,c.ARTMIN) FROM comsimp2012 c INNER JOIN depts2012 d ON d.DEP = c.DEP INNER JOIN reg2012 r ON r.REGION = d.REGION WHERE d.DEP='91' ORDER BY r.NCCENR, d.NCCENR, c.NCCENR ASC LIMIT 0,100"; // Requette MySQL
    $req1 = mysql_query($sql1) or die('Erreur SQL !<br />\n'.$sql1.'<br />\n'.mysql_error());
     
    while($data1 = mysql_fetch_array($req1)) {
    	echo $data1['0']."\n";
    	echo "\t".$data1['1']."\n";
    	echo "\t\t".$data1['2']."\n";
    }
     
    mysql_free_result($req1); // Libération de la requette
     
    ?>
    ça affiche quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Île-de-France
    	Essonne
    		Abbéville-la-Rivière
    Île-de-France
    	Essonne
    		Angerville
    Île-de-France
    	Essonne
    		Angervilliers
    Île-de-France
    	Essonne
    		Arpajon
    Donc je n'ai plus qu'a supprimer les doublons de régions et départements, mais quel serait la meilleur solution, un simple IF ?

  10. #10
    Futur Membre du Club
    Profil pro
    Photographie
    Inscrit en
    Février 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Photographie

    Informations forums :
    Inscription : Février 2012
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Hello,

    Juste pour dire que j'ai fais du tout simple, y'a certainement moyen de faire beaucoup plus propre, mais ça fonctionne merveilleusement bien :

    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
    <?php
    $tache = new tache($host,$user,$pass,$db); // definition des variables "global"
    $tache->connex(); // Connexion à la base MySQL
    mysql_query("SET NAMES 'utf8'");
     
    //reg2012
    $sql1 = "SELECT r.NCCENR,d.NCCENR,CONCAT_WS(' ',c.NCCENR,c.ARTMIN) FROM comsimp2012 c INNER JOIN depts2012 d ON d.DEP = c.DEP INNER JOIN reg2012 r ON r.REGION = d.REGION ORDER BY r.NCCENR, d.NCCENR, c.NCCENR ASC"; // Requette MySQL
    $req1 = mysql_query($sql1) or die('Erreur SQL !<br />\n'.$sql1.'<br />\n'.mysql_error());
     
    $region="";
    $departement="";
     
    while($data1 = mysql_fetch_array($req1)) {
    	if($data1['0']===$region) {} else {echo $data1['0']."\n";}
    	if($data1['1']===$departement) {} else {echo "\t".$data1['1']."\n";}
    	echo "\t\t".$data1['2']."\n";
    	$region=$data1['0'];
    	$departement=$data1['1'];
    }
    mysql_free_result($req1); // Libération de la requette
    ?>
    Juste une toute petite question et après je vous embête plus.

    Quand j'observe le code source, je m'aperçois qu'il y a un espace après chaque ville (et uniquement ville), y a t'il un moyen de le supprimer facilement ?

  11. #11
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Je ne vois pas d’où sa peu venir l'espace, met un trim a la valeur ville pour supprimer s'il y a des espace dans la base.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "\t\t".trim($data1['2'])."\n";
    et pour les condition vide {} tu pourra faire l'inverse de la condition sans mettre les {}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if($data1['0']!==$region) echo $data1['0']."\n";
    if($data1['1']!==$departement)echo "\t".$data1['1']."\n";
    A la recherche d'un film : http://chercher-un-film.com

  12. #12
    Futur Membre du Club
    Profil pro
    Photographie
    Inscrit en
    Février 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Photographie

    Informations forums :
    Inscription : Février 2012
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Merci m4riachi, les espace était très certainement dans la base de donnée en fait.

    Effectivement, j'ai effacé les else..., travailler la nuit après le taf, ça n'aide pas du tout.

    Merci tout le monde, grave à votre contribution, un magnifique thesaurus pour logiciel photo vient de voir le jour !

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

Discussions similaires

  1. do while imbriqués avec pointeurs :)
    Par PapyFouras dans le forum Langage
    Réponses: 3
    Dernier message: 17/07/2008, 14h27
  2. [MySQL] Plusieurs while imbriqués pour expoitation de résultats
    Par jojo57 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/03/2008, 14h01
  3. problème div imbriqués avec hidden
    Par mcdam dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 28/10/2007, 10h13
  4. [Débutant] Question sur deux while imbriqués
    Par beegees dans le forum Langage
    Réponses: 2
    Dernier message: 01/01/2007, 20h05
  5. Réponses: 2
    Dernier message: 05/05/2006, 15h10

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