0

私はこのコードブロックを持っています:

try {
    $dbh = new PDO('mysql:host='.$db_host.';dbname='.$db_database, $db_user, $db_pass);
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $dbh->prepare('DELECT userID FROM tblusers');
} catch (PDOException $e) {
    echo "Error!: " . $e->getMessage() . "<br/>";
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}

IDEでデバッガーを使用してコードをステップ実行すると、ステートメントcatchにエラーがあっても、コードがブロックに入ることがありません。prepare

私は何が間違っているのですか?

私はPDOに不慣れで、ブロックを試して/キャッチするので、これがばかげた質問である場合は、ここで我慢してください!

4

3 に答える 3

2

PDO_mysqlはデフォルトでエミュレートされたプリペアドステートメントを使用するため(パフォーマンス上の理由)、prepareは例外をスローしません。PDOStatement::executeしかし。

jonnyynnojが述べているように実行することでエミュレーションをオフにすることができますが、実行時に例外をキャッチすることで通常は十分であることがわかります。

于 2012-09-18T14:16:17.893 に答える
2

追加してみる$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

エミュレートされたプリペアド ステートメントはデータベース サーバーと通信しないため、PDO::prepare() はステートメントをチェックしません。

参照: http://php.net/manual/en/pdo.prepare.php

于 2012-09-18T14:13:42.090 に答える
0

try / catch は例外のみをキャッチします。他のエラー (解析エラー、実行時エラーなど) は catch-block を実行しません。

あなたの場合、タイプ「PDOException」の例外のみがキャッチされ、他のすべてはおそらく表示またはログに記録されます(php.iniのエラー報告ディレクティブによって異なります)。

エラーとして表示されるのは何ですか?

于 2012-09-18T14:15:03.333 に答える