code
を使用する PDOException
のプロパティ SQLSTATE
を取得するには 。 PDOException
>
SQLSTATE
を制御するには エラーを発生させるPL/PgSQL関数によって生成された場合は、 RAISE ... SQLSTATE
ドキュメントに従って
。
もちろん、これが機能するためには、データベースドライバが SQLSTATE
を正しく報告する必要があります。 。 php
で実行できる次のスタンドアロンのサンプルコードに従って、PDOが少なくともPostgreSQL9.2を使用するPHP5.4.11でこれを実行することを確認しました。 コマンドライン実行可能ファイル:
<?php
$pdo = new PDO('pgsql:');
$sql = <<<EOD
CREATE OR REPLACE FUNCTION exceptiondemo() RETURNS void AS $$
BEGIN
RAISE SQLSTATE 'UE001' USING MESSAGE = 'error message';
END;
$$ LANGUAGE plpgsql
EOD;
$sth = $pdo->prepare($sql);
if (!$sth->execute()) {
die("Failed to create test function\n");
}
$sql = "SELECT exceptiondemo();";
$sth = $pdo->prepare($sql);
if (!$sth->execute()) {
$ei = $sth->errorInfo();
die("Function call failed with SQLSTATE " . $ei[0] . ", message " . $ei[2] . "\n");
// Shortcut way:
// die("Function call failed with SQLSTATE " . $sth->errorCode());
}
?>
出力は次のとおりです:
Function call failed with SQLSTATE UE001, message ERROR: error message
2番目の$sth-> execute()
のコードブロックを置き換えます これを使用してコードの最後に移動し、例外処理モードも正常に機能することを示します。
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$sth->execute();
} catch (PDOException $err) {
$ei = $err->errorInfo;
die("Function call failed with SQLSTATE " . $ei[0] . ", message " . $ei[2] . "\n");
// Alternate version to just get code:
//die("Function call failed with SQLSTATE " . $err->getCode() . "\n");
}