0

プリペアドステートメントを処理するためのクエリの適切なコーディングと同じ行に沿って、次のクエリがあります。

$sql = "SELECT *
        FROM photos
        WHERE g_id = ?
        LIMIT $curPage,".$totalPix;
$result = $conn->query($sql) or die(mysqli_error());
$row = $result->fetch_assoc();

ここでの問題は、プリペアドステートメントのプレースホルダーを使用する必要がある$curPageかどうか、使用する場合は次のように使用する$totalPixかどうかです。

$sql = "SELECT *
        FROM photos
        WHERE g_id = ?
        LIMIT ?,".?;
$gid = $i; $lm = $v1; $mt = $v2 
$stmt = $conn->prepare($randPic);
$stmt->bind_param('iii', $gid, $lm, $mt);
$stmt->bind_result($p_fname);
$stmt->execute();
$stmt->store_result();
$stmt->fetch();

...または、変数がSQLインジェクションに対してクエリを開いたままにしていないのですか$curPage$totalPixよろしくお願いします!

4

1 に答える 1

0

を使用していますか?適切な場所に(変数バインディングにのみ使用できるため)。ただし、単に$curPage or $totalPixクエリに配置するのは安全ではありません。それらは整数でなければならないと仮定しているので、それを安全にすることはそれほど難しくありません。

intval($curPage) and intval($totalPix)それらが確実であることを使用してください。

ただし、文字列を許可する場合は、少し難しくなります。それが解決策であるかどうかはわかりませんが、それがあなたが設計したものであるかどうかを確認して、可能なオプションを「ホワイトリストに登録」することをお勧めします。

例:SELECT * FROM sometable WHERE $somevar = ?変数 ($somevar) は'1 --'、すべての行を返す可能性があります。しかし、ほとんどの場合、$somevar = 'id' または $somevar = 'email' を意味します。これは、いくつかの if ステートメントで簡単に確認でき、パフォーマンスを損なうことはありません。少し入力するかもしれませんが、入力する気分でない場合は、クエリ用のフレームワークまたは何らかの ORM を使用することをお勧めします。

if ($somevar !== 'id') exit('Cannot find entries');関数またはページの開始時

于 2012-08-06T01:52:13.637 に答える