PDO:在非对象上调用成员函数fetch()?

时间:2010-07-28 03:06:28

标签: php pdo

我只是尝试PDO而且我得到了这个错误,致命错误:在非对象上调用成员函数fetch(),但是它不是已经在$ this-> db对象上了吗?

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);

    }

}

4 个答案:

答案 0 :(得分:17)

仔细查看PDO::query的文档,特别是“返回值”部分:

  

PDO :: query()返回PDOStatement   对象,或失败时为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);

答案 1 :(得分:1)

我会说由于语法不正确,您的查询未执行。您应该检查PDO的errorinfo静态函数以查看查询是否出错。

这是一个可能正确的SQL语句:

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

我相信时间是MySQL中的一个保留字我建议使用不同的名称,但将其包含在反引号中可以缓解这个问题。 1个等号用于mysql,而不是两个。但是,请查看errorinfo函数以确定您的查询是否因语法错误而失败并正常处理它。

答案 2 :(得分:-1)

当表不存在时也会发生。确保它确实存在,并且由于硬盘错误而不仅仅是数据库中的持有者。

当发生这种情况时,我建议您重新创建数据库/表。

答案 3 :(得分:-1)

由于带括号的愚蠢错误,我收到此错误消息。它嵌套在if语句中,只是没有看到它。

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

我花了一段时间才弄清楚我没有在正确的位置关闭db_query括号。也许它可以帮助别人盯着这个想知道的问题。正确的:

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