2010-07-28 62 views
9

我只是嘗試PDO,我得到這個錯誤,致命錯誤:調用一個非對象的成員函數fetch(),但不是它已經在$ this-> db對象上?PDO:調用一個非對象的成員函數fetch()?

class shoutbox { 

    private $db; 

    function __construct($dbname, $username, $password, $host = "localhost") 
    { # db conections 
     try { 
      $this->db = new PDO("mysql:host=".$hostname.";dbname=".$dbname, $username, $password); 
     } 
     catch(PDOException $e) 
     { 
      echo $e->getMessage(); 
     } 
    } 

    function getShouts() 
    { 
     $sql_shouts = $this->db->query('SELECT shoutid, message, pmuserid, ipadress, time FROM shouts WHERE pmuserid == 0'); 

     return $sql_shouts->fetch(PDO::FETCH_OBJ); 

    } 

} 

回答

1

我會說你的查詢由於語法不正確而不能執行。你應該真的檢查PDO的errorinfo靜態函數來查看查詢是否出錯。

這是一個潛在的正確的SQL語句:

$sql_shouts = $this->db->query('SELECT shoutid, message, pmuserid, ipadress, `time` FROM shouts WHERE pmuserid = 0');

我相信時間是在MySQL中的保留字,我會建議使用不同的名稱,但它包裹在反引號將緩解這個問題。 1等號用於mysql,而不是兩個。但是,看看errorinfo函數,以確定您的查詢是否因語法錯誤而失敗並正常處理。

+0

如果您使用的Microsoft SQL Server保留字的方式[時間]被使用。 – Crypth 2011-10-22 11:10:27

17

仔細查看了PDO::query的文件,特別是「返回值」部分:

PDO::query() returns a PDOStatement object, or FALSE on failure.

最重要的一點是「失敗FALSE」。 FALSE不是一個對象,所以調用 - > fetch()是壞消息。

該錯誤可能是由於您使用「==」比較運算符。在SQL中,它只是「=」。

您應該測試該$sql_shouts是不是假的,然後做一些聰明與錯誤,如果有一個:

<?PHP 
$sql_shouts = $this->db->query('...'); 
if ($sql_shouts === false){ 
    $errorInfo = $this->db->errorInfo(); 
    //log the error or take some other smart action 
} 
return $sql_shouts->fetch(PDO::FETCH_OBJ); 
+2

+1爲偉大的信息/描述。很好地寫出來並描述。 – 2010-07-28 03:59:13

-1

時表不也存在着它發生。確保它確實存在,並且由於硬盤驅動器錯誤而不僅僅是數據庫中的持有者。

當發生這種情況時,我建議你重新創建數據庫/表。

-1

由於含括號的愚蠢錯誤,我收到了此錯誤消息。它嵌套在if語句中,只是沒有看到它。

​​

我花了一段時間才弄明白,我沒有在正確的位置關閉db_query括號。也許它可以幫助別人盯着這個令人困惑的問題。正確:

db_query("SELECT thing FROM table WHERE var=:var", array(":var" => $var))->fetchField(); 
相關問題