2010-12-28 13 views
1

私はいくつかのJavaScriptを生成するために書いているPHPスクリプトで混乱しているものを見つけました。ここではこれを少し簡略化して示します。whileループのリセット

最初のwhileループ全体をコメントアウトしない限り、2番目のwhileループは実行されません。なぜ誰かが説明できますか?どうもありがとう。

<?php 
$listid = 2; //DEMO ONLY 
$result1 = mysql_query("SELECT words.wid,words.wordmd5,words.word FROM words,instances WHERE words.wid = instances.wid AND instances.lid = \"$listid\""); 
$result1copy = $result1; 

$count1 = 1; 
while($row = mysql_fetch_object($result1)) 
{ 
print "words_left[$count1] = \"".$row->word."\";\n"; 
//Increment the array counter (starts at 1) 
$count1++; 
} 
?> 

//Some javascript 

    <?php  

    $count2 = 1; 
while($row = mysql_fetch_object($result1copy)) 
{  
print " 
    $count2 then $row->wordmd5 
";  
$count2++; 
} 
?> 
+0

無限ループです。 '$ count1'をインクリメントしていますが、' while'ループは '$ row'をテストしています。これは常にtrueを返します。 – Kai

+2

@Kai:$ rowは常に真ではなく、すべてのレコードが処理されたときにnullになります。 – Chetan

答えて

3

what T.J. Crowder already saidに加えて、mysql_data_seek($result1, 0)は、2つのループの間でジョブを実行して、内部イテレータをリセットします。

+0

それは治療に効果があります。ありがとう。それはなぜ機能するのですか? –

+0

@Patrick: 'mysq_data_seek'は、データセット内の内部行ポインタを特定のポイントに移動します。この場合、結果セットの先頭である行0に移動します。 – Powerlord

+0

多くのありがとう –

4

あなたはコピー結果セット、あなただけの結果セットに2つの参照になってしまってきていません。基礎となる結果セットオブジェクトは、使用するリファレンスに関係なく同じであるため、2番目のループが開始されるまでにすべてのレコードを処理しています。

おそらく単一のループを使用して、配列に出力するデータを記録しておくことに変わります。代わりに、as Flinsch points outの場合はmysql_data_seekを使用して、バッファリングされたクエリを使用しているため、結果セットの先頭に戻ることができます。

+0

どうすればそれを完全にコピーできますか? –