Page 1 sur 1

problème de boucle

Posté : 06 juin 2008, 20:20
par muffler
je suis un peu perdu (et très débutant): j'ai 2 instructions dans une boucle mais le résultat est comme si j'avais 2 boucles qui se suivent. résultat, au lieu d'avoir un affichage genre
A
Aeon flux
Alien
B
Bazooka jos
C
...

j'ai
A
B
C
Aeon flux
Alien
Bazooka jos


Code : Tout sélectionner

$lettre="A"; for ($i=0;$i<$nbfilms; $i++) { $ligne=mysql_fetch_array($res); extract($ligne); $titre=ucfirst($titre); //afficher lettre $titre0=substr($titre,0,1); if ($titre0 > $lettre ) { $lettre=$titre0; echo $lettre; } echo "<tr width='600'> <td>$titre</td> <td>$format</td> <td>$classification[$genre]</td> <td>$id</td> <td>$pret</td> </tr>\n"; }

Posté : 06 juin 2008, 23:34
par Aureusms
Tu as quoi dans $res ?

Posté : 07 juin 2008, 09:06
par muffler
Tu as quoi dans $res ?

Code : Tout sélectionner

$rq="SELECT * FROM ligne ORDER BY titre"; $res=mysql_query($rq) or die ("requête impossible");
l'affichage sans le test de lettre fonctionne normalement. je comprend pas du tout le problème de la boucle (j'ai fait du cobol, basic, pascal dans les années 80 mais c'est loin!).

un ami-msn a ma fille a réussi à me dépanner avec cette imbrication de boucles:

Code : Tout sélectionner

<?php $classification=array("guerre", "comédie", "drame", "sci-fi", "aventure", "action", "spectacle", "divers", "policier", "animation"); $rq="SELECT * FROM ligne ORDER BY titre"; $res=mysql_query($rq) or die ("requête impossible"); $nbfilms=mysql_num_rows($res)." films dans la base"; echo "<b>$nbfilms</b><br><br>"; for ($letters = range('A','Z'), $i=0; isset($letters{$i}); $i++) { $sql = "SELECT * FROM ligne WHERE titre LIKE '".$letters{$i}."%'"; $resultat = mysql_query($sql) or die ("requete impossible"); echo ' <table width="600" border="0 cellspacing="30"> <b>'.$letters{$i}.'</b>'; while($ligne = mysql_fetch_array($resultat)) { extract($ligne); $titre = ucfirst($titre); echo ' <tr> <td width="300">'.$titre.'</td> <td width="20">'.$format.'</td> <td width="60">'.$classification[$genre].'</td> <td width="60">'.$id.'</td> <td width="100">'.$pret.'</td> </tr>'."\n"; } echo '</table>'."\n"; } ?>
sauf que je comprend pas plus pourquoi la boucle de mon code fait l'instruction #1 au complet puis la #2 sans les alterner?

ps: je remarque une requête ajoutée dans la boucle du 2eme code, est-ce que ça pourrait avoir rapport?

Posté : 07 juin 2008, 13:30
par Ryle
hum.. faudra dire à l'ami de ta fille de passer nous voir pour qu'on lui donne quelques cours d'optimisation... Il liste d'abord et tous les enregistrements de ta table juste pour en connaitre le nombre, puis va exécuter 26 requêtes pour les relire à nouveau initiale par initiale....

Ton code était bien mieux construit, le problème venait simplement du code html généré. En effet, tu es au milieux d'un tableau, du coup lorsque tu affiches l'initiale, il te faut créer une ligne et une cellule et pas le balancer comme ca entre deux balises <tr> :)
Le navigateur ne sachant absolument pas quoi faire ni où afficher ton initiale, il les liste au dessus du tableau, en espérant que ca te fera plaisir ;) Affiche ta lettre sur une ligne dédiée et ton problème sera normalement résolu :)
//afficher lettre 
$titre0=substr($titre,0,1); 
if ($titre0 > $lettre ) { 
 $lettre=$titre0; 
 echo '<tr><td colspan="5">'.$lettre.'</td></tr>'."\n"; 
} 
echo "<tr width='600'> 
<td>$titre</td> 
  <td>$format</td> 
  <td>$classification[$genre]</td> 
  <td>$id</td> 
  <td>$pret</td> 
</tr>\n"; 
}

Posté : 09 juin 2008, 17:53
par muffler
hey GROS MERCI Ryle! ça fonctionne A1!

savoir qu'on peut compter sur du support comme ça, ça aide à persévérer! merci et merci! (merde que j'ai cherché le pourquoi!)

muffler,
le gars content! :D