sql >> Databasteknik >  >> RDS >> Mysql

Kan jag parametrisera tabellnamnet i en förberedd sats?

Det korta svaret på din fråga är "nej".

I strikt mening, på databasnivå, tillåter förberedda satser endast parametrar att bindas för "värden"-bitar i SQL-satsen.

Ett sätt att tänka på detta är "saker som kan ersättas vid körning av uttalandet utan att ändra dess innebörd". Tabellnamnen är inte ett av dessa körtidsvärden, eftersom det bestämmer giltigheten för själva SQL-satsen (dvs vilka kolumnnamn som är giltiga) och att ändra den vid körning skulle potentiellt ändra om SQL-satsen var giltig.

På en något högre nivå, även i databasgränssnitt som emulerar förberedd satsparametersubstitution snarare än att faktiskt skicka beredda satser till databasen, såsom PDO, vilket kan tänkas tillåta dig att använda en platshållare var som helst (eftersom platshållaren ersätts innan den skickas till databasen i dessa system), skulle värdet på tabellplatshållaren vara en sträng, och som sådan innesluten i den SQL som skickas till databasen, så SELECT * FROM ? med mytable eftersom paramet faktiskt skulle skicka SELECT * FROM 'mytable' till databasen, vilket är ogiltig SQL.

Det bästa är bara att fortsätta med

SELECT * FROM {$mytable}

men du absolut bör ha en vit lista med tabeller som du kollar mot först om den $mytable kommer från användarinmatning.




  1. Hur parallella planer startar – del 3

  2. Hur man frågar jsonb-arrayer med IN-operator

  3. Bakgrundsprocesser

  4. SQLite GILLA