A voir également:
- SQL/PHP Tri d'une table et affichage par grou
- Table ascii - Guide
- Table des matières word - Guide
- Excel trier par ordre croissant chiffre - Guide
- Table des annexes word ✓ - Forum Word
- Easy php - Télécharger - Divers Web & Internet
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
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 ($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
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 ($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
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
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 =-
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 =-
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 ($res->nomLatin)\n";
}
--------------------------------------------------------------------------
Avec le script ci-dessus, si j'ai bien compris, je n'ai pas de Pb de ligne en moins.
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 ($res->nomLatin)\n";
}
--------------------------------------------------------------------------
Avec le script ci-dessus, si j'ai bien compris, je n'ai pas de Pb de ligne en moins.
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
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 =-
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 =-