ホームページ >バックエンド開発 >PHPチュートリアル >準備された PDO ステートメントの ORDER BY 句でパラメータを使用できないのはなぜですか?
準備された PDO ステートメントでの ORDER BY 句での Params の使用可能性
SQL ステートメントで、ORDER BY 内で params を使用するときに問題が発生する句。 params を :order および :direction プレースホルダーにバインドしているにもかかわらず、ステートメントは出力なしで実行されます。
適切に機能する :my_param プレースホルダーとは異なり、:order および :direction プレースホルダーは SQL に直接挿入する必要があります。これは次のように実行できます。
$order = 'columnName'; $direction = 'ASC'; $stmt = $db->prepare("SELECT * from table WHERE column = :my_param ORDER BY $order $direction");
PDO::PARAM_COLUMN_NAME 定数または同様の代替物はありません。注意点は、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"; $stmt = $db->prepare($sql); $stmt->execute([$is_live]);
これにより、不正な値にフラグが立てられ、適切に処理され、セキュリティが強化されます。アプリケーションの
以上が準備された PDO ステートメントの ORDER BY 句でパラメータを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。