У меня есть два цикла 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 проходят через результаты, правильно? Это уже в конце второго цикла, поэтому он ничего не делает.