Second while loop not running. Why?

后端 未结 6 1850
没有蜡笔的小新
没有蜡笔的小新 2021-01-15 11:37

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

相关标签:
6条回答
  • 2021-01-15 11:42

    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);
    
    0 讨论(0)
  • 2021-01-15 11:42

    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.

    0 讨论(0)
  • 2021-01-15 11:45

    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);
    
    0 讨论(0)
  • 2021-01-15 11:50

    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);
    
    0 讨论(0)
  • 2021-01-15 11:54

    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))) {
    }
    
    0 讨论(0)
  • 2021-01-15 11:55

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

    0 讨论(0)
提交回复
热议问题