ホームページ >バックエンド開発 >PHPチュートリアル >準備された PDO ステートメントの ORDER BY 句でパラメータを使用できないのはなぜですか?

準備された PDO ステートメントの ORDER BY 句でパラメータを使用できないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-17 16:54:15595ブラウズ

Why Can't I Use Parameters in the ORDER BY Clause of My Prepared PDO Statement?

準備された 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。