1

我目前正在尝试按如下方式传递数据库连接:

class Test {
    public $user;
    public $db;

    function __construct() {
        // connect to database
        try {
            $this->db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_DATABASE.'', DB_USERNAME, DB_PASSWORD);
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $err) {
            die($err->getMessage());
        }
        $this->user = new User($this->db);
    }
}

class User {
    public $db;

    function __construct($db) {
        $this->db = $db;
    }

    // execute some query
    $sql = "SELECT * FROM test";
    $sth = $this->db->prepare($sql);
    $sth->execute();
    $result = $sth->fetch();
    if(!empty($result)) {
        echo '<pre>';
        var_dump($result);
        echo '</pre>';
    }
}

但我得到:致命错误:在非对象上调用成员函数 prepare()。我究竟做错了什么?

4

1 回答 1

1

你已经得到了正确的传递 db-to-class-constructor 部分。

但这不是您编写的有效类定义。您需要将这些代码行(以下// execute some query)放入一个函数中。代码行不能存在于它们所在的位置,在 User 类内部而不是函数内部浮动。这不是合法的PHP。

您还应该在每次调用 prepare() 或 execute() 后检查错误状态。如果出现错误(如 SQL 语法错误或表不存在等),它们将返回 FALSE。

class User {
    public $db;

    function __construct($db) {
        if (! $db instanceof PDO) { die("What are you trying to pull anyway?"); }
        $this->db = $db;
    }

    function doSomething() {
        // execute some query
        $sql = "SELECT * FROM test";
        $sth = $this->db->prepare($sql);
        if ($sth === false) {
            die(print_r($this->db->errorInfo(), true));
        }
        $status = $sth->execute();
        if ($status === false) {
            die(print_r($sth->errorInfo(), true));
        }
        $result = $sth->fetch();
        if(!empty($result)) {
            echo '<pre>';
            var_dump($result);
            echo '</pre>';
        }
    }
}
于 2012-12-10T00:00:52.860 回答