while znotraj whila
11 naročnikov
11 naročnikov
primer kode:
query = mysqlquery ("bla bla bla");
while ($row = mysqlfetcharray($query))
{
query2 = mysqlquery ("bla bla bla");
while ($row2 = mysqlfetcharray($query2))
{
print "nekaj";
}
print "nekaj";
}
bistvo je, da iz prvega query-ja vlečem neko novico, iz drugega pa želim dobiti komentarje te novice... problem je v tem, da mi prikaže le en komentar
zanima me, zakaj mi prvi while deluje pravilno in mi "printa" normalo, tako kot hočem... medtem ko mi drugi iz baze vrne samo zadnji vnos (po id-ju)
zanima me tudi, če je to normalno obnašanje, ali bi morala stvar izgledati drugače, pa imam jaz nekje v kodi napako...
vesel bi bil seveda kakšnega predloga za rešitev težave :)
22 odgovorov
Verjetno bi rešili ali pa vsej odpisali kar nekaj problemov če bi dal tole vrstico celo ...
query2 = mysql_query ("bla bla bla");
sicer pa while v while ok, ni pa ok če delaš toliko queryev, ker ti bo že par 10 uporabnikov ubilo server :)))))
Zgornji primer je čisto legalen, tako da če želiš da ti pomagamo boš verjetno moral dati dejansko kodo ki ti dela probleme.
zato pa poznamo v SQL-u join... če ti ni jasno, si poglej SQL manual: http://dev.mysql.com/doc/refman/5.0/en/join.html
Znotraj loopov se ne raje ne daje težkih IO operacij - kar query je. Nalovdaj podatke, ki jih rabiš z enim ali dvema poizvedbama in potem obdelaj dato.
Tole je original koda prekopirana iz datoteke... upam da se boste znašli, ker imam baje izjemno nepregledno kodo (vsaj tako pravijo drugi)... v prvem query-ju mi dela normalno LIMIT, medtem ko v drugem javi napako... oz če ga na uporabim mi prikaže
samo enega...
$query = mysql_query ("SELECT * FROM slike LIMIT 20");
while ($row = mysql_fetch_array($query))
{
$imedatoteke = $row['imedatoteke'];
$nalozil = $row['nalozil'];
$pot = $row['pot'];
$id = $row['id'];
$like = $row['like'];
$_SESSION["id"] = $id ;
$kom_query = mysql_query("SELECT * FROM komentarji WHERE idpredmeta = '$id'");
while ($kom_row = mysql_fetch_array($kom_query))
{
$kom_id = $kom_row['id'];
$kom_komentiral = $kom_row['komentiral'];
$kom_idpredmeta = $kom_row['idpredmeta'];
$kom_komentar = $kom_row['komentar'];
$kom_potslike = $kom_row['potslike'];
$comment = "
[quote]<p><div id ='slika'>
<a href='user.php?user=$kom_komentiral'><img src='profilephotos/thumb_$kom_potslike'></a>
</div></p>
<div id ='rubrike'><p><a href='user.php?user=$kom_komentiral'>$kom_komentiral</a> - $kom_komentar</p></div>
";
}
/************************************************/
/****query za to da vem kdo je stvar naložil*****/
/************************************************/
$query2 = mysql_query ("SELECT id FROM uporabniki WHERE ime = '$nalozil'");
$row2 = mysql_fetch_array($query2);
$iduporabnika = $row2['id'];
/************************************************/
/**************query za uporabniško tabelo*******/
/************************************************/
$query1 = mysql_query ("SELECT potslike FROM uporabniki WHERE id = '$iduporabnika'");
$row1 = mysql_fetch_array($query1);
$potslike = $row1['0'];
/************************************************/
print "
<p><div id ='slika'><a href='user.php?user=$nalozil'><img src='profilephotos/thumb_$potslike' alt='$imedatoteke'></a></div>
<div id ='rubrike'><p><a href='user.php?user=$nalozil'>$nalozil</a> has published a photo:</p>
<a href='photo.php?id=$id'><img src='nalozi/objavi_$pot' alt='$imedatoteke'></a>
<a href='photo.php?id=$id'>$imedatoteke</a>
<p><a href='like.php?id=$id'>L!ke!</a> $like person !</p>
<p><u>Comments:</u></p>
$comment
<p> <form method='post' action='preveri-komentar.php?get=".$id."'>
<input type='text' name='komentar' size='25' value=''>
<input type='submit' name='submit' value=' Submit ! ' />
</form>
</p></div>_____________________________________________________________________</p>";
}
oh ježešna.. toliko "napak" da je brez veze sploh komentirat :)
odgovor na tvojo vprašanje pa je to da vedno prepišeš $comment. če že hočeš rešit tako daj pred drugi while $comment = ""; in potem v zanki $comment .= podatki iz tabele
Normalno da ti izpiše samo zadnjega, saj jih ne izpisuješ v zanki? Vedno spravljaš v $comment .
Vse komentarje preberi v eno tabelo (npr. $comments[] = $comment; ) in jih potem izpiši pod izpisom novice:
foreach($comments as $c)
{
// tukaj daj html kodo za komentar
}
BTW. že če imaš html v sami php skripti (in ne npr. ločeno v template file-u), predlagam alternativno php sintakso in ločitev kode na html in php bloke.
<?php foreach($comments as $c): ?>
<div>blablabla <?=$c['avtor']?>
še neka html koda...
<?php endforeach; ?>
rnk:
Znotraj loopov se ne raje ne daje težkih IO operacij - kar query je. Nalovdaj podatke, ki jih rabiš z enim ali dvema poizvedbama in potem obdelaj dato.
Težkih? Če imaš pravilen design baze in ne izvajaš kompliciranih stikov med tabelami z dosti podatkov bi temu rekel vse prej kot težka IO operacija.
SlimDeluxe:
foreach($comments as $c) { // tukaj daj html kodo za komentar }
nisem še srečal te vrste foreacha... kaj pomeni ta $c ? ga je potrebno definirat al kako ?