Tri alphabétique SQL et traitement PHP

Eléphant du PHP | 141 Messages

21 mars 2009, 12:38

L'initialisation de $lettreprec doit être faite en dehors de la boucle car là à chaque tour, elle se réinitialise et donc elle sera toujours différente de $lettrecour.

Mammouth du PHP | 686 Messages

21 mars 2009, 12:49

Il ne me prend pas en compte le changement de lettre, je patauge ...

Eléphant du PHP | 141 Messages

21 mars 2009, 13:01

Ce que je te conseille c'est de faire par étape.
Tu as un problème au niveau du PHP donc pour l'instant, ne t'occupes pas du HTML et essai un affichage simple.

La lettre en gras et la liste des genres commençant par cette lettre :
A
aGenre1
aGenre2

B
bGenre1
bGenre2
En faisant comme cela, tu pourra être sûr de ton algorithme.

Un fois que tu obtiens ça, tu commence à ajouter ton code HTML.

Mammouth du PHP | 686 Messages

21 mars 2009, 13:13

ca marche comme ceci
$lettreprec = null;
                            while($result = mysql_fetch_array($sql)){
                            $genre = $result['genre'];
                            $espece = $result['espece'];
                            $genre = strtolower($genre); ///met tout en minuscules
                            $lettrecour = $genre[0];
                            if($lettrecour != $lettreprec){
                            echo "<img src=\"img/lettres_fiches/".$lettrecour.".gif\" width=\"28\" height=\"30\" border=\"0\">";
                            $genre = ucfirst($genre);
                            echo "<p><font face=\"Arial\"><span onClick=\"visibilite('".$genre."');\" style=\"font-size:10pt;cursor:pointer;\"><b>".$genre."</b></span></font></p>";
                            $genre = strtolower($genre);
                            ///// liste des genres avec espece au clic
                            echo "<div id=\"".$genre."\" style=\"display:none\">";
                            
                            }
                            $genre = ucfirst($genre);
                            echo "<p><font face=\"Arial\"><span style=\"font-size:10pt;\">".$genre." ".$espece."</span></font></p>";
                            if(!$lettrecour != $lettreprec){
                            echo "</div>";
                            }
                            $lettreprec = $lettrecour;
j'ai remplacé
 if(!$lettrecour == $lettreprec)
par
 if($lettrecour != $lettreprec)
Quelle est cette diffèrence de synthaxe ?

Eléphant du PHP | 141 Messages

21 mars 2009, 13:20

j'ai remplacé
 if(!$lettrecour == $lettreprec)
par
 if($lettrecour != $lettreprec)
Quelle est cette diffèrence de synthaxe ?
Pour moi, la seule différence est en terme de lisibilité.
J'utilise toujours '!='
On voit directement que c'est le comparateur d'inégalité...

Mais après c'est chacun ses préférences

Mammouth du PHP | 686 Messages

21 mars 2009, 13:29

Si c'est la même chose, pourquoi une synthaxe fonctionnait et pas une autre ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 mars 2009, 13:36

Dans le cas présent, ce n'est pas qu'une question de préférence. Le résultat ne sera pas le même du fait de la priorité de l'opérateur "!" par rapport à l'opérateur "==".

La syntaxe
if ($lettrecour != $lettreprec)
// => Si $lettrecour est différent de $lettreprec
est équivalente à
if ( ! ($lettrecour == $lettreprec) )
//=> Si l'expression ($lettrecour est égale à $lettreprec) est fausse
Dans ce cas là, c'est effectivement une question de préférence, et c'est quand même préférable pour la compréhension et la lisibilité d'avoir une affirmation que 2 négations ;)

En revanche l'instruction
if (!$lettrecour == $lettreprec)
est très différente. En effet, sans les parenthèses de l'exemple précédent, l'opérateur "!" s'applique en priorité, avant la comparaison et peut s'exprimer ainsi :
=> Si le contraire de $lettrecour est égal à $lettreprec.

PHP va dans ce cas interpréter la varibale $lettrecour comme étant un booléen (quel que soit son contenu) et en déterminer le contraire (si le contenu est 0, false, vide etc. le contraire sera TRUE, sinon le contraire sera FALSE). Et c'est seulement ensuite qu'il va comparer la valeur TRUE/FALSE à celle contenue par $lettreprec, causant un résultat très différent de ce que tu aurais pu attendre :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 141 Messages

21 mars 2009, 13:36

Priorité des opérateurs.
La syntaxe similaire était :
if (!($lettrecour == $lettreprec)) {}
Donc oui le mieux c'est de mettre != ;)

Mammouth du PHP | 686 Messages

21 mars 2009, 13:52

Merci ! :D