2017-02-21 121 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!