4

Zend Framework 2でストアドプロシージャを起動して実行しようとしています。ストアドプロシージャでoutパラメータを使用してエラーコードを返そうとしましたが、それを機能させることができませんでした。次に、エラーが発生したときに、PHPで例外をキャッチできると思いました。問題は、特定のエラーコードにアクセスできないように見えることです-一般的なものだけです(例:23000-整合性制約違反)。これが私がやりたいこと(または同様のこと)の例です:

try {
    $result = $this->dbAdapter->query('CALL sp_register_user(?, ?)', array('username', 'password'));
}

catch (\Exception $e) {
    switch ($e->getCode()) {
        case 1062:
            // Duplicate entry
            break;

        case 1452:
            // Cannot add or update a child row
            break;
    }
}

つまり、どのエラーが発生したかを正確に確認できるようにしたいと思います。ただし、問題は、スローされる例外のエラーコードが23000であり、上記のいずれでもないことです。

220行目にAnInvalidQueryExceptionがスローされます。Zend\Db\Adapter\Driver\Pdo\Statement

try {
    $this->resource->execute();
} catch (\PDOException $e) {
    throw new Exception\InvalidQueryException('Statement could not be executed', null, $e);
}

私のPDOException場合、ここには23000のエラーコードが含まれています。パラメータはnullエラーコードです。したがって、私のcatchブロックでは、実際にInvalidQueryExceptionはエラーコード0のをキャッチしますが、これはそれほど有用ではありません。この例外は、以前の例外(上記の最後のパラメーター)へのアクセスを提供します。これは、次のPDOExceptionようになります。

// try block omitted
catch (InvalidQueryException $e) {
    $previous_exception_error_code = $e->getPrevious()->getCode();
}

重複エントリ(1062)の場合、エラーコードは23000です。「子行を追加または更新できません」(1452)の場合も23000になります。したがって、アプリケーションでそれらをどのように区別できるかわかりません。2つのエラーについてユーザーに異なるエラーメッセージを表示したい場合はどうなりますか?例外メッセージは次のとおりSQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'user' for key 'username'です。ただし、これは文字列であるため、エラーコードを検索するのは非常に困難です。具体的な実装としてPDOを使用しているという事実から、まだ抽象化できることを望んでいます。

結局、これはZF2よりもPDOとMySQLに関するもののようです。ここからどこに行けばいいのかよくわからないので、エラーコードをどのように区別できるかについてのアイデアをいただければ幸いです。つまり、23000だけでなく、エラー1062または1452がいつ発生したかを知ることです。

4

2 に答える 2

6

(標準化された値$e->errorInfo[1]ではなく)ドライバー固有のエラーコードであるをオンにします。SQLSTATE

于 2013-01-21T22:46:33.783 に答える
0

それはいくつかの体を助けるかもしれません->時々trycatchブロックは効率的ではありませんここでコメントを読んでください

そしてここに解決策があります。

于 2013-11-30T20:07:00.570 に答える