该表大约有 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/