Jointure entre deux tables - ne fonctionne pas

armenfrast
Invité n'ayant pas de compte PHPfrance

30 oct. 2010, 16:04

Première table: Membres. Le Pays est codé en ISO. Par ex FR pour France
Deuxième table: Correspondance code ISO avec l'intitulé FR, France

La solution actuelle qui fonctionne
<?
$sql="SELECT ville,codepays FROM membres WHERE cpostal<>''";
$result=mysql_query($sql);
while ($row = mysql_fetch_array($result)){

//Recherche du Pays ($pays)
$sql="SELECT id_pays,pays_clair FROM `pays` WHERE id_pays ='$row[codepays]'" ;
$liste=mysql_query($sql);
$pays = mysql_fetch_array($liste);

$descr=ucwords(strtolower($row['ville']))."<br/>".ucwords(strtolower($pays['pays_clair']));
echo ("<div>$descr</div>\n");
}
?>
Théoriquement je devrais pouvoir tout agréger en une seule ligne ? mais la 2e requête ne fonctionne pas - pourquoi ?
<?
$sql="SELECT membres.ville,membres.codepays,pays.id_pays,pays.pays_clair FROM membres,pays WHERE cpostal<>'' AND membres.codepays=pays.id_pays";
$result=mysql_query($sql);
while ($row = mysql_fetch_array($result)){

$descr=ucwords(strtolower($row['ville']))."<br/>".ucwords(strtolower($row['pays_clair']));
echo ("<div>$descr</div>\n");
}
?>

Mammouth du PHP | 19672 Messages

30 oct. 2010, 16:43

As-tu testé ta requête directement avec phpMyAdmin ou un outil similaire ?

Par ailleurs, indiquer « ça ne marche pas » est très insuffisant comme indication : ne voyant pas le résultat, on ne pourra pas deviner.

Enfin, le code de sortie HTML est très discutable : du <div> à chaque tour, ce n'est sémantiquement pas valable même si c'est valide au plan de la norme.

Et pour ta jointure, je suggère une jointure normalisée au lieu d'une clause WHERE. Suggestion globale :
<?php
$sql  = "SELECT ".
        "  m.ville, ".
        "  p.pays_clair ".
        "FROM membres m ".
        "  INNER JOIN pays p ON m.codepays = p.id_pays ".
        "WHERE m.cpostal <> '' ".
        "ORDER BY p.id_pays, m.ville";
$result = mysql_query($sql);
$descr = "<div>\n";
$sPays = '';
$np = mysql_num_rows($result);
$i = 1;
while(false !== ($row = mysql_fetch_assoc($result)))
{
    if($sPays != $row['pays_clair'])
    {
        if($i > 1)
        {
            $descr .= "  </p>\n";
        }
        $sPays = $row['pays_clair'];
        $descr .= "  <h4>". ucwords(strtolower($row['pays_clair'])) ."</h4>\n  <p>\n";
    }
    $descr .= "    ". ucwords(strtolower($row['ville'])) ."<br />\n";
    $i++;
}
$descr .= "  </p>\n</div>\n";
echo($descr);
?>
Je te laisse analyser un peu tout ça, tu devrais y trouver pas mal de choses intéressantes.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

armenfrast
Invité n'ayant pas de compte PHPfrance

30 oct. 2010, 18:04

Merci pour avoir pris le temps de tout recoder je vais regarder ton exemple de plus près.

En fait ta première recommandation m'a fourni la réponse. A savoir tester la requête avec PHP My Admin.

L'une des table était codée en UTF8_Unicode et l'autre en UTF_General.

Je suis un peu confus de ne pas y avoir pensé avant, mais je n'avais jamais réalisé que les messages d'erreur étaient si explicites dans PMA

Sincèrement