PDO プリペアド ステートメントを使用して、MySQL データベースでクエリの適切なエラー処理を作成しようとしています。プリペアド ステートメントの処理でエラーが検出された時点でプログラムを終了させたい。PDO のプリペアド ステートメント プロセスの各ステップがFalse
失敗すると返されるという事実を利用して、私は次の不快なハックをまとめました。
global $allFields;
global $db;
global $app;
//dynamically append all relevant fields to query using $allFields global
$selectQuery = 'SELECT ' . implode($allFields, ', ') .
' FROM People WHERE ' . $fieldName . ' = :value';
//prepared statement -- returns boolean false if failure running query; run success check
$success = $selectQueryResult = $db->prepare($selectQuery);
checkSuccess($success);
$success = $selectQueryResult->bindParam(':value', $fieldValue, PDO::PARAM_STR);
checkSuccess($success);
$success = $selectQueryResult->execute();
checkSuccess($success);
次のことをcheckSuccess()
行うと:
function checkSuccess($success) {
if ($success == false) {
//TODO: custom error page.
echo "Error connecting to database with this query.";
die();
}
}
2つのこと。まず、これは恐ろしく冗長で愚かです。もっと良い方法があるはずです。明らかに、ブール値を配列または何かに格納して、1行または2行のコードを取り出すことができますが、それでも.
2 つ目は、これらの値を確認する必要があるのか、それとも次のコード行を実行した後に結果を確認する必要があるのかということです。
$result = $selectQueryResult->fetch(PDO::FETCH_ASSOC);
私はすでにこれを行うコードを持っています:
if ($result) { //test if query generated results
// do successful shit
}
else {
echo "404";
$app->response()->status(404); //create 404 response header if no results
奇妙な、不一致の、または長いクエリを挿入して、プリペアドステートメントプロセスを中断しようとする限り、私のプログラムは、実行した関数のいずれに$result
も戻ることなく、常に割り当てに到達します。では、上記のロジックをまったくチェックする必要はないのでしょうか? プログラムの早い段階で、データベース接続が成功したかどうかを確認していることを覚えておいてください。false
checkSuccess()