problème de boucle

Petit nouveau ! | 3 Messages

06 juin 2008, 20:20

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"; }

ViPHP
ViPHP | 1996 Messages

06 juin 2008, 23:34

Tu as quoi dans $res ?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Petit nouveau ! | 3 Messages

07 juin 2008, 09:06

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?

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

07 juin 2008, 13:30

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"; 
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 3 Messages

09 juin 2008, 17:53

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