【问题标题】:PDO: Call to a member function fetch() on a non-object? [duplicate]PDO:在非对象上调用成员函数 fetch()? [复制]
【发布时间】:2011-03-21 22:43:49
【问题描述】:

我只是在尝试 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);

    }

}

【问题讨论】:

    标签: php pdo


    【解决方案1】:

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

    PDO::query() 返回一个 PDOStatement 对象,或 FALSE 失败。

    重要的一点是“失败时为 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 获取大量信息/描述。写得很好,描述得很好。
    【解决方案2】:

    我会说您的查询由于语法错误而没有执行。你真的应该检查 PDO 的 errorinfo 静态函数,看看查询是否出错。

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

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

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

    【讨论】:

    • 如果您使用的是 Microsoft SQL Server,则保留字的使用方式为 [time]。
    【解决方案3】:

    当表也不存在时会发生这种情况。确保它确实存在,并且不只是由于硬盘驱动器错误而成为数据库中的持有者。

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

    【讨论】:

      【解决方案4】:

      由于括号的愚蠢错误,我收到了此错误消息。它嵌套在 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();
      

      【讨论】:

        猜你喜欢
        • 2012-08-21
        • 2011-10-16
        • 1970-01-01
        • 2016-03-25
        • 1970-01-01
        • 2013-10-01
        • 2011-07-17
        • 1970-01-01
        相关资源
        最近更新 更多