ホームページ > Java > &#&チュートリアル > 準備されたステートメントは SQL クエリの動的な列名を処理できますか?

準備されたステートメントは SQL クエリの動的な列名を処理できますか?

Linda Hamilton
リリース: 2024-12-10 09:20:15
オリジナル
211 人が閲覧しました

Can Prepared Statements Handle Dynamic Column Names in SQL Queries?

動的列名に対するプリペアド ステートメントの使用

データベース クエリを使用する場合、動的列名を指定しようとすると、一般的なジレンマが発生します。この記事では、特に 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート