SQL/PHP Tri d'une table et affichage par grou

Fermé
Shadynn - 31 juil. 2001 à 22:13
 tfy - 15 avril 2010 à 23:52
Bonsoir à tous
J'ai réussi à trier ma table par ordre alphabétique et afficher les résultat par groupe de lettre mais la première ligne de chaque groupe affiché reste vierge.
Ci-joint mon script, si vous avez plus simple n'hésitez pas.
Merci à tous
-------------------------------------------------------------------

//----------------S----------------
$requete = mysql_query ("SELECT * FROM mabase WHERE famille='$fami' AND nomFR LIKE 'S%' ORDER BY nomFR");

if ($res = mysql_fetch_object($requete)) { //est-ce qu'un nomFR commençant par S existe ?

echo "<p class='gloss'><a name='S'></a>";
while ($res = mysql_fetch_object($requete)) // tant qu'un nomFR commençant par S exite affichage avec ou sans lien
{
if ($res->valid==YES) $lien="<a href='../Data/$res->page'>$res->nomFR</a>";
else
$lien="<B>".$res->nomFR."</B>";
echo "<BR>$lien &nbsp;($res->nomLatin)\n";
}

//----------------T----------------

etc, etc

-------------------------------------------------------------------
A voir également:

4 réponses

Tittom Messages postés 422 Date d'inscription mardi 30 mai 2000 Statut Membre Dernière intervention 10 janvier 2007 128
1 août 2001 à 08:41
Salut,

Wow, ton script doit être plutôt long, si tu as copié collé cette portion de script pour chaque lettre...

Si j'étais toi, je gèrerais une "rupture" sur la première lettre de la colonne nomFR :

tu définis une variable $old_initiale qui te permettra de détecter si tu changes de lettre ou non :


// requete sans sélection sur la première lettre du nom.
$requete = mysql_query ("SELECT * FROM mabase WHERE famille='$fami' ORDER BY nomFR");


// valeur bidon pour être sûr que la rupture va être
// déclenchée au premier passage...
$old_initiale = -1;

// parcours des lignes résultat
while ($res = mysql_fetch_object($requete))
{

$initiale = substr($res->nomFR, 0, 1);

if ($initiale != $old_initiale)
{
// Changement de lettre
echo "<p class='gloss'><a name='$initiale'></a>";
// Sauvegarde de cette nouvelle lettre pour prochaine rupture
$old_initiale = $initiale;
}

if ($res->valid==YES)
{
$lien="<a href='../Data/$res->page'>$res->nomFR</a>";
}
else
{
$lien="<B>".$res->nomFR."</B>";
}

echo "<BR>$lien &nbsp;($res->nomLatin)\n";
} // Fin du while

// Fin d'affichage des résultats



Cette méthode a l'avantage de t'éviter de copier coller 26 fois ton bout de code : si tu modifies une partie de ce code, cela marchera pour toutes les lettres.


J'espère que cela t'aidera...

Tittom
0
Bobinours Messages postés 2898 Date d'inscription jeudi 26 avril 2001 Statut Membre Dernière intervention 21 mars 2013 504
1 août 2001 à 17:06
La methode de Tittom me parait bonne (quoi qu'un peu bricolo :o)

Ton erreur vient simplement du fait que lorsque tu fais un appel à "$res = mysql_fetch_object($requete)", $res est affectée à la première valeur de $requete (au passage, "$requete" est ambigü, t'aurais du l'appeller "$resultat" car c'est un tableau de résultat) et l'enleves de $requete (c'est l'équivalent de la fonction PHP "array_shift" qui dépile un élément au début d'un tableau).

Quand tu testes "if ($res = mysql_fetch_object($requete))", $requete contient un élément de moins.
C'est pourquoi "while ($res = mysql_fetch_object($requete))" ne tient pas compte de ta première ligne de résultat.

-= Bobinours =-
0
Bonjour et merci pour ton aide,
Je pense avoir bien compris d'où venait le Pb mais pour
un débutant la solution est difficile à trouver.
Comment puis-je afficher cette fameuse ligne ?
--------------------------------------------------------------------------
$result = mysql_query ("SELECT * FROM rapaces WHERE nomFR LIKE 'A%' ORDER BY nomFR");
echo "<p class='gloss'><a name='A'></a>";
while ($res = mysql_fetch_object($result))
{
//if ($res->valid==YES) $lien="<a href='../Data/$res->page'>$res->nomFR</a>";
//else
$lien="<B>".$res->nomFR."</B>";
echo "<BR>$lien &nbsp;($res->nomLatin)\n";
}
--------------------------------------------------------------------------

Avec le script ci-dessus, si j'ai bien compris, je n'ai pas de Pb de ligne en moins.
0
Avec le script ci-dessus, si j'ai bien compris, je n'ai pas de Pb de ligne en moins.
0
Bobinours Messages postés 2898 Date d'inscription jeudi 26 avril 2001 Statut Membre Dernière intervention 21 mars 2013 504
7 août 2001 à 15:25
Je ne maitrisse pas bien la fonction 'mysql_fecth_object' (j'utilise mysql_fetch_row), mais si dans ta base au moins deux champs 'nomFR' et 'page'.
Et que 'page' est égal à une page web (si elle existe) et à vide '' sinon, tu peux remplacer ton test:

if ($res->valid==YES){...

par

if ($res->page != '')( ...


Sinon, ta boucle me parait tout à fait correcte pour récuperer tous les enregistrements de ta base.
Par contre, Tittom a raison sur le fait que si tu dois reproduire 26 fois ton code (pour chaque lettre) c'est du délire.
Tu dois encapsuler au minimum dans une boucle:

$Lettres = array ('A','B','C',...,'Z');
foreach ($Lettres as $initiale)
{
$result = mysql_query ("SELECT * FROM rapaces WHERE nomFR LIKE '". $initaile ."%' ORDER BY nomFR");
...
}

Maintenant, le code de Tittom a l'avantage de ne faire qu'une seule requête 'SELECT', alors que dans ce cas, tu fais 26 requête à la base.

-= Bobinours =-
0
bonjour...............ca date ....masi px ton reprendre les code pour moi stp...je ne comprends pas comment on fait laffichage de toutes les lettre et de faire en sorte que cest lettre soit des liens.
0