Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PDO MySQL: Diferencia entre bindParam y bindValue?

Estas en el tema de PDO MySQL: Diferencia entre bindParam y bindValue? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, recien estoy empezando con PDO y llegué al punto de no saber si usar bindParam o bindValue, ya que no sé la diferencia y ...
  #1 (permalink)  
Antiguo 28/10/2013, 20:32
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
PDO MySQL: Diferencia entre bindParam y bindValue?

Hola,

recien estoy empezando con PDO y llegué al punto de no saber si usar bindParam o bindValue, ya que no sé la diferencia y cual es recomendado usar, por ejemplo, en un INSERT

Yo lo estoy haciendo de esta forma:

Código PHP:
Ver original
  1. try{
  2.         $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  3.         $con = $this->_db->prepare('INSERT INTO usuarios VALUES(:id, :name, :pass, :email, :confirm, :activo)');
  4.         $con->bindValue(':id', '');
  5.         $con->bindValue(':name', $user);
  6.         $con->bindValue(':pass', $pass);
  7.         $con->bindValue(':email', $email);
  8.         $con->bindValue(':confirm', $clave);
  9.         $con->bindValue(':activo', false);
  10.         $con->execute();
  11.        
  12. }catch(PDOException $e) {
  13.         echo 'ERROR: ' . $e->getMessage();
  14. }

...es correcto eso?

Cómo puede prevenir inyecciones sql y demás?

Gracias
  #2 (permalink)  
Antiguo 28/10/2013, 21:53
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: PDO MySQL: Diferencia entre bindParam y bindValue?

Como dicen el mismo nombre la diferencia es esa, bindValue ata un parámetro a un valor dado, y bindParam a una variable, por lo que puedes hacer consultas preparadas en un ciclo, por ejemplo:
Código PHP:
Ver original
  1. $stmt = $con->prepare("INSERT INTO colors VALUES (?)");
  2. $stmt->bindParam(1, $color, PDO::PARAM_STR);
  3.  
  4. $colors = array('black', 'blue', 'red', 'yellow');
  5. foreach ($colors as $color) {
  6.         $stmt->execute();
  7. }

Con bindValue solo lo haces al valor que le defines al momento que mandas llamar.

El que uses cualquiera de los dos, te ayuda a prevenir inyecciones por el simple hecho de que primero se manda la consulta preparada al servidor y luego mandas los valores, con lo cual previenes la inyección.

Saludos.
  #3 (permalink)  
Antiguo 28/10/2013, 22:32
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: PDO MySQL: Diferencia entre bindParam y bindValue?

Cita:
Iniciado por GatorV Ver Mensaje
Como dicen el mismo nombre la diferencia es esa, bindValue ata un parámetro a un valor dado, y bindParam a una variable, por lo que puedes hacer consultas preparadas en un ciclo, por ejemplo:
Código PHP:
Ver original
  1. $stmt = $con->prepare("INSERT INTO colors VALUES (?)");
  2. $stmt->bindParam(1, $color, PDO::PARAM_STR);
  3.  
  4. $colors = array('black', 'blue', 'red', 'yellow');
  5. foreach ($colors as $color) {
  6.         $stmt->execute();
  7. }

Con bindValue solo lo haces al valor que le defines al momento que mandas llamar.

El que uses cualquiera de los dos, te ayuda a prevenir inyecciones por el simple hecho de que primero se manda la consulta preparada al servidor y luego mandas los valores, con lo cual previenes la inyección.

Saludos.
Gracias pero igual sigo confundido, ya q en el manual de php dice lo mismo q me estas explicando vos y da los mismos ejemplos para los dos casos y no me doy cuenta de la diferencia.

bindValue: Vincula un valor al parámetro de sustitución...

bindParam: Vincula una variable de PHP a un parámetro de sustitución con nombre...

Lo q no logro entender es, en este caso, a q le llama Valor y a q Variable...

Yo lo entiendo como q bindValue se usa para un valor unico o estatico y bindParam como en el ejemplo q me diste vos, con el array, para muchos valores dentro de una variable.

Esa es la diferencia q no puedo ver
  #4 (permalink)  
Antiguo 29/10/2013, 09:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: PDO MySQL: Diferencia entre bindParam y bindValue?

Es que no se cual es tu duda, un valor es algo lo que vale, por ejemplo si tenemos algo así:
Código PHP:
Ver original
  1. $var = 'foo';

El valor de esa variable es "foo", y el nombre de la variable es $var, cuando tu usas bindValue, no lo atas a $var, si no a "foo" entonces siempre que llames a execute() va a usar "foo" porque es el valor, si usas bindParam, entonces usa $var (por referencia) y siempre que llames a execute, va a ir a buscar a $var y va a tomar el valor que tenga en ese momento, así puedes ir cambiando el valor de $var y llamar a execute, sin tener que volver a preparar el query...
  #5 (permalink)  
Antiguo 29/10/2013, 13:49
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: PDO MySQL: Diferencia entre bindParam y bindValue?

Cita:
Iniciado por GatorV Ver Mensaje
Es que no se cual es tu duda, un valor es algo lo que vale, por ejemplo si tenemos algo así:
Código PHP:
Ver original
  1. $var = 'foo';

El valor de esa variable es "foo", y el nombre de la variable es $var, cuando tu usas bindValue, no lo atas a $var, si no a "foo" entonces siempre que llames a execute() va a usar "foo" porque es el valor, si usas bindParam, entonces usa $var (por referencia) y siempre que llames a execute, va a ir a buscar a $var y va a tomar el valor que tenga en ese momento, así puedes ir cambiando el valor de $var y llamar a execute, sin tener que volver a preparar el query...
Ahora si creo q me quedo claro...

Por ejemplo, quiero darle de baja a 5 usuarios al mismo tiempo y hago un UPDATE y utilizo bindParam, me conviene meter esos 5 usuarios en un array: $users = array(); y la consulta se realizar con el mismo prepare?, o sea q bindValue puede ser mas lento al realizar consultas?...
  #6 (permalink)  
Antiguo 29/10/2013, 15:21
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: PDO MySQL: Diferencia entre bindParam y bindValue?

Pues en ese caso te conviene mejor usar un solo query, te evitas la sobrecarga de hacer "n" queries:
Código SQL:
Ver original
  1. UPDATE `foo`='bar' WHERE id IN (1, 5, 18, 20)
  2. DELETE FROM `users` WHERE id IN (61, 123, 5534)

Saludos.
  #7 (permalink)  
Antiguo 29/10/2013, 16:19
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: PDO MySQL: Diferencia entre bindParam y bindValue?

Ok, gracias, justo estoy haciendo esa parte de "updatear".

Saludos

Etiquetas: diferencia, form, mysql, pdo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:30.