web-dev-qa-db-ja.com

PDOでクエリエラーを表示する方法PHP

try {
    $db = new PDO("mysql:Host=".Host.";dbname=".DB, USER, PW);
    $st = $db->prepare("SELECT * FROM c6ode");
}
catch (PDOException $e){
    echo $e->getMessage();
}

上記の場合、クエリのmysqlエラーを確認するにはどうすればよいですか?

63
TPSstar

エラーモード属性PDO :: ATTR_ERRMODEをPDO :: ERRMODE_EXCEPTIONに設定する必要があります。
そして、prepare()メソッドによって例外がスローされることが予想されるため、PDO :: ATTR_EMULATE_PREPARES *featureを無効にする必要があります。そうしないと、MySQLサーバーは、実行されるまでステートメントを「認識」しません。

<?php
try {
    $pdo = new PDO('mysql:Host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);


    $pdo->prepare('INSERT INTO DoesNotExist (x) VALUES (?)');
}
catch(Exception $e) {
    echo 'Exception -> ';
    var_dump($e->getMessage());
}

印刷(私の場合)

Exception -> string(91) "SQLSTATE[42S02]: Base table or view not found: 
1146 Table 'test.doesnotexist' doesn't exist"

http://wezfurlong.org/blog/2006/apr/using-pdo-mysql/ を参照してください
EMULATE_PREPARES = trueが、現在のpdo_mysqlドライバーのデフォルト設定のようです。クエリキャッシュの問題はそれ以来修正/変更されており、mysqlndドライバーではEMULATE_PREPARES = falseで問題はありませんでした(私はPHPの愛好家にすぎませんが、Wordを使用しないでください...)

*)そして PDO :: MYSQL_ATTR_DIRECT_QUERY -これら2つの属性の相互作用を理解していないことを認める必要があります(まだ?)

$pdo = new PDO('mysql:Host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
    PDO::ATTR_EMULATE_PREPARES=>false,
    PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));
63
VolkerK

追加設定なしでこれを使用しています:

if (!$st->execute()) {
    print_r($st->errorInfo());
}
31
ladar

あなたの不満は、例外が発動していないということだと思います。 PDOはほとんどの場合、例外をスローしないように構成されています。これで有効にします:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
15
Steve Rukuts

テスト中にエラーをすばやく確認する方法:

$error= $st->errorInfo();
echo $error[2];
8
Lan

/ *エラーを引き起こします-BONESテーブルは存在しません* /

$sth = $dbh->prepare('SELECT skull FROM bones');
$sth->execute();

echo "\nPDOStatement::errorInfo():\n";
$arr = $sth->errorInfo();
print_r($arr);

出力

Array
(
    [0] => 42S02
    [1] => -204
    [2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N  "DANIELS.BONES" is an undefined name.  SQLSTATE=42704
)
2

このエラーが発生した場合、これは私のために働いています:

致命的エラー:未定義のメソッドmysqli :: error()の呼び出し

if(! empty( $db->error ) ){
   echo $db->error;  // <- this is not a function call error()
}

https://stackoverflow.com/a/3204582

0