URL GET パラメータに基づいて MySQL データベースから行を取得する単純な PHP スクリプトがあります。ID と呼ばれる単なる int です。
誰かが DB の行ではない int を入力したり、文字などを入力しようとしたりするなど、GET パラメータがデータベースの無効な ID になる場合は、デフォルトのレコードを表示したいと思います。
次のコードは実際に動作しますが、悪いコードだと思います。なぜなのか、どうすればいいのかわからないだけです。データベース クエリを実行する前に、ID が int であることを検証する必要があることはわかっていますが、無効な ID である整数が使用された場合の対処法は解決しません。
これを適切な質問にするために、false を返す mysqli_stmt_fetch からどのように回復すればよいでしょうか?
気楽に行きましょう、私はナブだと知っています:-)
$ID = (int)$_GET["id"];
$query = "SELECT `col1`, `col2`, `col3` FROM `table` WHERE `ID` = ?";
if ($stmt = mysqli_prepare($connection, $query))
{
mysqli_stmt_bind_param($stmt, "i", $ID);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $var1, $var2, $var3);
if (!mysqli_stmt_fetch($stmt))
{
$ID = 1; //A record I know exists and will always exist
mysqli_stmt_bind_param($stmt, "i", $ID);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $var1, $var2, $var3);
mysqli_stmt_fetch($stmt);
}
mysqli_stmt_close($stmt);
}
OK、いくつかのフィードバックと実験により、PHP で ID を int としてキャストし、SQL クエリを次のように変更しました。
SELECT `col1`, `col2`, `col3`
FROM `table`
WHERE `ID` = ?
UNION
SELECT `col1`, `col2`, `col3`
FROM `table`
WHERE `ID` = 1
LIMIT 1
これは、私が考えることができるすべてのケースで機能し、安全であるようです。問題はありますか?私が持っていたものよりも良いですか?