2009-04-20 79 views
5

所以我一直使用PHP的PDO作爲一會兒我的數據庫轉到類現在,不幸的是今天調試了一會一個客戶端的服務器(與PHP 5.2.6後安裝)我發現this。我們嘗試升級到最新的穩定版本(5.2.9),但問題依然存在。PDO的rowCount時()在PHP 5.2.6+不工作

有沒有人找到解決方法?

+0

我不確定你在找什麼,你打電話給affected_rows(),並返回一個選擇語句爲零?選擇不會影響任何行。 – 2009-04-20 19:43:54

+0

我在去年尋找一個相當於mysql_num_rows() – 2009-04-20 20:43:38

+0

的PDO,你是如何解決的? – Strae 2010-06-21 18:46:52

回答

6

您可以通過使用the FOUND_ROWS() function,不知道是否有沒有更好的方法做到這一點通過MySQL的本身。

編輯:似乎MySQL的唯一可能的原因是它內部獲取所有結果行並緩存它們,以便能夠爲您提供此信息。請參閱mysql_unbuffered_query()。如果您使用該功能而不是mysql_query(),那麼mysql_num_rows()功能將不起作用。如果您確實需要知道使用PDO時的行數,則可以將PDO中的所有行讀取到數組中,然後使用count()

1

注意,您不應該對SELECT查詢使用rowCount(),因爲PDOStatement-> rowCount()返回受相應PDOStatement對象執行的最後一個DELETE,INSERT或UPDATE語句影響的行數。

相反,你可以使用使用fetchall()到一個數組,然後計數()。

8

該數據庫可以給你的行數的計數的唯一方法是通過運行查詢和計算的行數。

MySQL擴展默認使用的緩衝查詢模式使控制返回到PHP之前,它可以開始處理的行整個數據集要被取出到存儲器。

PDO使用默認的緩衝模式導致更低的延遲在頁面加載時間,通常是你想要的。權衡是rowCount()在獲取完整數據集之前不會返回有效信息。

那麼你如何得到這個數字呢?

簡單:

$q = $db->query("SELECT ..."); 
$rows = $q->fetchAll(); 
$rowCount = count($rows); 
echo "There are $rowCount rows\n"; 
foreach ($rows as $row) { 
    print_r($row); 
} 

但是,吮吸,因爲它查詢所有的行前面,使我的網頁加載速度較慢,舊的MySQL擴展沒有這個問題!?

但是,這正是舊的mysql擴展實際上是在蓋下;這是獲得這一數字的唯一方法。