while($ row = mysql_fetch_array($ query))在第二次不起作用

时间:2012-03-14 09:19:17

标签: php mysql while-loop

我有:

$query = mysql_query("SELECT ... ");
while($row = mysql_fetch_array($query)) { first time used; }
...
while($row = mysql_fetch_array($query)) { second time used; }

第二次它不起作用。为什么呢?

4 个答案:

答案 0 :(得分:6)

MySQL结果资源有一个内部指针,就像PHP数组一样,当你运行一次时,指针就在最后。您可以使用mysql_data_seek()重置数据指针:

while ($row = mysql_fetch_array($query)) {
  // First time used
}
mysql_data_seek($query, 0);
while ($row = mysql_fetch_array($query)) {
  // Second time used
}

... 可以说是更好/更“标准”的方法是通过指针运行一次,将结果存储在临时数组中,然后你可以释放由结果并将数据循环为数组:

// Do the query
$query = mysql_query("SELECT ... ");

// Cache the results in an array
$results = array();
while ($row = mysql_fetch_array($query)) {
  $results[] = $row;
}

// Free the result resource
mysql_free_result($query);

foreach ($results as $row) {
  // First time used
}
foreach ($results as $row) {
  // Second time used
}

作为旁注,使用mysql_fetch_assoc()mysql_fetch_row()提高资源效率 - 几乎每个用例只调用mysql_fetch_assoc(),为索引键索引的情况非常罕见MySQL结果,甚至不太常见,你需要索引关联。

答案 1 :(得分:1)

它第二次无效,因为您已经检索了所有行。因此它返回false。

答案 2 :(得分:0)

使用mysql_data_seek()

将结果指针重置为结果集的开头,然后再循环第二次
mysql_data_seek($query,0)

答案 3 :(得分:0)

您已经检索了所有行,因此您必须运行另一个查询,或者您可以将第一个循环中的值推送到数组中,然后在第二次输出该数组时显示相同的数据。 / p>

或者使用mysql_data_seek()