致命错误:在第8行的C:\ xampp \ htdocs \ cms \ include \ article.php中调用非对象的成员函数prepare()

时间:2013-05-04 09:53:45

标签: pdo

我收到此错误,想知道如何修复它? 这是我试图将我的文章添加到Feed中的时候。         

class Article {
    public function fetch_all() {
        global $pdo;


        $query = $pdo->prepare("SELECT * FROM articles ORDER BY `article_id` DESC");
        $query->execute();

        return $query->fetchAll();
    }

    public function fetch_data($article_id) {
        global $pdo;

        $query = $pdo->prepare("SELECT * FROM articles WHERE article_id = ?");
        $query->bindValue(1, $article_id);
        $query->execute();

        return $query->fetch();
    }
}

    ?>

2 个答案:

答案 0 :(得分:0)

在您调用它时,

$pdo未定义。你需要先创建它。

答案 1 :(得分:0)

不要使用global次尝试。这不是OOP设计,也是您的代码失败的原因之一。相反,确定目前已创建$pdo,然后将其传递给Article的构造函数。

进一步注意所谓typehints的能力。使用它们时,您可以为方法参数强制执行特殊类型。如果在运行时传递另一个值(如NULL或其他),PHP将抛出错误:

    typehint-----------------|
public function __construct(PDO $pdo) {
    $this->pdo = $pdo;
}

示例:

class Article {

    protected $pdo;

    // the type hint this makes !!SURE!! PDO is connected
    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
    }

    public function fetch_all() {

        $query = $this->pdo->prepare("SELECT * FROM articles ORDER BY `article_id` DESC");
        $query->execute();

        return $query->fetchAll();
    }

    public function fetch_data($article_id) {
        // note this:
        $query = $this->pdo->prepare("SELECT * FROM articles WHERE article_id = ?");
        $query->bindValue(1, $article_id);
        $query->execute();

        return $query->fetch();
    }
}

这样称呼:

$pdo = new PDO($connectionString, $user, $pass);
$article = new Article($pdo);

var_dump($article->fetch_data($someId));