【问题标题】:PHP - Multiple while($row = mysql_fetch_array($variable)) { } ERRORSPHP - 多个 while($row = mysql_fetch_array($variable)) { } 错误
【发布时间】:2012-02-29 01:18:17
【问题描述】:

好的,我的语法可能不用代码就可以描述。基本上它应该很容易......但从来都不是。

我连续有 2 个循环......基本上是一样的。我从我的数据库中选择 * 每个变量,然后我需要基于两个 sep 构建一个 2 层 javascript。变量。

所以

我有:

while ($row = mysql_fetch_array($myVariable)) {

// do events

}

然后

while ($row2 = mysql_fetch_array($myVariable)) {

// do events

}

由于某种原因,它在第二个上完全没有返回任何内容...是否有一些地方我需要重置我的阵列,它是否可能结束,然后我不能只是重新启动。这样一个基本的问题,但我无法弄清楚我的生活还有什么问题。所以这就是问题所在,这是一个一般性问题,即连续执行两次并期望 PHP 每次都在 $myVariable 的开头重新开始,其中包含我的 SELECT 语句?

谢谢...将全天检查并根据需要进行更新。第一次使用 Stack Overflow,我很想看到帮助。

【问题讨论】:

标签: php mysql while-loop


【解决方案1】:

问题是查询返回resource。这个资源有它自己的内部指针(用来记住要返回哪一行的计数器)。 mysql_fetch_array 将推进该内部指针并一次从资源返回每一行。一旦它在最后(没有更多的行),它返回false。所以在最后一个循环中, $row 等于 false 退出 while 循环。虽然指针没有重置。因此,在下一个 while 循环中,您调用 mysql_fetch_array,指针位于末尾,因此它返回 false,这完全绕过了第二个 while 循环。您应该做的是遍历数据一次并将每一行存储到一个数组中。然后,您可以根据需要复制/循环数组,一切都按预期工作。

$data = array();
while ($row = mysql_fetch_array($myVariable)) {
    $data[] = $row;
}
//now $data has all the rows. a simple foreach will loop over the data.
foreach($data as $row){
    //do events
    print_r($row);
}

//and you can loop over data again and again.
foreach($data as $row){
    //do events
    print_r($row);
}

【讨论】:

    【解决方案2】:

    在第二个循环之前,尝试使用mysql_data_seek()

    mysql_data_seek($myVariable, 0);
    

    需要重新设置记录集中的指针,否则仍会提示已结束。

    正如 ZiTAL 指出的那样,将记录存储在数组中并遍历数组可能是一个更好的选择。

    【讨论】:

    • 我更喜欢这个选项。当您可以将指针重置回起点时,无需将数据放入数组中。基本上,当您只需要一个数组时,您只是创建了两个数组,因此使用了更多内存!
    • @AngusWalker 我想我应该在潜在的可读性/可维护性方面有资格“更好”。正如所写,它是模棱两可的。
    【解决方案3】:

    如果您的循环是嵌套的,并且假设 $myVariable 对于两个循环是相同的,只需复制它,然后每次循环遍历不同的副本。

    $myVariable = mysql_result($query);
    $myVariable2 = $myVariable;
    
    while ($row = mysql_fetch_array($myVariable)) {
        while ($row = mysql_fetch_array($myVariable2)) {
    ...
    

    “使它成为一个数组”的另一个 +1,但更好地使用。

    【讨论】:

    • 我的印象是提问者的循环没有嵌套。但如果他们是,你有一个很好的观点。
    • 我主要发布这个以防它们嵌套,然后完全忘记提及哈哈。很好的收获:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2012-07-31
    • 1970-01-01
    • 2015-08-05
    • 2012-03-30
    • 2011-12-07
    • 2012-02-13
    相关资源
    最近更新 更多