3

ここにある PHP PDO ラッパー クラスのわずかなバリエーションを使用しています: http://www.imavex.com/php-pdo-wrapper-class/

これは私が使用している新しいコンストラクタです:

public function __construct($dsn, $user='', $passwd='') {
    $options = array(
        PDO::ATTR_PERSISTENT => true, 
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    );

    try {
        parent::__construct($dsn, $user, $passwd, $options);
    } catch (PDOException $e) {
        $this->error = $e->getMessage();
    }
}

errorこのクラスのプライベート変数であり、クラスの開始時にコンストラクターの上で定義されます。強いテキスト

で、こんな風に使うと

$database = new Database(
        'mysql:host=' . $config['mysql_host'] . ';port=' . $config['mysql_port'] . ';dbname=' . $config['mysql_database'],
        $config['mysql_username'],
        $config['mysql_password']
);

次のエラーが表示されます:データベース クラス ファイルを指している行で、空の値からデフォルト オブジェクトを作成$this->error = $e->getMessage();しています。

例外がスローされる理由は、まだ mysql のユーザー名とパスワードを設定していないためです。心配する必要はありません。このエラーが発生する理由と修正方法を理解しようとしています。

4

1 に答える 1

2

db クラスは PDO を拡張しているため、PDO コンストラクターが例外をスローすると $this が NULL になるようです。

class db extends PDO {
    public function __construct($dsn, $user="", $passwd="") {
        $options = array(
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );

        try {
            parent::__construct($dsn, $user, $passwd, $options);
        } catch (PDOException $e) {
            echo "Got PDOException\n";
            var_dump($this);
        }
    }
}


new db('mysql:host=localhost;port=3306;dbname=something', 'invaliduser', 'invalidpass');

そのコードを実行すると、次の出力が得られます。

Got PDOException
NULL

これを解決するには、問題のある行を削除して db オブジェクトが null かどうかを確認するか、try-catch を削除して、新しい db をインスタンス化するときに例外処理を実行します。または、PDO を拡張する代わりに、PDO オブジェクトを変数に格納するようにクラスを書き直すこともできます。

于 2012-12-18T07:23:21.070 に答える