Второй цикл while не работает. Зачем?

У меня есть два цикла while, которые выполняются один за другим (не внутри друг друга). Я немного упростил код, так что только важные его части перечислены ниже. Проблема возникает, когда я сравниваю два эхо-запросов, потому что второй цикл while, по-видимому, вообще не работает.

Я где-то читал, что кто-то обошел проблему, используя цикл for для второго, но я хочу понять, почему именно второй цикл while не работает в моем коде.

$query_work_title = "SELECT title FROM works WHERE "; while ($row = mysql_fetch_assoc($result_work_id)) { $query_work_title .= "OR '$work_id' "; } echo $query_work_title; echo '<br />'; $result_work_title = mysql_query($query_work_title) or die(mysql_error($cn)); // retrieve the authors for each work in the following query $query_author_id = "SELECT author_id FROM works_and_authors WHERE "; while ($row = mysql_fetch_assoc($result_work_id)) { $query_author_id .= "work_id = 'hello' "; } echo $query_author_id; 

Расширение MySQL отслеживает внутренний указатель строки для каждого результата. Он увеличивает этот указатель после каждого вызова на mysql_fetch_assoc (), и это то, что позволяет использовать цикл while, не указав, когда остановиться. Если вы собираетесь переходить через результирующий набор более одного раза, вам нужно вернуть этот внутренний указатель строки обратно в 0.

Для этого вы должны были бы mysql_data_seek () после первого цикла:

 while ($row = mysql_fetch_assoc($result_work_id)) { $query_work_title .= "OR '$work_id' "; } mysql_data_seek($result_work_id, 0); 

Вы уже зацикливаете строки результатов, так что они заканчиваются и возвращает FALSE . (Вот почему он вышел из цикла в первый раз.)

Чтобы сбросить внутренний указатель к началу набора результатов, используйте mysql_data_seek() .

 mysql_data_seek($result_work_id, 0); 

По завершении первого цикла while() внутренний указатель результата MySQL находится в самом конце. Вы должны сказать ему вернуться к началу, используя mysql_data_seek() между первой и второй петлями:

 mysql_data_seek($result_work_id, 0); 

Вы уже достигли конца вашего результирующего набора, но вы можете использовать mysql_data_seek для его сброса.

 // query your database $result = mysql_query(...); // loop through results while(($row = mysql_fetch_assoc($result))) { } // reset result set mysql_data_seek($result,0); // loop again while(($row = mysql_fetch_assoc($result))) { } 

Согласно вашему опубликованному коду, ваш SQL будет выглядеть примерно так:

SELECT title FROM works WHERE OR '1'

Этот запрос приведет к ошибке, поэтому ваш сценарий не должен проходить мимо этой точки.

Даже если это так, ваш второй цикл:

while ($row = mysql_fetch_assoc($result_work_id))

использует дескриптор результата, который уже был полностью повторен в первом цикле. К тому моменту, когда второй цикл попытается использовать его, mysql_fetch_assoc вернет FALSE потому что больше нет строк для извлечения. Это вызовет немедленный выход второго цикла.

Если оба цикла while должны обращаться к тем же строкам, объедините их логику, так что строки нужно будет только повторить за один раз.

Результаты mysql_fetch_assoc проходят через результаты, правильно? Это уже в конце второго цикла, поэтому он ничего не делает.