Qual a diferença entre os métodos bindParam() e bindValue() no PHP?
Em artigos anteriores, nós já falamos sobre a passagem de dados no PHP 7 usando PDO. Você pode acessar esse conteúdo nos links abaixo:
- https://www.hcode.com.br/blog/consulta-pdo-com-passagem-de-parametros-no-php-7-parte-1
- https://www.hcode.com.br/blog/consulta-pdo-com-passagem-de-parametros-no-php-7-parte-2
Nesses artigos nós aprendemos a usar o método bindParam() para informar valores dinamicamente para uma requisição SQL usando PHP. Contudo, o PHP também possui o método bindValue(), que é usado no mesmo contexto. Talvez você já tenha se perguntado: “Qual é a diferença entre eles?” É isso o que iremos aprender neste artigo.
bindParam() vs bindValue()
Em poucas palavras, a diferença destes métodos é a seguinte:
1 - bindParam(). Para realizar a definição do valor de um parâmetro, esse método recebe como argumento uma referência, ou seja, uma variável ou uma constante. Isso significa que se informarmos um valor de maneira direta para ele, não irá funcionar.
2 - bindValue(). Para realizar a definição do valor de um parâmetro, esse método pode receber como argumento tanto uma referência como um valor direto.
Para entendermos melhor essa diferença, vamos realizar um exemplo prático.
Exemplo
Vamos usar como exemplo o código que já desenvolvemos em outros artigos sobre PDO, que você pode acessar no início desse artigo. Iremos usar novamente o PHP e o PDO para executar um script de INSERT no Banco de Dados. Nosso código ficará assim de início:
<?php
$connection = new PDO("mysql:dbname=hcode_pdo;host=127.0.0.1", "root", "root");
$statemet = $connection->prepare("INSERT INTO table_users (nameUser, emailUser) VALUES(:userName, :userEmail)");
Explicando: nós criamos a variável de conexão do Banco de Dados e criamos a variável $statement, que será a responsável por preparar a query SQL que será executada no Banco. Note que nós criamos novamente dois parâmetros nessa query: :userName e :userEmail. Vamos definir o valor desses parâmetros usando o método bindParam():
$statemet->bindParam(':userName', "Gláucio Daniel");
$statemet->bindParam(':userEmail', "glaucio@hcode.com.br");
$statemet->execute();
echo "Dados inseridos!";
Explicando: executamos o método bindParam() duas vezes, realizamos a chamada do método execute(), que será o responsável por de fato executar a query SQL com os parâmetros no Banco de Dados e por fim criamos uma mensagem de sucesso, que será exibida se tudo ocorrer sem problemas.
Mas, ainda falando sobre o método bindParam(), é interessante observar que nós definimos os valores dos parâmetros como que em plain text, ou seja, em “texto puro”, por meio de uma string. Vamos testar esse código no navegador.
Um erro foi retornado, informando que o método bindParam() não conseguiu receber o valor de seu parâmetro por referência. Esse erro ocorre pois esse método precisa de uma referência, ou variável para funcionar. Para resolver essa questão, nosso código precisaria estar assim:
$name = "Gláucio Daniel";
$email = "glaucio@hcode.com.br";
$statemet->bindParam(':userName', $name);
$statemet->bindParam(':userEmail', $email);
$statemet->execute();
echo "Dados inseridos!";
Repare que agora nós criamos duas variáveis que contém os valores dos parâmetros e nós informamos essas variáveis para o método bindParam(). Vamos testar esse código novamente em nosso navegador.
Agora sim a mensagem de sucesso foi retornada. Vamos conferir se os dados foram inseridos de fato em nosso Banco.
Excelente, os dados foram inseridos!
Vamos fazer o mesmo procedimento com o método bindValue(). Com esse método nós podemos informar os valores dos parâmetros das duas maneiras: com variáveis ou com valores em “texto puro”. Veja abaixo um exemplo com variáveis:
$name = "Djalma Sindeaux";
$email = "djalma@hcode.com.br";
$statemet->bindValue(':userName', $name);
$statemet->bindValue(':userEmail', $email);
Perceba que a sintaxe não mudou muito, apenas o nome do método de fato. Vamos conferir se continua funcionando no navegador
Perfeito, continua funcionando. Vamos ver agora um exemplo informando o valor dos parâmetros de maneira direta:
$statemet->bindValue(':userName', "Ronaldo Braz");
$statemet->bindValue(':userEmail', "ronaldo@hcode.com.br");
Ao testar no navegador, vemos a seguinte mensagem:
A mensagem de sucesso foi retornada. Mas, será que os novos dados estão em nosso Banco?
Muito bom, os dados foram inseridos corretamente. Entendemos assim que a diferença entre os métodos bindParam() e bindValue() é pequena, e um método oferece um pequeno recurso a mais que o outro, mas os dois trabalham com o mesmo objetivo.
Agora que entendemos a funcionalidade de cada um desses métodos, estamos preparados para decidir quando usá-los em nossos projetos, para continuar a desenvolver códigos PHP modernos e profissionais.
Nós falamos bastante nesta matéria sobre a passagem de parâmetros por valor e por referência no PDO. Mas esse conceito também é aplicado quando criamos nossas próprias funções no PHP.
Iremos aprender um pouco mais sobre isso no próximo artigo: Passagem de Parâmetros por Valor e Referência no PHP, até lá! :)