PDO プリペアド ステートメント: ORDER BY パラメータの設定
PDO プリペアド ステートメントを使用して PHP で SQL ステートメントを操作する場合、ORDER BY でパラメータを設定します条項は難しい場合があります。 bindParam() などのメソッドを使用してバインドできる他のパラメーターとは異なり、PDO には ORDER BY のパラメーターを直接指定する方法がありません。
これを解決するには、順序と方向の値を直接挿入する必要があります。 SQL文字列に入力します。ただし、このアプローチでは、ユーザー入力が適切にサニタイズされていない場合、SQL インジェクションの脆弱性が発生する可能性があります。
慎重なアプローチ
最も安全な方法は、ORDER BY をハードコーディングすることです。次のように SQL 文字列に条件を追加します:
$order = 'columnName'; $direction = 'ASC'; $query = "SELECT field from table WHERE column = :my_param ORDER BY $order $direction"; $stmt = $db->prepare($query); $stmt->bindParam(':my_param', $is_live, PDO::PARAM_STR); $stmt->execute();
Custom Helper Function
別のアプローチは、ORDER BY パラメーターに許容される値をホワイトリストにリストするカスタム ヘルパー関数を作成することです。これにより、有効な値のみが使用されるようになり、SQL インジェクションのリスクが軽減されます。
function white_list($value, array $whitelist, $errorMessage) { if (!in_array($value, $whitelist)) { throw new Exception($errorMessage); } return $value; } $order = white_list($_GET['sort'], ["name", "price", "qty"], "Invalid field name"); $direction = white_list($_GET['direction'], ["ASC", "DESC"], "Invalid ORDER BY direction"); $sql = "SELECT field from table WHERE column = ? ORDER BY $order $direction"; $stmt = $db->prepare($sql); $stmt->execute([$is_live]);
このヘルパー関数は、ORDER BY パラメータの有効性を検証し、無効な値が検出された場合は例外をスローします。
以上がPHP の PDO プリペアドステートメントで ORDER BY パラメーターを安全に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。