PHP:不能多次遍历mysql行

时间:2012-10-02 13:32:17

标签: php mysql

我正在进行分页,由于某种原因,我不能使用mysql_fetch_array多次循环结果。

//both $page and $imagesPerPage != 0
$offset = $page * $imagesPerPage
while ($row = mysql_fetch_array($result)) {
   $total_images++;
}
echo $total_images;
//echos correct amount
$row = null;


$images_to_offset = 0;
while ($row = mysql_fetch_array($result) && $images_to_offset < $offset) {
   $images_to_offset++;
}
echo $images_to_offset;
//echos 0... which is wrong

我应该使用不同的php函数来获取数据库中的行数据吗?

谢谢!

7 个答案:

答案 0 :(得分:8)

这是错误

while ($row = mysql_fetch_array($result)) {
   $total_images++;
}

一旦你获取数组,数组指针就会设置到最后。

使用此

 $total_images=mysql_num_rows($result);

$images_to_offset=mysql_num_rows($result);

OR

重置指针的位置使用mysql_data_seek()。它移动内部结果指针

答案 1 :(得分:4)

如果您希望在获取后从头开始提取,则需要使用mysql_data_seek()

另请注意,mysql函数系列为deprecated,社区鼓励使用而不是MySQLiPDO_MySQL行功能。

答案 2 :(得分:2)

您可以使用mysql_data_seek将指针指回第一行。

mysql_data_seek($result, 0); 

另见:http://ca2.php.net/manual/en/function.mysql-data-seek.php

答案 3 :(得分:1)

尝试使用mysql_num_rows(),这样您就不必重复$result两次,这会在第二次循环中给出错误,因为您必须重置结果指针。所以这样做只迭代一次:

//both $page and $imagesPerPage != 0
$offset = $page * $imagesPerPage
$total_images = mysql_num_rows($result);
echo $total_images;
//echos correct amount
$row = null;


$images_to_offset = 0;
while ($row = mysql_fetch_array($result) && $images_to_offset < $offset) {
   $images_to_offset++;
}
echo $images_to_offset;

作为旁注,您应该尝试迁移到MySQLi或PDO_MySQL以访问mysql,因为您正在使用的界面现已弃用,请参阅http://es.php.net/manual/en/function.mysql-num-rows.php中的红框

答案 4 :(得分:1)

你只能循环遍历结果数组一次,之后它们会有效地“消失”。多次循环结果的方法是在第一个循环中将它们存储到一个新数组中,然后根据需要循环遍历新数组...

答案 5 :(得分:1)

您必须使用mysql_data_seek函数“回放”数组:

$offset = $page * $imagesPerPage
while ($row = mysql_fetch_array($result)) {
   $total_images++;
}
echo $total_images;
//echos correct amount
$row = null;

mysql_data_seek(); // <-- rewind to the beginning

$images_to_offset = 0;
while ($row = mysql_fetch_array($result) && $images_to_offset < $offset) {
   $images_to_offset++;
}
echo $images_to_offset;

答案 6 :(得分:1)

mysql_fetch_array不仅返回与获取的行对应的数组,还将内部数据指针向前移动。

有多种方法可以解决这个问题,最明显的是将结果“停放”在数组中,然后从那里开始工作。或者查询2次。或者使用mysql_data_seek。在你的情况下,也许mysql_num_rows更合适,因为你的代码表明你只想知道你需要迭代多少行,这就是这个函数的用途。

无论做出什么决定,请记住不鼓励使用mysql扩展。相反,应该使用MySQLi或PDO_MySQL扩展。