0

サイト内に適切なエラー処理システムを導入しようと、数日間神経をすり減らす日々を過ごしてきました。

私のエラー処理システムは、mysqli エラーなどの予期しないエラーのみに焦点を当てています

私のサイトでは多数の mysqli クエリが実行されているため、エラーが発生する可能性があります。

私のシステムには 3 つの部分がありますが、どれもベスト プラクティスと効率のどちらに位置するかわかりません。

ステップ 1 :エラーをキャッチする

$query = "
SELECT * FROM `users_account_activations` WHERE `user_ip` =?
";
$statement = $databaseHandler->mysqli->prepare($query);
$statement->bind_param('s', $userIp);
$statement->execute();
$statement->store_result();
//record error, if any
$databaseHandler->mysqli->error ? error = true : error = false; 
  • これは、準備されたステートメントのどこかでエラーの存在をキャッチする良い方法ですか?

  • クエリの最後にエラーを探しても、準備段階でエラーをキャッチできませんか? または、準備ステージが失敗すると、他のすべてが失敗します (落下するドミノなど)。

ステップ 2 :エラーの記録

error_log("Could not process query...", 3, 'log/default.log'); 
  • これはエラーを記録する適切な方法ですか? ファイル ストリームを開くシステムとは異なりますか?

ステップ 3 :計算後の処理

エラーが発生したので、先に進む方法を決定する必要があります。私のシステムでは、スクリプトを終了し、「opps!何か問題が発生しました」という標準エラー ページに移動する必要があります。

header('location: errorpage.php'); exit();
  • ヘッダーを変更することはこれを行う良い方法ですか? いつ使用できるかに関するヘッダーの制限を認識しています。

エラーを処理するためのより良い方法はありますか?このシステムは、予期しないエラーを対象としています。予想されるエラーは処理され、別の方法でユーザーに表示されます。

4

1 に答える 1

1

はい、あなたの疑問は正しいです。3 つのステップはすべて間違っています。

  • まず、非常に奇妙な理由で、エラー メッセージ自体を記録していません。エラーメッセージなしでエラーを修正するにはどうすればよいですか? 「クエリを処理できませんでした...」のようなログの用途は何ですか?
  • 次に、すべての操作の結果を確認する必要があります。したがって、準備も確認する必要があります。
  • 次に、エラーが発生した場所を知らずにエラーを見つけるのは困難です。エラー メッセージには、一部のデバッグ バックトレースを含める必要があります。
  • 次に、Location ヘッダーではなく、Status:500 だけが存在するはずです。したがって、エラーページにリダイレクトする代わりに、それを含めるだけです。
  • 最後に、前述のすべてのタスクを 1 つの場所、つまりカスタム エラー ハンドラとして登録された関数で実行する必要があります。

したがって、シナリオは次のようにする必要があります

あなたのブートストラップファイルで、このようなコードを作成してください

set_error_handler("myErrorHandler");
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    error_log("$errstr in $errfile:$errline");
    header('HTTP/1.1 500 Internal Server Error', TRUE, 500);
    readfile("500.html");
    exit;
}

次に、mysqli コードを次のようにします。

$stmt = $mysqli->prepare("qwefq") or trigger_error($mysqli->error);

すべてのエラーをログに記録します

于 2013-08-26T00:30:50.610 に答える