sql >> Base de Datos >  >> RDS >> Mysql

¿Puedo parametrizar el nombre de la tabla en una declaración preparada?

La respuesta corta a su pregunta es "no".

En el sentido más estricto, a nivel de la base de datos, las declaraciones preparadas solo permiten vincular parámetros para bits de "valores" de la declaración SQL.

Una forma de pensar en esto es "cosas que se pueden sustituir en la ejecución de la declaración en tiempo de ejecución sin alterar su significado". El(los) nombre(s) de la tabla no es uno de esos valores de tiempo de ejecución, ya que determina la validez de la instrucción SQL en sí (es decir, qué nombres de columna son válidos) y cambiarlo en el momento de la ejecución alteraría potencialmente si la instrucción SQL era válida.

En un nivel ligeramente superior, incluso en interfaces de bases de datos que emulan la sustitución de parámetros de declaraciones preparadas en lugar de enviar declaraciones preparadas a la base de datos, como PDO, lo que posiblemente podría permitirle usar un marcador de posición en cualquier lugar (ya que el marcador de posición se reemplaza antes de enviarse a la base de datos en esos sistemas), el valor del marcador de posición de la tabla sería una cadena, y encerrada como tal dentro del SQL enviado a la base de datos, por lo que SELECT * FROM ? con mytable ya que el parámetro en realidad terminaría enviando SELECT * FROM 'mytable' a la base de datos, que es un SQL no válido.

Lo mejor que puedes hacer es continuar con

SELECT * FROM {$mytable}

pero tú absolutamente debe tener una lista blanca de tablas que verifique primero si eso $mytable proviene de la entrada del usuario.