Em Kohana 3, agora você pode ligamento chamado params em consultas, mas como faço para escapar que eu não pode vincular?

StackOverflow https://stackoverflow.com/questions/2204149

  •  18-09-2019
  •  | 
  •  

Pergunta

Em Kohana 3, posso vincular um parâmetro em uma consulta como assim

$query = 'SELECT name FROM users WHERE id = :id';

Este é limpo, mas às vezes eu quero outras coisas para ser configurável, como o nome da tabela. Quando eu uso uma param nomeado para o nome da tabela, ele falhar. Acabo vindo a construir a string nestas circunstâncias.

A minha pergunta é, como posso escapar caracteres potencialmente ruins ao fazer este tipo de construção corda? Em Kohana 2.x, você poderia fazer $this->db->escape() mas desde Kohana 3 é radicalmente diferente, eu imagino que há uma nova maneira?

Foi útil?

Solução

Apenas para adicionar à resposta de Mark Byers, a razão para que a parametrização do nome da tabela está falhando é que os parâmetros são escapou, como valores , enquanto um nome de tabela é uma identificador . O que está provavelmente acontecendo é que o nome da tabela está sendo envolvido em citações, enquanto ele deve estar sendo envolvido em backticks vez.

No entanto, como diz Mark, uma necessidade de escapar nomes de tabela sugere má concepção. Eles devem quer ser codificado ou armazenados em algum arquivo de configuração cujo conteúdo pode ser confiável para não necessidade de escapar de qualquer maneira. Tentando cobrir todas as suas bases, de tal forma que você não confia em sua própria configuração é mais provável uma perda de tempo.

Outras dicas

Eu nunca usei kohana, então desculpas se este comentário é completamente irrelevante, mas eu tenho alguns comentários sobre o que você está tentando fazer:

Quando eu uso uma param nomeado para o nome da tabela, ele falhar.

Presumo que isso é porque ele está contando com mecanismo de parâmetros do banco de dados subjacente, e eu não sei de qualquer banco de dados que permite que você dê um nome de tabela como um parâmetro em uma consulta. Então, sim, muito provavelmente você vai ter que construir uma cadeia de si mesmo.

como posso escapar caracteres potencialmente ruins ao fazer este tipo de construção corda?

Esta questão parece estranho ... ou você tem personagens potencialmente ruim em alguns de seus nomes de tabela ... em caso afirmativo, por quê? Ou então você está recebendo o nome da tabela a partir de uma fonte não confiável (user?). Isso soa como uma má idéia para mim. E se eles tentam ler a partir de uma tabela que não deveriam ter acesso? Não seria melhor ter uma lista bem definida de tablenames permissíveis e verifique se a tabela existe nessa lista, em vez de escapar nomes de tabela potencialmente ruins?

E eu tenho uma observação final: se você é capaz de mudar o nome da tabela em uma consulta e ainda funciona, este é possivelmente um sinal de que seu banco de dados não é normalizado corretamente. Talvez você pode combinar suas tabelas e adicionar uma coluna extra com informações sobre o agrupamento, e usar uma cláusula WHERE para selecionar os dados que você quer? Eu preciso saber mais sobre o seu modelo para sugerir algo mais concreto.

Eu não tenho certeza se isso ajuda a responder à sua pergunta em tudo, mas esses eram os meus pensamentos sobre a leitura sua pergunta. Eu espero que você pode usar alguns deles.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top