Second while loop not running. Why?

不想你离开。 提交于 2019-12-02 03:51:07

问题


I have two while loops running one after the other (not inside of each other) - I've simplified the code a bit so that only the important parts of it are listed below. The problem arises when I compare the two echoed queries because the 2nd while loop apparently isn't running at all.

I read somewhere that someone got around the problem by using a for loop for the second one but I want to get down to why exactly the second while loop is not running in my code.

$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;

回答1:


The MySQL extension keeps track of an internal row pointer for each result. It increments this pointer after each call to mysql_fetch_assoc(), and is what allows you to use a while loop without specifying when to stop. If you intend on looping through a result set more than once, you need to reset this internal row pointer back to 0.

To do this, you would mysql_data_seek() after the first loop:

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



回答2:


You've already looped through the result rows, so it's at the end and returns FALSE. (That's why it exited the loop the first time.)

To reset the internal pointer to the beginning of the result set, use mysql_data_seek().

mysql_data_seek($result_work_id, 0);



回答3:


After the first while() loop completes, the internal pointer in the MySQL result is at the end of itself. You need to tell it to go back to the beginning using mysql_data_seek() between the first and second loops:

mysql_data_seek($result_work_id, 0);



回答4:


You have already reached the end of your result set, but you can use mysql_data_seek to reset it.

// 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))) {
}



回答5:


According to your posted code, your SQL will look something like:

SELECT title FROM works WHERE OR '1'

That query will result in an error so your script shouldn't be getting past that point.

Even if it does, your second loop:

while ($row = mysql_fetch_assoc($result_work_id))

is using a result handle that has already been completely iterated by the first loop. By the the time the second loop tries to use it, mysql_fetch_assoc will return FALSE because there are no more rows to fetch. This will cause the second loop to exit immediately.

If both while loops need to access the same rows, combine their logic so the rows only need to be iterated over one time.




回答6:


mysql_fetch_assoc steps through the results, right? It's already at the end on the second while loop, so it does nothing.



来源:https://stackoverflow.com/questions/8333145/second-while-loop-not-running-why

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!