Maison > base de données > tutoriel mysql > Les instructions préparées peuvent-elles gérer les noms de colonnes dynamiques dans les requêtes SELECT ?

Les instructions préparées peuvent-elles gérer les noms de colonnes dynamiques dans les requêtes SELECT ?

Barbara Streisand
Libérer: 2025-01-19 17:26:09
original
373 Les gens l'ont consulté

Can Prepared Statements Handle Dynamic Column Names in SELECT Queries?

Instructions préparées : gestion des noms de colonnes dynamiques dans les requêtes SELECT

Le défi :

Les instructions préparées peuvent-elles prendre en charge les noms de colonnes dynamiques dans les SELECT requêtes ?

Scénario :

Un utilisateur a illustré un exemple MySQL et 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=?";
//...
Copier après la connexion

En remplaçant le paramètre par la chaîne columnNames, vous obtenez :

SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'
Copier après la connexion

Le résultat escompté, cependant, est :

SELECT a,b,c,d,e,f FROM some_table WHERE d='x'
Copier après la connexion

Solution :

L'utilisation directe d'instructions préparées pour les noms de colonnes dynamiques n'est pas réalisable. Les instructions préparées paramètrent les valeurs, pas les identifiants de colonnes.

Stratégies alternatives :

La solution la plus efficace consiste à modifier le schéma de la base de données. Au lieu de disperser les données sur plusieurs colonnes, introduisez une seule colonne pour contenir les colonnes nommées dynamiquement. Cette colonne contiendrait une chaîne sérialisée représentant une liste de noms de colonnes pour chaque ligne.

Cela nécessite une désinfection rigoureuse des entrées pour empêcher l’injection SQL. Utiliser String#replace() pour échapper aux guillemets, suivi d'une concaténation des noms de colonnes nettoyés dans la chaîne de requête SQL est une méthode viable. Envisagez d'utiliser des requêtes paramétrées pour d'autres parties de la requête afin de conserver les avantages en matière de sécurité lorsque cela est possible.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal