Mysql
 sql >> Base de données >  >> RDS >> Mysql

Puis-je paramétrer le nom de la table dans une instruction préparée ?

La réponse courte à votre question est "non".

Au sens le plus strict, au niveau de la base de données, les instructions préparées ne permettent de lier les paramètres que pour les bits "valeurs" de l'instruction SQL.

Une façon de penser à cela est "les choses qui peuvent être remplacées lors de l'exécution de l'instruction sans altérer sa signification". Le ou les noms de table ne font pas partie de ces valeurs d'exécution, car ils déterminent la validité de l'instruction SQL elle-même (c'est-à-dire, quels noms de colonne sont valides) et le modifier au moment de l'exécution modifierait potentiellement la validité de l'instruction SQL.

À un niveau légèrement supérieur, même dans les interfaces de base de données qui émulent la substitution de paramètres d'instructions préparées plutôt que d'envoyer réellement des instructions préparées à la base de données, comme PDO, ce qui pourrait éventuellement vous permettre d'utiliser un espace réservé n'importe où (puisque l'espace réservé est remplacé avant d'être envoyé à la base de données dans ces systèmes), la valeur de l'espace réservé de la table serait une chaîne, et incluse comme telle dans le SQL envoyé à la base de données, donc SELECT * FROM ? avec mytable car le paramètre finirait par envoyer SELECT * FROM 'mytable' à la base de données, qui est un SQL invalide.

Votre meilleur pari est simplement de continuer avec

SELECT * FROM {$mytable}

mais vous absolument devrait avoir une liste blanche de tables que vous vérifiez d'abord si cette $mytable provient de l'entrée de l'utilisateur.