2010-07-28 34 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(); 
相关问题