Mysql
 sql >> Database >  >> RDS >> Mysql

Posso parametrizzare il nome della tabella in un'istruzione preparata?

La risposta breve alla tua domanda è "no".

In senso stretto, a livello di database, le istruzioni preparate consentono solo di vincolare i parametri ai bit "valori" dell'istruzione SQL.

Un modo di pensare a questo è "cose ​​​​che possono essere sostituite durante l'esecuzione dell'istruzione in fase di esecuzione senza alterarne il significato". I nomi delle tabelle non sono uno di quei valori di runtime, in quanto determina la validità dell'istruzione SQL stessa (ad esempio, quali nomi di colonna sono validi) e la sua modifica al momento dell'esecuzione potrebbe potenzialmente alterare la validità dell'istruzione SQL.

A un livello leggermente superiore, anche nelle interfacce di database che emulano la sostituzione dei parametri delle istruzioni preparate piuttosto che inviare effettivamente istruzioni preparate al database, come PDO, che potrebbe plausibilmente consentire di utilizzare un segnaposto ovunque (poiché il segnaposto viene sostituito prima di essere inviato a il database in quei sistemi), il valore del segnaposto della tabella sarebbe una stringa e racchiuso come tale all'interno dell'SQL inviato al database, quindi SELECT * FROM ? con mytable poiché il parametro finirebbe effettivamente per inviare SELECT * FROM 'mytable' al database, che non è SQL non valido.

La soluzione migliore è continuare con

SELECT * FROM {$mytable}

ma tu assolutamente dovrebbe avere una lista bianca di tabelle che controlli prima se quel $mytable proviene dall'input dell'utente.