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

Max*_*nov 1 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; }
Run Code Online (Sandbox Code Playgroud)

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

bos*_*bos 6

那是因为内部数据指针已到达终点.要重新读取查询,请使用mysql_data_seek()或重新发出查询来回滚指针.


Dav*_*dom 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
}
Run Code Online (Sandbox Code Playgroud)

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

// 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
}
Run Code Online (Sandbox Code Playgroud)

作为旁注,它使用资源效率更高,mysql_fetch_assoc()或者mysql_fetch_row()- 几乎每个用例只需要调用mysql_fetch_assoc(),对于MySQL结果的索引键是非常罕见的,甚至不太常见,你需要索引关联.