1

プロシージャル MySQL の後に OO-MySQLi を使い始めましたが、問題があります。

本番環境では、私のシステムはすべてのエラーをカスタム ページとして表示します。MySQLi エラーも「エラー」であり、キャッチしたいのですが、ドキュメントにはこれを行う方法が 1 つしか記載されていません。

if (!$mysqli->query("SET a=1")) {
    exit('An error occurred: ' . $mysqli->error);
}

(ほんの一例です)。私のシステムでは、ログの記録、イベントの呼び出しなど、エラーが発生したときに多くのことを行っているため、これは非常に悪い方法です。

もちろん、次のように mysqli クラスを拡張できます。

class myMysqli {
    public function __construct(/* ... */)
    {
        parent::__construct(/* ... */);
    }

    public function query(/* .. */)
    {
        parent::query(/* ... */);

        if($this->errno !== 0)
        {
            // An error occurred
        }
    }
}
$mysqli = new myMysqli(/* ... */);
$mysqli->query(/* ... */);

しかし、この方法では、エラーが発生する可能性のあるほぼすべてのメソッドを拡張する必要があります。さらに、MySQLi は、独自のエラーを持つ準備済みステートメント (mysqli_stmt クラス) を提供します!

MySQLi エラーを処理するためのより良い方法を知っていますか? 前もって感謝します。


追加した

例外について: 例外がある場合、次のようなことを行う必要があることを正しく理解していますか?

try {
    $mysqli->query(/* ... */);
} catch (Exception $e) {
    // An error occurred
}

しかし、これは似ています

if(!$mysqli->query(/* ... */))
{
    // An error occured
} 

違いは何ですか?

4

2 に答える 2

1

まず第一に、あなたの古いアプローチは間違っていました。

exit('An error occurred: ' . $mysqli->error);

これは一般的に悪い習慣であり、mysqli でも使用すべきではありません。

あなたが本当に欲しいのは error/exception handlerです。ロギング、イベントの呼び出し、ページの表示など、何でもできる場所。

例外は通常のエラーよりも優れているため、他の回答に示されているようにmysqliを例外モードに設定し、エラーハンドラーですべてのエラーをキャッチします。try..catch は、エラーを処理するための明確な特定のアクションがある場合にのみ使用する必要があります。

于 2013-12-13T11:37:46.527 に答える
-1

私はこのようにtry...catchメソッドを使用しています...

try {
    // get result of record from 'id'
    $query = "SELECT * FROM models WHERE id =$id";
    $result = $mysqli->query($query);

    if (!$result) {
        throw new Exception($mysqli->error());      
    } 
    $row = $result->fetch_array(); 
 }
 catch (Exception $e)  
 {
     echo "We are currently experiencing issues. Please try again later.";
     echo $e->getMessage();
 } 
 finally
 {
      $result->free();
 }

それはまったく役に立ちますか?

「try」を使用して条件をテストし、true が返された場合に例外をスローします (!$result)。そして、'catch' を使用して、発生する可能性のある他のすべてをキャッチします。

于 2015-06-28T23:00:59.430 に答える