3

私はこれで髪を引っ張っています。

ZF1 では、完全な SQL エラーの詳細で例外が発生するため、簡単でした。ZF2 では、エラーの説明のみを渡す Exception\RuntimeException のみが発生し、操作を不可能にする番号は発生しません。

質問: アダプタから完全なエラーを取得する方法。私が使用するコードのスニペットは次のとおりです。

$dbAdapter = $this->_serviceManaget->get('Zend\Db\Adapter\Adapter');

try {
    $result = $dbAdapter->query($sql, $binds);
} catch (\Exception $e) {
    //here I need to check the error number raised by MySQL during the execution
    //$e object in this case only contains 
    //$e->message = "Duplicate entry 'blablabla' for key 319" and $e->code = 0   
}

助言がありますか?

4

1 に答える 1

2

PHP SPL Exceptionsから拡張された ZF2 Exceptions 。それらはすべて、標準の Exception インターフェイスを拡張します。例外マニュアルに従って、これを行うことができます:

try {
    $result = $dbAdapter->query($sql, $binds);
} catch (\Exception $e) {        
    $code = $e->getCode();
    $msg  = $e->getMessage();
    $file = $e->getFile();
    $line = $e->getLine();
    echo "$file:$line ERRNO:$code ERROR:$msg";       
}

参考までに、次のように、さまざまな例外タイプに対して複数のキャッチを実装できます。

try {
    ...
} catch (\RuntimeException $e) {
    ...
} catch (\LogicException $e) {
    ...
}

更新:
インスタンス から直接エラー データを取得する\mysqli場合:

try {
    $result = $dbAdapter->query($sql, $binds);
} catch (\Exception $e) {
    $mysqli = $dbAdapter->getDriver()->getConnection()->getResource();        
    $file = $e->getFile();
    $line = $e->getLine();
    echo "$file:$line ERRNO:$mysqli->errno ERROR:$mysqli->error";       
}

\mysqliエラーおよび警告データの取得方法の詳細については、マニュアルを確認してください。

于 2013-08-30T07:03:20.600 に答える