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

Kan jeg parametrisere tabelnavnet i en forberedt erklæring?

Kort svar på dit spørgsmål er "nej".

I den strengeste forstand, på databaseniveau, tillader forberedte sætninger kun at binde parametre for "værdier"-bits i SQL-sætningen.

En måde at tænke dette på er "ting, der kan erstattes ved runtime-udførelse af sætningen uden at ændre dens betydning". Tabelnavnene er ikke en af ​​disse runtime-værdier, da det bestemmer gyldigheden af ​​selve SQL-sætningen (dvs. hvilke kolonnenavne der er gyldige), og en ændring af den på udførelsestidspunktet ville potentielt ændre, om SQL-sætningen var gyldig.

På et lidt højere niveau, selv i databasegrænseflader, der emulerer forberedt sætningsparametersubstitution i stedet for rent faktisk at sende forberedte sætninger til databasen, såsom PDO, hvilket kunne tænkes at give dig mulighed for at bruge en pladsholder hvor som helst (da pladsholderen bliver erstattet, før den sendes til databasen i disse systemer), ville værdien af ​​tabelpladsholderen være en streng og indesluttet som sådan i den SQL, der sendes til databasen, så SELECT * FROM ? med mytable da parameteren faktisk ville ende med at sende SELECT * FROM 'mytable' til databasen, som er ugyldig SQL.

Dit bedste bud er bare at fortsætte med

SELECT * FROM {$mytable}

men du absolut skal have en hvidliste over tabeller, som du først tjekker mod, hvis den $mytable kommer fra brugerinput.




  1. Hvorfor bruger Oracle DBMS_STATS.GATHER_TABLE_STATS?

  2. DATENAME() Eksempler i SQL Server

  3. Hvordan udfører man en select-forespørgsel i en DO-blok?

  4. Sådan omdannes en database i MySQL Workbench