Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Posso parametrizar o nome da tabela em uma instrução preparada?


A resposta curta à sua pergunta é "não".

No sentido mais estrito, no nível do banco de dados, as instruções preparadas permitem apenas que os parâmetros sejam vinculados a bits de "valores" da instrução SQL.

Uma maneira de pensar nisso é "coisas que podem ser substituídas na execução da instrução em tempo de execução sem alterar seu significado". O(s) nome(s) da tabela não é um desses valores de tempo de execução, pois determina a validade da própria instrução SQL (ou seja, quais nomes de coluna são válidos) e alterá-la no tempo de execução potencialmente alteraria se a instrução SQL era válida.

Em um nível um pouco mais alto, mesmo em interfaces de banco de dados que emulam a substituição de parâmetros de instrução preparada em vez de enviar instruções preparadas para o banco de dados, como PDO, o que poderia permitir que você use um espaço reservado em qualquer lugar (já que o espaço reservado é substituído antes de ser enviado para o banco de dados nesses sistemas), o valor do marcador de posição da tabela seria uma string e incluído como tal dentro do SQL enviado ao banco de dados, então SELECT * FROM ? com mytable pois o parâmetro acabaria enviando SELECT * FROM 'mytable' para o banco de dados, que é SQL inválido.

Sua melhor aposta é apenas continuar com
SELECT * FROM {$mytable}

mas você absolutamente deve ter uma lista branca de tabelas que você verifica primeiro se $mytable está vindo da entrada do usuário.