2010-03-15 8 views
0

J'ai une boucle php qui affiche un seul enregistrement même s'il y en a des centaines.PHP While() Stop Looping

Voici le code:

<?php 

$result1 = mysql_query("SELECT * FROM posts") or die(mysql_error()); 
$numexem = mysql_num_rows($result1); 
$s="0"; 

while($s<$numexem){ 
$postid=mysql_result($result1,$s,"id"); 
echo "Post id:".$postid; 

$result2 = mysql_query("SELECT * FROM pics WHERE postid='$postid'") or die(mysql_error()); 
$rows = mysql_fetch_array($result2) or die(mysql_error()); 
$pnum = mysql_num_rows($result2); 

echo " There is ".$pnum." Attached Pictures"; 

$s++; 
} 

?> 

Je me demande si l'arrêt de la boucle, car il y a d'autres requête SQL à l'intérieur ou quoi? et je ne pense pas.

Merci

Répondre

2

je suggère une approche plus traditionnelle:

$result1 = mysql_query("SELECT * FROM posts") or die(mysql_error()); 
while ($row = mysql_fetch_assoc($result1)) { 
    ... 
} 

Aussi, ne le font pas toutes ces requêtes subordonnés. À la place:

$sql = <<<END 
SELECT *, (SELECT COUNT(1) FROM pics WHERE postid = p.postid) pic_count 
FROM posts p 
END; 
$res = mysql_query($sql) or die($sql . ': ' . mysql_error()); 
while ($row = mysql_fetch_assoc($res)) { 
    echo "$row[postid] has $row[pic_count] pictures\n"; 
} 
0

Non, ce n'est pas le cas. Par défaut, le module MySQL PHP prefetches toutes les lignes qui correspondent à votre requête, donc il n'y a rien à craindre dans votre code. Cependant, l'exécution d'une centaine de requêtes peut prendre beaucoup de temps. Vous préférez recueillir tous les ID de votre première boucle, puis effectuez une seule requête en utilisant l'opérateur SQL IN et obtenez ces résultats après. Evitez autant que possible les requêtes "imbriquées".