PDO プリペアド ステートメントは識別子または構文キーワードをバインドできますか?
テーブル、フィールドを表す変数を使用して動的クエリを構築しようとしています/column と検索する値を指定すると、PDO のプリペアド ステートメントを使用するときに予期しない問題が発生する可能性があります。具体的には、bindParam() または bindingValue() を使用してこれらの変数をバインドすると、結果セットが空になる可能性があります。
問題の核心を掘り下げるには、PDO プレースホルダーがデータ リテラルを表すように指定されていることを理解することが重要です。したがって、これらを識別子 (テーブル名やフィールド名など) または構文キーワード (「LIKE」など) として使用しようとすると、誤った動作が発生する可能性があります。
具体的には、PDO はバインディング識別子に対する固有のサポートを提供しません。 . これは、開発者がこれらの識別子を自分で処理する責任を負わなければならないことを意味します。適切な実行を確保するには、次のような厳格なルールに従う必要があります。
識別子のバインディングのルール:
これらの書式設定ルールにより、構文エラーと SQL インジェクションの脆弱性が防止されます。
構文キーワードをバインドするためのルール:
例:
次のことを考慮してください。前述のルールに準拠したコード スニペット:
$allowed = array("name", "price", "qty"); $key = array_search($_GET['field'], $allowed); $field = $allowed[$key]; $query = "SELECT $field FROM t"; // Value is safe
要約すると、 PDO プリペアド ステートメントはデータ リテラルのバインディングには優れていますが、バインディング識別子や構文キーワードはサポートされていません。概要を示したルールに注意深く従うことで、開発者はこれらの重要なコンポーネントを利用する動的クエリを安全かつ正確に実行できます。
以上がPDO プリペアド ステートメントはテーブル名と列名、または SQL キーワードをバインドできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。