当指针正好位于mysql_num_rows的1/2时,mysql_fetch_array返回false

时间:2013-10-18 20:59:52

标签: php mysql

该表大约是1.2M行(它的主动上升,因此在此测试的迭代之间总行数略有增加,但这不会改变结果)。

显示

mysql_num_rows - 这是准确的,使用选择计数(*)进行测试 - 在拉取查询之后,以显示结果集的大小。

然后,循环将行分配给具有 mysql_fetch_array()的数组。迭代计数器在每一轮都会递增,你会期望它到达 mysql_num_rows ,然后跳出while循环。非常标准的东西,已经完成了一百万次。

另一方面,实际发生的事情很奇怪。它完全达到1/2方式(floor(number_of_rows / 2))然后 mysql_fetch_array()返回false。无论你如何限制结果集......

$iteration = 0;
$result = mysql_query("select `file_id`, `size` from `files`", $dbconn); // get all records
echo "\nDone. Found " . mysql_num_rows($result) . " rows."; // Done. Found 1291595 rows.
if ($result){
    while ($line = mysql_fetch_array($result) !== false){
         $iteration++;
    }
    echo "\ngot to $iteration before mysql_fetch_array was false."; // got to 642679 before mysql_fetch_array was false.
}

有时$ line是一个空数组,有时mysql_fetch_array触发false。

它获得了mysql_num_rows,我期望并继续为总结果集大小的1/2记录,然后它停止...

如果我现在放,限制= 967356,1000000,我得到:

Done. Found 324963 rows.
got to 162482 before mysql_fetch_array was false.

这是正好1/2的方式。

limit = 1000000,1000000:

Done. Found 292606 rows.
got to 146303 before mysql_fetch_array was false.

这可能是世界上的什么?

php info:

php -v PHP 5.4.19-1 + debphp.org~precision + 3(cli)(内置:2013年8月27日14:29:42) 版权所有(c)1997-2013 PHP小组

2 个答案:

答案 0 :(得分:1)

为了避免在php将$line的值解释为false的情况下提前终止while循环,请更改行

while ($line = mysql_fetch_array($result)){

while (($line = mysql_fetch_array($result)) !== FALSE){

更新

另一种可能性是你在非常大的结果集上耗尽了内存。尝试使用mysql_unbuffered_query代替mysql_query()

另一个更新:

另一种可能性是您在此脚本中打开了多个数据库连接,而mysql_query()未使用您认为正在使用的那个。传递可选的第二个参数以确定。变化

mysql_fetch_array($result)

mysql_fetch_array($result, $dbconn)

答案 1 :(得分:1)

对不起,伙计们,我很笨。我在while循环中有第二个$ line = mysql_fetch_array($ result)...导致它为每个循环抓取2行。 Appologies。