Utilisation d'instructions préparées pour les noms de colonnes dynamiques
Lorsque vous travaillez avec des requêtes de base de données, un dilemme courant se pose lorsque vous essayez de spécifier des noms de colonnes dynamiques. Cet article explore la possibilité de transmettre des noms de colonnes variables via des instructions préparées, en particulier dans MySQL utilisant Java.
Déclaration de défi
Lorsque l'utilisateur tente d'exécuter l'instruction préparée, les noms de colonnes sont transmis sous forme de chaîne :
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");
Cependant, l'instruction SQL résultante affiche les noms de colonnes dans le cadre du littéral string :
SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'
Le résultat souhaité, cependant, est d'avoir les noms de colonnes dans des colonnes séparées :
SELECT a,b,c,d,e,f FROM some_table WHERE d='x'
Discussion sur la solution
Il est crucial de noter que cette pratique indique une conception de base de données défectueuse. Idéalement, les utilisateurs ne devraient pas connaître les noms des colonnes. Une meilleure solution serait de créer une colonne explicite dans la base de données pour stocker les « noms de colonnes » à la place.
Malheureusement, définir les noms de colonnes comme valeurs PreparedStatement n'est pas possible. Les instructions préparées ne peuvent être utilisées que pour définir les valeurs des colonnes.
Si l'utilisation de noms de colonnes variables est inévitable, il est nécessaire de nettoyer l'entrée et de construire manuellement la chaîne SQL. Cela implique de citer les noms de colonnes individuelles et d'échapper les guillemets dans les noms de colonnes à l'aide de String#replace().
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!