Effectuer un affichage à partir de deux tables

Eléphant du PHP | 185 Messages

17 oct. 2007, 22:44

Bonsoir à tous,

me revoilà avec un problème que je ne parviens pas à résoudre.

J'ai deux tables dans ma base de données, la première appelée "liste_pays" et la seconde appelée "liste_villes".

La table "liste_pays" contient deux champs, "id" et "pays".
La table "liste_villes" contient trois champs, "id", "id_pays", "ville".

Le but est d'afficher la liste des pays et des villes par ordre alphabétique, mais de façon à éviter que le nom du pays apparaîsse deux fois ou plus si plusieurs villes sont dans le même pays.

Voici donc ma requête SQL et le code associé pour afficher le résultat :
$requete = ("SELECT liste_pays.pays, liste_villes.ville FROM liste_pays, liste_villes WHERE liste_villes.id_pays = liste_pays.id ORDER BY pays, ville ASC");
$resultat = mysql_query($requete) or die (mysql_error());

while ($selection_1 = mysql_fetch_array($resultat) or die (mysql_error())) {
	echo '<strong>'.$selection_1['pays'].'</strong><br />';
	while ($selection_2 = mysql_fetch_array($resultat) or die (mysql_error())) {
		echo $selection_2['ville'].'<br />';
	}
}	
De cette façon j'obtiens le résultat suivant :
  • France
    Bordeaux
    Lille
    Marseille
    Nice
    Paris
    Toulouse
    Cardiff
    Dublin
    Londres
    Manchester
On peut ainsi constater que le pays "Grande-Bretagne" ne s'affiche pas, alors qu'il devrait s'intercaler entre les villes "Toulouse" et "Cardiff".

J'ignore si le problème vient de ma requête qui serait mal formulée ou du code qui suit (mauvaise imbrication des fonctions while peut-être ?).

Si quelqu'un a la solution je suis preneur ! :)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 oct. 2007, 23:03

le souci vient de ton code... tu boucles 2 fois sur le même résultat de requête ($resultat) :-k

Tu passes une fois dans la 1ère boucle pour afficher le pays (France) ensuite tu n'affiches plus que les villes jusqu'à la fin de la ressource ($resultat) et tu sors des 2 boucles.

Ce que tu veux ressemble fortement à quelque chose de ce style

J'en profite donc pour déplacer dans "SQL & Bases de données"

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 185 Messages

18 oct. 2007, 21:43

Bonsoir,
J'en profite donc pour déplacer dans "SQL & Bases de données"
Aucun problème, je ne savais pas trop où poster étant donné qu'il s'agit à la fois d'un problème concernant mes requêtes et le code qui succède (j'ai surtout eu peur que mon message n'ait été effacé et qu'il soit resté sans réponse !).

Pour en revenir à nos moutons, après de nombreux essais et recherches, je ne parviens toujours pas à afficher le résultat comme je le souhaiterais. J'ai bien tenté de m'inspirer du post que tu m'as indiqué, malheureusement je ne pense pas y avoir tout compris ! :(

Voici mon code actuel :
$requete = ("SELECT pays FROM liste_pays");
$requete2 = ("SELECT liste_villes.ville FROM liste_villes, liste_pays WHERE liste_villes.id_pays = liste_pays.id");

$resultat = mysql_query($requete) or die (mysql_error());
$resultat2 = mysql_query($requete2) or die (mysql_query());

$tableau_pays = array();
$tableau_villes = array();

$i=0;
$j=0;

while ($selection = mysql_fetch_array($resultat) or die (mysql_error())) {
	$tableau_pays[$i] = $selection['pays'];
	echo '<strong>'.$tableau_pays[$i].'</strong><br />';
	
	while ($selection2 = mysql_fetch_array($resultat2) or die (mysql_error())) {
		$tableau_villes[$j] = $selection2 ['ville'];
		echo $tableau_villes[$j].'<br />';
		$j++;
	}
	$i++;
}
Ce code n'a pour effet que d'afficher array... Et je ne parle pas des autres essais qui ont pour la plupart eu le "mauvais esprit" de ne rien afficher. Plus je cherche, moins j'obtiens le résultat attendu. C'est assez désespérant !

Je vais encore chercher car il est hors de question que j'abandonne, mais si vous pouviez me donner des pistes, ça m'aiderait beaucoup.

Merci. :)

Edit : J'ai constaté quelques erreurs dans mon code et après correction le résultat produit est exactement identique à celui que j'ai posté dans mon premier message.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 oct. 2007, 23:42

hmm... en effet ce code ressemble fortement à ton précédent.

