1

私は現在、次のようにDB接続を渡そうとしています。

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

pass-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 に答える