Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Kann ich den Tabellennamen in einer vorbereiteten Anweisung parametrisieren?

Kurze Antwort auf Ihre Frage ist "nein".

Genau genommen erlauben vorbereitete Anweisungen auf Datenbankebene nur das Binden von Parametern für "Werte"-Bits der SQL-Anweisung.

Eine Denkweise dafür ist "Dinge, die bei der Ausführung der Anweisung zur Laufzeit ersetzt werden können, ohne ihre Bedeutung zu ändern". Die Tabellennamen gehören nicht zu diesen Laufzeitwerten, da sie die Gültigkeit der SQL-Anweisung selbst bestimmen (dh welche Spaltennamen gültig sind) und eine Änderung zur Ausführungszeit möglicherweise ändern würde, ob die SQL-Anweisung gültig war.

Auf einer etwas höheren Ebene, sogar in Datenbankschnittstellen, die die Parameterersetzung vorbereiteter Anweisungen emulieren, anstatt vorbereitete Anweisungen tatsächlich an die Datenbank zu senden, wie z die Datenbank in diesen Systemen), wäre der Wert des Tabellenplatzhalters eine Zeichenfolge und als solche in das an die Datenbank gesendete SQL eingeschlossen, also SELECT * FROM ? mit mytable da der Parameter tatsächlich SELECT * FROM 'mytable' senden würde an die Datenbank, die ungültiges SQL ist.

Am besten fahren Sie einfach mit

fort
SELECT * FROM {$mytable}

aber Sie auf jeden Fall sollte eine weiße Liste von Tabellen haben, die Sie zuerst überprüfen, wenn diese $mytable kommt von Benutzereingaben.