sql >> Database >  >> RDS >> Mysql

Kan ik de tabelnaam in een voorbereide instructie parametriseren?

Het korte antwoord op uw vraag is "nee".

In de meest strikte zin, op databaseniveau, laten voorbereide instructies alleen toe dat parameters worden gebonden aan "waarden"-bits van de SQL-instructie.

Een manier om dit te denken is "dingen die kunnen worden vervangen tijdens runtime-uitvoering van de instructie zonder de betekenis ervan te veranderen". De tabelnaam (-namen) is niet een van die runtime-waarden, omdat het de geldigheid van de SQL-instructie zelf bepaalt (dwz welke kolomnamen geldig zijn) en het wijzigen ervan tijdens de uitvoering zou mogelijk veranderen of de SQL-instructie geldig was.

Op een iets hoger niveau, zelfs in database-interfaces die de vervanging van voorbereide instructieparameters emuleren in plaats van daadwerkelijk voorbereide instructies naar de database te sturen, zoals PDO, waardoor u mogelijk overal een tijdelijke aanduiding kunt gebruiken (aangezien de tijdelijke aanduiding wordt vervangen voordat deze wordt verzonden naar de database in die systemen), zou de waarde van de tijdelijke aanduiding voor de tabel een tekenreeks zijn en als zodanig ingesloten in de SQL die naar de database wordt verzonden, dus SELECT * FROM ? met mytable omdat de parameter uiteindelijk SELECT * FROM 'mytable' . zou sturen naar de database, wat een ongeldige SQL is.

Je kunt het beste gewoon doorgaan met

SELECT * FROM {$mytable}

maar jij absoluut zou een witte lijst met tabellen moeten hebben die u eerst controleert als dat $mytable komt van gebruikersinvoer.




  1. Hoe de sortering van een tabel in MySQL te tonen

  2. Voeg veel rijen samen tot een enkele tekenreeks met groepering

  3. CONTROLEER BEPERKING van tekenreeks om alleen cijfers te bevatten. (Oracle-SQL)

  4. Application_name instellen op Postgres/SQLAlchemy