Rafael Souza Desenvolvimento Web

Posted
18 April 2008 @ 10am

Tagged
php

PDO: bindParam ou bindValue?

Programando hoje uma validação para o framework que estou desenvolvendo me deparei com um problema usando variáveis em SQL, mais especificamente usando variáveis com o PDO.

Escrevendo os testes unitários para essas validações notei que precisava mudar a forma como passava os parâmetros para a SQL, ao invés de passar no execute, precisaria passar usando uma função própria para isso.

Lendo o manual, achei três opções de bind, bindColumn, bindParam e bindValue, depois de ler a documentação, optei pela bindParam, pois bindColumn é usado para atribuir o resultado para uma variável diretamente e bindColumn… eu só fui ver depois :P

Meus testes já estavam prontos e passando corretamente, mas quando fiz a mudança começou a não passar mais, então comecei a debugar para ver o que estava acontecendo. Depois de horas perdidas descobri o problema, não posso usar bindParam, tenho que usar bindValue.

O método bindParam recebe o valor do parâmetro por referência, então se o valor da variável mudar entre o chamada de bindParam e execute, o valor do parâmetro muda, alterando o resultado da SQL, coloquei bindValue e tudo voltou ao normal, com os testes passando novamente. Mas o que me deixa intrigado é que o meu código não mudava nada na variável, não tinha nada entre os métodos que pudesse fazer com o o resultado fosse diferente.

Mas fica a lição, ler a documentação melhor da próxima vez ;)


2 Comments

Posted by
Daniel Ribeiro
1 April 2009 @ 8am

Olá Rafael, gostaria de uma ajuda. estou começando com PDO e gostaria de saber como você faz sua cláusula ‘WHERE’ de uma forma dinâmica. Até hoje faço montando a string lidando com os AND’s da vida. A grande questão é poder usar ou não alguns filtros, em um sql normal não temos muita saída, já com a PDO queria trocar algumas experiências. Abraços!


Posted by
rafaelss
1 April 2009 @ 9am

Ainda não achei um jeito muito mágico de montar SQLs dinâmicas sem ficar concatenando strings, você poderia usar arrays quem sabe pra melhorar um pouco, mas você perderia um pouco de flexibilidade (como montaria cláusulas mais complexas, ou simplesmente usar OR, LIKE, etc).

O importante é usar parâmetros nas SQLs, concatenar apenas as condições e alguma outra coisinha, porém tudo que for variável, que venha por POST, GET ou de qualquer outro lugar que você não tenha muito controle sobre o que pode ser enviado, coloca um parâmetro, Prepared Statements, usa bindParam, assim você evita uma série de problemas com injections.

Abraço!


Leave a Comment