Второй цикл пока не работает. Зачем? - PullRequest
2 голосов
/ 01 декабря 2011

У меня есть два цикла 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;

Ответы [ 6 ]

5 голосов
/ 01 декабря 2011

Расширение 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);
4 голосов
/ 01 декабря 2011

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

mysql_data_seek($result_work_id, 0);
4 голосов
/ 01 декабря 2011

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

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

mysql_data_seek($result_work_id, 0);
2 голосов
/ 01 декабря 2011

Вы уже достигли конца набора результатов, но вы можете использовать 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))) {
}
1 голос
/ 01 декабря 2011

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

SELECT title FROM works WHERE OR '1'

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

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

while ($row = mysql_fetch_assoc($result_work_id))

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

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

0 голосов
/ 01 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...