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

标签 php mysql

该表大约有 120 万行(它正在积极增加,因此总行数在此测试的迭代之间略有增长,但这不会改变结果)。

mysql_num_rows 显示 - 这是准确的,使用 select count(*) 测试 - 在拉取查询之后显示结果集有多大。

然后,循环使用 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,然后停止...

如果我现在输入 limit = 967356,1000000,我会得到:

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

这与恰好 1/2 方式相差 1。

限制 = 1000000, 1000000:

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

这到底是什么东西?

PHP 信息:

php -v PHP 5.4.19-1+debphp.org~precise+3 (cli)(构建时间:2013 年 8 月 27 日 14:29:42) 版权所有 (c) 1997-2013 The PHP Group

最佳答案

为了避免在 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)

关于php - 当指针恰好位于 mysql_num_rows 的 1/2 时,mysql_fetch_array 返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19458964/

相关文章:

php - 如何测试外键链接的表?

php - 在多个数据库上执行一个 MySQL 查询

mysql - MyISAM 表索引文件经常崩溃!

PHP 搜索获取字段中存在数据的位置

php - 用户在表单中插入日期

php - URL 中的日期 dd/mm/yyyy

php - 如何在 php 中将数组值作为键值对插入到数据库表中

mysql - 如何在没有for循环的情况下插入一批空行?

mysql - 使用 join 和 group by 对同一个表进行 SQL 查询

MYSQL 删除字符串中的第一个逗号