2017-02-21 118 views
2

我找到了解决我的问题,但这更多的是为什么问题。这里是我的情况..PHP PDO SQL_CALC_FOUND_ROWS/FOUND_ROWS()奇怪的问题

我使用的是含有记录成千上万的表下面的代码:

$stmt = $pdo->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM ... LIMIT 10;"); 
$stmt->execute(); 
echo $pdo->query("SELECT FOUND_ROWS();")->fetchColumn(); # outputs 0 

上述应该输出的记录的实际数量,而是它输出0

现在,如果我在SQL_CALC_FOUND_ROWS的末尾添加尾随空格查询它工作正常..

... LIMIT 10; "); 

任何想法,为什么会?

UPDATE

我试着不使用PDO的准备运行查询,它似乎只是正常工作以及..

$stmt = $pdo->query("SELECT SQL_CALC_FOUND_ROWS * FROM ... LIMIT 10;"); 
echo $pdo->query("SELECT FOUND_ROWS();")->fetchColumn(); # works properly 

我仍然在试图重现这对较小的水平,以便其他人可以尝试一下,看看它是否发生。

更新2

那么最接近我能得到再现这个问题是使用下面的代码:

# not working.. 
$stmt = $pdo->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM `table` LIMIT 10"); 
$stmt->execute(); 
echo 'COUNT1: ' . $pdo->query("SELECT FOUND_ROWS()")->fetchColumn() . '<br>'; 

# working (notice the space before SELECT).. 
$stmt = $pdo->prepare(" SELECT SQL_CALC_FOUND_ROWS * FROM `table` LIMIT 10"); 
$stmt->execute(); 
echo 'COUNT2: ' . $pdo->query("SELECT FOUND_ROWS()")->fetchColumn() . '<br>'; 

# output (from my database) 
# COUNT1: 0 
# COUNT2: 182020 

这只是发生在周围至少包含较大的表〜50 MB数据。我无法在本地重现这一点,所以我认为这是服务器上的某种配置。下面是我使用的是什么..

  • 红帽企业Linux服务器版本7.1(米埔)
  • Server版本:阿帕奇/ 2.4.6
  • 的MySQL版本14.14 DISTRIB 25年5月6日,对于Linux(x86_64的使用EditLine包装
  • PHP 5.4.16(CLI))

任何想法/想法是最欢迎!也想知道如果有人能够成功地重现这个问题(记得要在更大的桌子上测试它)..

+0

尝试var_dump($ pdo-> query(“SELECT FOUND_ROWS();”) - > fetchColumn();)'而不是'echo' – bassxzero

+0

http:// stackoverflow。com/questions/186588/which-is-faster-select-sql-calc-found-rows-from-table-or-select-count – RiggsFolly

+0

我猜测它与包含在最后的不必要的分号有关SQL文本。为什么在LIMIT 10后面有分号? – spencer7593

回答

1

看起来好像罪魁祸首是New Relic。我迅速禁用了守护进程,看看是否这是问题,并且计数再次完美。

找到我的答案在这里:PHP PDO returning inconsistent results for SELECT FOUND_ROWS()

我决定换我的查询与在开始和结束一个空格(只是刚刚开始是必要的)。请注意,“\ n”字符也适用。这样我就不必惹恼New Relic配置。

谢谢New Relic!