これが私の可能な解決策です:
1)exit()
スクリプトを終了するために使用します。(問題:データベースからのデータだけでなく、ページ全体のコンテンツの読み込みに影響します)
<div>
2)考えられる例外を表示するために、ページに要素を特別に埋め込みます。
標準的なアプローチは何ですか?
データベースからの例外を処理する方法には、実際には「標準的な」アプローチはありません。それは完全に特定のユースケースに依存します。たとえば、最初のケースでデータベース接続を確立できない場合は、エラーページにリダイレクトして、すぐにサイト管理者に電子メール通知を送信するのが適切である可能性があります。一方、(何らかの理由で)1回の挿入を実行できない場合は、ユーザーが試みていたことが達成できなかったことをユーザーに通知し、再試行するように依頼する方が適切な場合があります。
例外は基本的に、使用しているプログラミング言語やライブラリではなく、問題が発生した場合の処理方法を決定するための方法です。ほとんどの場合、エラーをログに記録する必要があります。その後、最も適切な応答を決定するのはあなた次第です。
つまり、例外を処理する適切な方法は、アプリケーションで最も意味のある方法です。
オプション1)は、ユーザーエクスペリエンスが低下するため、乱雑です。
オプション2)が優先されます。
PDOを使用すると、次のコードで例外が表示され、タイムスタンプとともに保存されます。
try {
$dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$stmt = $dbh->prepare("INSERT INTO table ( column ) values ( value )");
$stmt->execute();
}
catch(PDOException $e) {
echo "I'm sorry I'm afraid you can't do that.". $e->getMessage() ;// Remove or modify after testing
file_put_contents('PDOErrors.txt',date('[Y-m-d H:i:s]'). $e->getMessage()."\r\n", FILE_APPEND);
}
実稼働サイトでは、エコーステートメントをテストした後、次のように修正する必要があります。
echo "I'm sorry I'm afraid you can't do that.";
例外をログファイルに記録し、それを使用して何が悪かったのかを分析する必要があります。ただし、ユーザーの観点からは、「リクエストを処理できませんでした」などのわかりやすいステートメントを表示する必要があります。
私のプロジェクトでも同じ問題に直面しました。最初に、david strachanと同様の解決策を考えましたが、最終的に、この解決策が完全ではないことに気付きました。まだデバッグ情報が必要ですが、ユーザーに表示されるべきではありません。
「システムエラーです。もう一度やり直してください。エラーが続く場合は、サポートに連絡してください」というメッセージをユーザーに表示するソリューションを思いつきました。また、同時に、エラーメッセージはエラーログファイルに記録されます。
詳細は次のとおりです。
function logException ($exception) {
// Construct the error message to add to the log file
$logDate = date("l, F j, Y H:i:s");
$logMessage = "Date: " . $logDate . "\n";
$logMessage = $logMessage . "Error Message: ". $exception->getMessage() . "\n";
$logMessage = $logMessage . "Error Code: ". $exception->getCode() . "\n";
$logMessage = $logMessage . "Error File: ". $exception->getFile() . "\n";
$logMessage = $logMessage . "Error Line: ". $exception->getLine() . "\n";
$logMessage = $logMessage . "Error Trace:\n". $exception->getTraceAsString() . "\n";
$logMessage = $logMessage . "\n\n**************************************" . "\n\n\n";
// Construct a log file name similar to the name of the script file that cause the error
$info = pathinfo($exception->getFile());
$extension = "." . $info["extension"];
$logFile = "../logs/" . basename($exception->getFile(), $extension) . ".log";
// Add the error message to the log file
error_log($logMessage, 3, $logFile);
// Message to return to the user
$errorMessage = "System error, please try again, if the error persists, then please contact support.";
return $errorMessage;
}
try {
$dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$stmt = $dbh->prepare("INSERT INTO table ( column ) values ( value )");
$stmt->execute();
}
// Catching all sorts of errors, including PDO errors
catch (Exception $e) {
$message = logException ($e);
$data['message'] = $message;
$data['isSuccessful'] = false;
}
次の点に注意してください:
ここで問題が発生しました。ユーザーに表示してほしい例外をスローしたい場合(たとえば、「これは間違っています。agianを試してください」などの例外をスローしたい場合)はどうでしょうか。さて、私はこれを拡張した解決策を思いつきましたが、それはあなたの疑問ではありません。それでも知りたい場合は、私に知らせてください。
乾杯。
try --catchは、phpで例外を処理する標準的な方法です...ここに示すように:PHP EXCEPTIONS
try{
some code here
}catch(Exception $e){
failed response here
}
編集して詳しく説明する:これは、例外をキャッチするための単なる方法です。捕まったらどうするかは、開発者に任された価値判断です。それが質問の内容である場合は、お詫び申し上げます。
エラーをキャッチする独自の方法を見つける必要があります。私は使用しています
try { QUERY } catch(Exception $e) { Log and display error }