En artículos anteriores, ya hemos hablado sobre el paso de datos en PHP 7 usando PDO. Puedes acceder a este contenido en los enlaces a continuación:
- 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
En estos artículos aprendimos a usar el método bindParam() para proporcionar valores dinámicamente para una solicitud SQL usando PHP. Sin embargo, PHP también tiene el método bindValue(), que se utiliza en el mismo contexto. Tal vez ya te hayas preguntado: “¿Cuál es la diferencia entre ellos?” Eso es lo que aprenderemos en este artículo.
bindParam() vs bindValue()
En pocas palabras, la diferencia entre estos métodos es la siguiente:
1 - bindParam(). Para realizar la definición del valor de un parámetro, este método recibe como argumento una referencia, es decir, una variable o una constante. Esto significa que si proporcionamos un valor de manera directa para él, no funcionará.
2 - bindValue(). Para realizar la definición del valor de un parámetro, este método puede recibir como argumento tanto una referencia como un valor directo.
Para entender mejor esta diferencia, vamos a realizar un ejemplo práctico.
Ejemplo
Usaremos como ejemplo el código que ya desarrollamos en otros artículos sobre PDO, al que puedes acceder al comienzo de este artículo. Usaremos nuevamente PHP y PDO para ejecutar un script de INSERT en la base de datos. Nuestro código quedará así al inicio:
<?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: creamos la variable de conexión de la base de datos y creamos la variable $statement, que será responsable de preparar la consulta SQL que se ejecutará en la base. Observa que nuevamente creamos dos parámetros en esta consulta: :userName y :userEmail. Vamos a definir el valor de estos parámetros usando el método bindParam():
$statemet->bindParam(':userName', "Gláucio Daniel");
$statemet->bindParam(':userEmail', "[email protected]");
$statemet->execute();
echo "¡Datos insertados!";
Explicando: ejecutamos el método bindParam() dos veces, realizamos la llamada al método execute(), que será responsable de ejecutar la consulta SQL con los parámetros en la base de datos y por último creamos un mensaje de éxito, que se mostrará si todo ocurre sin problemas.
Pero, aún hablando sobre el método bindParam(), es interesante observar que definimos los valores de los parámetros como texto plano, es decir, en “texto puro”, mediante una cadena. Vamos a probar este código en el navegador.
Se devolvió un error, informando que el método bindParam() no pudo recibir el valor de su parámetro por referencia. Este error ocurre porque este método necesita una referencia, o variable para funcionar. Para resolver este asunto, nuestro código necesitaría estar así:
$name = "Gláucio Daniel";
$email = "[email protected]";
$statemet->bindParam(':userName', $name);
$statemet->bindParam(':userEmail', $email);
$statemet->execute();
echo "¡Datos insertados!";
Repara que ahora creamos dos variables que contienen los valores de los parámetros y proporcionamos estas variables al método bindParam(). Vamos a probar este código nuevamente en nuestro navegador.
Ahora sí, se devolvió el mensaje de éxito. Vamos a verificar si los datos se han insertado realmente en nuestra base.
Excelente, los datos fueron insertados!
Vamos a hacer el mismo procedimiento con el método bindValue(). Con este método podemos proporcionar los valores de los parámetros de las dos maneras: con variables o con valores en “texto puro”. Veamos a continuación un ejemplo con variables:
$name = "Djalma Sindeaux";
$email = "[email protected]";
$statemet->bindValue(':userName', $name);
$statemet->bindValue(':userEmail', $email);
Observa que la sintaxis no ha cambiado mucho, solo el nombre del método en sí. Vamos a verificar si sigue funcionando en el navegador
Perfecto, sigue funcionando. Ahora veamos un ejemplo proporcionando el valor de los parámetros de manera directa:
$statemet->bindValue(':userName', "Ronaldo Braz");
$statemet->bindValue(':userEmail', "[email protected]");
Al probar en el navegador, vemos el siguiente mensaje:
Se devolvió el mensaje de éxito. Pero, ¿los nuevos datos están en nuestra base?
Muy bien, los datos fueron insertados correctamente. Así entendemos que la diferencia entre los métodos bindParam() y bindValue() es pequeña, y un método ofrece un pequeño recurso más que el otro, pero ambos trabajan con el mismo objetivo.
Ahora que entendemos la funcionalidad de cada uno de estos métodos, estamos preparados para decidir cuándo utilizarlos en nuestros proyectos, para seguir desarrollando códigos PHP modernos y profesionales.
Hemos hablado bastante en este artículo sobre el paso de parámetros por valor y por referencia en PDO. Pero este concepto también se aplica cuando creamos nuestras propias funciones en PHP.
Aprenderemos un poco más sobre esto en el próximo artículo: Paso de Parámetros por Valor y Referencia en PHP, ¡hasta entonces! :)