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

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

DDD
DDDオリジナル
2024-12-27 01:39:09943ブラウズ

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

PDO ステートメントの ORDER BY パラメータ

SQL ステートメントの ORDER BY 句でパラメータを使用する際に問題が発生します。 :order および :direction パラメータは結果を生成できません。

問題の原因

PDO パラメータは ORDER BY 句で直接使用できません。これらは静的文字列である必要があります。

解決策

列名または並べ替え方向の PDO 定数はありません。したがって、これらの値を SQL ステートメントに直接挿入する必要があります。ただし、予防策を講じることが重要です。

  1. スクリプト内のすべての演算子と識別子をハードコードします。
$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";
  1. ホワイトリストヘルパーを使用するfunction:
$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]);

説明

ホワイトリスト関数は値をチェックし、値が正しくない場合はエラーを生成し、SQL のリスクを軽減します。注射攻撃。

$sql = "SELECT field from table WHERE column = :my_param";

$stmt = $db->prepare($sql);
$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();

以上がSQL ステートメントの ORDER BY 句で PDO パラメータを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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