2011-04-05 50 views
1

我剛更改了數據庫連接。我不習慣PDO類或OOP。無論如何,我連接到數據庫這樣的:在php中獲取num_rows與PDO類的問題

 $dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME; 
     try 
     { 
      $this->db = new PDO($dsn, DB_USER, DB_PASS); 
     } 
     catch (Exception $e) 
     { 
      die ($e->getMessage()); 
     } 

我試圖從該查詢得到的行數:

$ip = $this->ip(); 
    $sql = "SELECT `id` FROM `login_failed` 
      WHERE `ip` = :ip AND `time` BETWEEN NOW() - INTERVAL 120 MINUTE AND NOW() 
      LIMIT 3"; 
    try 
    { 
     $stmt = $this->db->prepare($sql); 
     $stmt->bindParam(':ip', $ip, PDO::PARAM_STR); 
     $result = $stmt->execute(); // $result = true 
     $n = $stmt->num_rows ; // n = NULL? 
     $stmt->closeCursor(); 
    }  
    catch (Exception $e) 
    { 
     die ($e->getMessage()); 
    } 

phpmyadmin我得到的結果,所以我的查詢是正確的,但$nNULL由於某種原因..我如何獲得行數PDO

回答

12

$stmtPDOStatement類型。該類沒有num_rows屬性。

你可能會尋找rowCount代替,但該文件指出:

如果 相關PDOStatement對象是 SELECT語句最後執行的SQL語句,有些數據庫 返回的數量該行由 返回的行。但是,對於所有的 數據庫,並不保證該 行爲,對於便攜式應用程序不應該依賴 。

的長和短,如果是,如果要真正地SELECT所有這些數據,您可以可靠地確定多少行通過循環的結果集返回(或只是調用fetchAll和計數的項目在數組中)。如果您不需要數據但只需要一個數字,請改爲使用SELECT COUNT

所以,算上行,而不更改查詢:對於比我快,同時還管理還包括根據rowCount免責聲明

$result = $stmt->execute(); 
$rows = $stmt->fetchAll(); // assuming $result == true 
$n = count($rows); 
+0

+1。 – Charles 2011-04-05 18:25:04

+3

@Charles:皮膚只有很多種方法去皮膚...... *非常相似的反應。如果僅僅因爲被如此懲罰,我會得到你的任何機會:) – Jon 2011-04-05 18:27:31