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 ?
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 :
<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>
En remplaçant le paramètre par la chaîne columnNames
, vous obtenez :
<code class="language-sql">SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'</code>
Le résultat escompté, cependant, est :
<code class="language-sql">SELECT a,b,c,d,e,f FROM some_table WHERE d='x'</code>
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!