動的列名に対するプリペアド ステートメントの使用
データベース クエリを使用する場合、動的列名を指定しようとすると、一般的なジレンマが発生します。この記事では、特に Java を使用した MySQL で、プリペアド ステートメントを通じて変数カラム名を渡す可能性について検討します。
チャレンジ ステートメント
ユーザーがプリペアド ステートメントを実行しようとすると、列名は文字列として渡されます:
String columnNames = "d,e,f"; String query = "SELECT a,b,c,? FROM " + name + " WHERE d=?"; stmt = conn.prepareStatement(query); stmt.setString(1, columnNames); stmt.setString(2, "x");
ただし、結果の SQL ステートメントでは、列名がリテラルの一部として表示されます。 string:
SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'
ただし、望ましい出力は、列名を別の列として持つことです:
SELECT a,b,c,d,e,f FROM some_table WHERE d='x'
Solution Discussion
この慣行はデータベース設計に欠陥があることを示していることに注意することが重要です。理想的には、ユーザーが列名を意識しないようにする必要があります。より良い解決策は、代わりに「列名」を格納する明示的な列をデータベースに作成することです。
残念ながら、列名を PreparedStatement 値として設定することはできません。準備されたステートメントは、列値を設定するためにのみ使用できます。
可変列名の使用が避けられない場合は、入力をサニタイズし、SQL 文字列を手動で構築する必要があります。これには、個々の列名を引用符で囲み、String#replace() を使用して列名内の引用符をエスケープすることが含まれます。
以上が準備されたステートメントは SQL クエリの動的な列名を処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。