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がいつ発生したかを知ることです。