PDO プリペアド ステートメントを使用した順序付けされたクエリ
データベースの対話では、クエリ結果の順序付けは一般的なタスクです。 PDO プリペアド ステートメントをパラメーターとともに使用すると、順序付けパラメーターを安全に挿入できます。ただし、ORDER BY 句でパラメータを使用しようとすると、問題が発生する可能性があります。
次のクエリは、WHERE 句のパラメータの使用を示していますが、順序付けの適用に失敗します。
$order = 'columnName'; $direction = 'ASC'; $stmt = $db->prepare("SELECT field from table WHERE column = :my_param ORDER BY :order :direction"); $stmt->bindParam(':my_param', $is_live, PDO::PARAM_STR); $stmt->bindParam(':order', $order, PDO::PARAM_STR); $stmt->bindParam(':direction', $direction, PDO::PARAM_STR); $stmt->execute();
パラメータ:my_param、:order、および:direction はパラメータ マーカーを使用してバインドされます。ただし、順序付け句は正しく機能しません。 ORDER BY 句のパラメータのエスケープ メカニズムを期待する人もいるかもしれませんが、これは存在しません。
代わりに、適切な予防措置を講じて、順序付けパラメータを SQL ステートメントに直接挿入する必要があります。
$order = 'columnName'; $direction = 'ASC'; $stmt = $db->prepare("SELECT * from table WHERE column = :my_param ORDER BY $order $direction");
セキュリティを確保するには、順序付けパラメータの値をホワイトリストに登録することをお勧めします。次のコード スニペットは、配列を使用したホワイトリスト メカニズムを示しています。
$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";
このアプローチにより、事前定義された安全な値のみを順序付けに使用できるようになり、潜在的なセキュリティ脆弱性が防止されます。
以上がPDO プリペアド ステートメントを使用してクエリ結果を安全に並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。