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

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

Barbara Streisand
リリース: 2025-01-19 17:26:09
オリジナル
297 人が閲覧しました

Can Prepared Statements Handle Dynamic Column Names in SELECT Queries?

準備されたステートメント: SELECT クエリでの動的列名の処理

課題:

準備されたステートメントは、SELECT クエリ内の動的な列名に対応できますか?

シナリオ:

ユーザーが MySQL と Java の例を示しました:

<code class="language-java">String columnNames = "d,e,f"; // From user input
String tableName = "some_table"; // From user input
String query = "SELECT a,b,c,? FROM " + tableName + " WHERE d=?";
//...</code>
ログイン後にコピー

パラメータを columnNames 文字列に置き換えると、次のようになります。

<code class="language-sql">SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'</code>
ログイン後にコピー

ただし、意図された結果は次のとおりです。

<code class="language-sql">SELECT a,b,c,d,e,f FROM some_table WHERE d='x'</code>
ログイン後にコピー

解決策:

動的列名に準備されたステートメントを直接使用することは実現できません。 準備されたステートメントは、列識別子ではなく、をパラメータ化します。

代替戦略:

最も効果的な解決策には、データベース スキーマの変更が含まれます。 データを多数の列に分散させる代わりに、動的に名前が付けられた列を保持する単一の列を導入します。 この列には、各行の列名のリストを表すシリアル化された文字列が含まれます。

これには、SQL インジェクションを防ぐために厳密な入力サニタイズが必要になります。 String#replace() を使用して引用符をエスケープし、その後サニタイズされた列名を SQL クエリ文字列に連結することが実行可能な方法です。 可能な場合はセキュリティ上の利点を維持するために、クエリの他の部分にパラメータ化されたクエリを使用することを検討してください。

以上が準備されたステートメントは SELECT クエリの動的な列名を処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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