Ce qu'il faut retenir est :
$requete = ("SELECT liste_pays.pays, liste_villes.ville FROM liste_pays, liste_villes WHERE liste_villes.id_pays = liste_pays.id ORDER BY pays, ville ASC");
$resultat = mysql_query($requete) or die (mysql_error());

$tableau = array();
/* On crée un pointeur pour la première dimension du tableau */
$pays = "";
while($ligne = mysql_fetch_assoc($exec))
{
    if($pays != $ligne['pays'])
    {
        $pays = $ligne['pays'];
    }
    $tableau[$pays][] = $ligne['ville '];
} 

//test d'affichage
echo "<pre>";
var_dump($tableau);
echo "</pre>";

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 185 Messages

19 oct. 2007, 22:06

Bonsoir,

j'ai testé le code que tu proposes, malheureusement celui-ci me retourne une page blanche...

J'ai essayé un autre code qui lui aussi n'affiche rien (pas même de message d'erreur).

Je commence à me demander s'il est réellement possible de faire ce que je souhaite (?).

Je vais tout de même tenter de trouver une solution car en théorie il n'y a pas de raison pour que cela soit irréalisable. Après tout il ne s'agit que d'afficher le contenu de deux tables dans un ordre précis ! :roll:

Eléphant du PHP | 443 Messages

19 oct. 2007, 22:18

Bonsoir,

j'ai testé le code que tu proposes, malheureusement celui-ci me retourne une page blanche...

J'ai essayé un autre code qui lui aussi n'affiche rien (pas même de message d'erreur).

Je commence à me demander s'il est réellement possible de faire ce que je souhaite (?).

Je vais tout de même tenter de trouver une solution car en théorie il n'y a pas de raison pour que cela soit irréalisable. Après tout il ne s'agit que d'afficher le contenu de deux tables dans un ordre précis ! :roll:
Salut,

Il est impossible que le code précédent ne t'affiche rien sans erreur, quoi qu'il fasse d'incohérent dans l'algo ou l'ordre SQL (et c'est absolument pas le cas), $tableau est initialisé à array(), donc tu devrais au minimum obtenir:

Code : Tout sélectionner

<pre>array(0) { }</pre>
Donc regarde ce qui, en amont, empêche l'exécution.


Tracker.

Eléphant du PHP | 185 Messages

19 oct. 2007, 22:28

En effet je pense que dans mon script il doit y avoir des incohérences. J'ai créé un nouveau fichier avec uniquement le code qui nous occupe et j'obtiens effectivement ceci :
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home.10.4/group/www/wow/test.php on line 16

array(0) {
}
C'est déjà un début de quelque chose ! ^^

Eléphant du PHP | 443 Messages

19 oct. 2007, 22:30

C'est le résultat de mysql_query(...) qu'il attend en paramètre:
while($ligne = mysql_fetch_assoc($resultat))
{
  ...
}

Tracker.

Eléphant du PHP | 185 Messages

19 oct. 2007, 22:37

Merci beaucoup, ça fonctionne parfaitement à présent ! :)

Il ne me reste plus qu'à remplacer l'affichage produit par la fonction var_dump car celui-ci ne me convient pas particulièrement.

Eléphant du PHP | 443 Messages

19 oct. 2007, 22:39

Bon courage...

:wink:

Eléphant du PHP | 185 Messages

19 oct. 2007, 23:17

Pour conclure sur ce topic voici le code que j'ai utilisé afin d'obtenir un affichage correspondant à la liste de mon premier message (tout fonctionne à merveille ! :) ) :
foreach ($tableau as $pays=> $val) {
    echo '<strong>'.$pays."</strong><br />";
    foreach($tableau[$pays] as $ville) {
		echo $ville.'<br />';
    }
}
Je le poste au cas où les débutants (comme moi ^^) seraient intéressés. ;)

EDIT : Dans la foulée je me suis "amusé" à afficher le même tableau dans une liste déroulante, en spécifiant les pays comme options de groupe et les villes en options. Voici ce que ça donne :
<form method="post" action="">
	<select name="villes">

<?php
foreach ($tableau as $pays=> $val) {
    echo '<optgroup label="'.$pays.'">';
    foreach($tableau[$pays] as $ville) {
		echo '<option value="'.$ville.'">'.$ville.'</option>';
    }
	echo '</optgroup>';
}
?>

	</select>
</form>

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

20 oct. 2007, 00:08

 foreach($tableau[$pays] as $ville)
peut etre remplacé par
 foreach($val as $ville)
où $val correspond à la variable du foreach() précédent.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute