在非对象上调用成员函数fetchAll()

时间:2014-04-21 18:08:45

标签: php mysql oop object pdo

我不知道它为什么会返回Call to a member function fetchAll() on a non-object错误,因为我在_sth对象上使用了fetchAll方法。

有人知道为什么这样做吗?

FormValidator PHP

$users = $this->_db->query("SELECT * FROM $ruleValue WHERE $input = ?", array($inputValue));
if($users->count()) {
    $this->addError($input, $rule);
}

方式

public function query($sql, $params = array()) {
    $this->_sth = $this->_dbh->prepare($sql);

    if($this->_sth = $this->_sth->execute($params)) {
        return $this->_sth->fetchAll(PDO::FETCH_OBJ);
    }

    return false;
}

2 个答案:

答案 0 :(得分:3)

if($this->_sth = $this->_sth->execute($params)) {

=是赋值运算符。 execute()返回布尔值TRUE或FALSE,然后您将其分配给$this->_sth

    return $this->_sth->fetchAll(PDO::FETCH_OBJ);

TRUE和FALSE都不是对象,并且没有fetchAll()方法。

来自@RocketHazmat的评论是正确的,您可以测试execute() 的返回值,而无需将其分配给_sth。例如:

if($this->_sth->execute($params)) {
    return $this->_sth->fetchAll(PDO::FETCH_OBJ);
}

答案 1 :(得分:1)

正如我已经说过,有两个巨大的缺陷。

  1. 不要在班上介绍州。使用局部变量并返回结果。
  2. 在>中, 不应该是单个变量
  3. 请勿在

    中介绍州
    public function query($sql, $params = array()) {
        $sth = $this->_dbh->prepare($sql);
        $sth->execute($params);
        return $sth->fetchAll(PDO::FETCH_OBJ);
    }
    

    就是你需要的一切。

    不要偷懒,写完整查询。

    $user = $this->_db->query("SELECT * FROM users WHERE param = ?", [$inputValue]);
    if($user) {
        $this->addError($input, $rule);
    }