0

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

これは、私が考えることができるすべてのケースで機能し、安全であるようです。問題はありますか?私が持っていたものよりも良いですか?

4

2 に答える 2

0

最初に着信 $ID の char などを確認し、テーブル内の ID として決して存在しない値に設定してから、クエリを使用します

SELECT col1, col2, col3 FROM table WHERE ID = :id
union all 
SELECT col1, col2, col3 FROM table WHERE ID = 1 /* may :defaut_id if */
where not exist (select 1 from table WHERE ID = :id)
于 2011-03-10T19:03:54.077 に答える
0

デフォルトのレコードに ID があると仮定すると、単一のクエリで実行できます。

select ...
from ...
where (id = ?) or (id = $default_id)

デフォルトの ID をクエリ文字列にハードコードするだけです。

于 2011-03-10T19:06:59.253 に答える