準備された PDO ステートメントを使用して ORDER BY パラメーターを設定する
準備された PDO ステートメントを使用して SQL クエリを実行する場合、設定しようとすると問題が発生する可能性がありますORDER BY 句内のパラメータ。この記事では、制限を調べ、代替ソリューションを提供することで、この問題に対処します。
SQL の直接挿入
WHERE 句での params の使用は機能しますが、それらを ORDER に適用すると、 BY 句には問題があることがわかります。この制限を回避するには、SQL クエリに直接挿入する必要があります。ただし、このアプローチでは、次に示すように、クエリのセキュリティと整合性を確保するための厳密な予防措置が必要です。
$order = 'columnName'; $direction = 'ASC'; $query = "SELECT * from table WHERE column = :my_param ORDER BY $order $direction";
演算子と識別子のハードコーディング
すべての演算子と識別子示されているように、ORDER BY 句内の はスクリプト内でハードコーディングする必要があります。ここ:
$orders = array("name", "price", "qty"); $key = array_search($_GET['sort'], $orders); $order = $orders[$key]; $query = "SELECT * from table WHERE is_live = :is_live ORDER BY $order";
同じ原則が方向にも適用されます。
ホワイトリスト用のヘルパー関数
必要なコードの量を最小限に抑えるには、ホワイトリストヘルパー関数を使用できます:
$order = white_list($order, ["name", "price", "qty"], "Invalid field name"); $direction = white_list($direction, ["ASC", "DESC"], "Invalid ORDER BY direction"); $sql = "SELECT field from table WHERE column = ? ORDER BY $order $direction";
この関数は値をチェックしてトリガーします。無効な場合はエラー。この手法により、データの検証とセキュリティが確保されます。
以上がPDO で ORDER BY 句パラメータを含むプリペアド ステートメントを安全に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。