0

「RAISEEXCEPTION」ステートメントのどの「パーツ」がPDOExceptionのどの「パーツ」にマップされるかを把握しようとしています。誰かがこの変換を「誰が」そして「どのように」実行するかを説明できますか(またはもっと良いことに、これを説明するドキュメントまたはこれを実行するソースコードを指すことができます)?

具体的には、SQLSTATUS値(私のテストでは常に「P0001」)および/または「ERROR:」値(メッセージの一部であり、常に空)に影響を与える方法があるかどうかを知りたいです。

私が管理できる最善の方法は次のとおりです。

メッセージを使用して例外を発生させる='<メッセージ>'、ERRCODE ='UE001'

PHP側では、次のようなメッセージが表示されます。

エラー:NUM:UE001、詳細:<メッセージ>

しかし、私はこれにあまり満足していません。'UE001'をPDOExceptionフィールドの1つに「配置」できると便利です(したがって、メッセージ文字列から解析する必要はありません)。

コメントをいただければ幸いです。

4

1 に答える 1

4

codeのプロパティを使用して。PDOExceptionを取得しSQLSTATEます。のドキュメントを参照してくださいPDOException

SQLSTATEエラーを発生させるPL/PgSQL関数によって生成されるものを制御するにRAISE ... SQLSTATEは、ドキュメントに従って使用します

もちろん、これが機能するためには、データベースドライバが正しくレポートする必要がありますSQLSTATEphpコマンドライン実行可能ファイルで実行できる次のスタンドアロンのサンプルコードに従って、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");
}
于 2013-03-14T23:46:55.073 に答える