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

Problema al pasarle listado a PDO

Estas en el tema de Problema al pasarle listado a PDO en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, No encuentro la forma de pasarle a PDO un listado de valores como si fuese una consulta de este tipo en el que selecciono ...
  #1 (permalink)  
Antiguo 18/11/2011, 14:39
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Problema al pasarle listado a PDO

Buenas,

No encuentro la forma de pasarle a PDO un listado de valores como si fuese una consulta de este tipo en el que selecciono los productos que estan dentro del listado.
SELECT * FROM productos where id_producto in (1,5,9,3)

Código PHP:
Ver original
  1. $id_producto=1,5,9,3;
  2. $query = "SELECT * FROM productos where id_producto in (:id_producto)";
  3. $comando = $db_datos->prepare($query);
  4. $comando->execute(array(':id_producto'=>$id_producto));
  5. $result = $comando->fetchAll(PDO::FETCH_ASSOC);
  6.  
  7. echo "<pre>";print_r($result);echo "</pre>";

Me arroja un error en la linea del $id_producto=1,5,9,3;

Parse error: syntax error, unexpected ','

He probado entre comillas pero solo me muestra los productos con id = 1 el resto los ignora.
$id_producto='1,5,9,3';

Alguna sugerencia o idea?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 18/11/2011, 16:49
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Problema al pasarle listado a PDO

creo que una vez tube la necesidad de hacer algo parecido y al final tube que hacerlo sin el :parametro, el problema en este caso aunque es una de las ventajas es que PDO cuando ejecuta esas consultas preparadas escapa todo carácter especial para evitar la inyeccion SQL y entonces la la , te la estaria escapando (\,), pensando que tu consulta es un String (esto segun he leido), no se si alguien haya hecho algo parecido pasandole el parametro a la consulta preparada, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #3 (permalink)  
Antiguo 21/11/2011, 16:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema al pasarle listado a PDO

PDO no soporta eso, según el manual:
Código PHP:
Ver original
  1. You must include a unique parameter marker for each value you wish to pass in to the statement when you call PDOStatement::execute(). You cannot use a named parameter marker of the same name twice in a prepared statement. You cannot bind multiple values to a single named parameter in, for example, the IN() clause of an SQL statement.

Tienes que construir manualmente tu query.

Saludos.
  #4 (permalink)  
Antiguo 14/12/2011, 15:32
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Problema al pasarle listado a PDO

Cita:
Iniciado por GatorV Ver Mensaje
PDO no soporta eso, según el manual:
Código PHP:
Ver original
  1. You must include a unique parameter marker for each value you wish to pass in to the statement when you call PDOStatement::execute(). You cannot use a named parameter marker of the same name twice in a prepared statement. You cannot bind multiple values to a single named parameter in, for example, the IN() clause of an SQL statement.

Tienes que construir manualmente tu query.

Saludos.
Le he estado dando vueltas GatorV e incluso consultando con amigos y no vemos la forma de construir una sentencia sql que tenga en cuenta los siguientes parametros de entrada

$ciudad_id=7
$precioA=0;
$precioB=30;
$descuentoA=85;
$descuentoB=100;
$partner_id=1,2,3,4;
$categoria_id=100,200;
$orden='precio';

Lo que nos mata es que tengo dos variables y lo que recibo es una lista de valores 1,2,3,4 y 100,200 en el ejemplo, pero pueden tener desde 1 elemento hasta n diferentes.

Cómo puedo construir eso manualmente? :S

Muchas gracias de antemano!
  #5 (permalink)  
Antiguo 14/12/2011, 19:06
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Problema al pasarle listado a PDO

al ser in lo toma como un or, pudieras hacer un bucle para hacerlo, imagino que es un array tu lista pudieras hacer algo como esto
Código PHP:
Ver original
  1. <?php
  2. $array = array(1,2,3);
  3. foreach($array as $k => $v) {
  4.      $arrayOr[] = "campo = ?";
  5.      $valorOr = array($v);
  6. }
  7. $or = implode(" OR ", $arrayOr);
  8. $query = "SELECT * FROM tu_tabla WHERE $or";
  9. echo $query;
  10. ?>
ve el query lo demas es cuestion tuya
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #6 (permalink)  
Antiguo 15/12/2011, 01:14
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Problema al pasarle listado a PDO

Gracias carlos_belisario, al final la solución que encontré fue más facil aún, si es que a veces lo mas evidente nos lo saltamos xDD

Lo que recibo del formulario no son arrays, los dos listas de valores que no dejan de ser simples cadenas separadas por comas.

Código PHP:
Ver original
  1. $consulta="SELECT *
  2.         FROM tabla
  3.         WHERE ciudad_id = :ciudad_id
  4.             AND descuento BETWEEN :descuentoA AND :descuentoB
  5.             AND precio BETWEEN :precioA AND :precioB
  6.             AND partner_id in (#PARTNER)
  7.         ORDER BY precio";
  8.        
  9. $lista1 = '1,2,3,4';
  10. $arraylista1 = explode(',',$lista1);
  11. $sql = str_replace('#PARTNER' , $lista1 , $consulta);

y el mismo procedicimiento haría con la otra lista. De esta manera aún podría usar la clase PDO para tratar el resto de variables.

Saludos
  #7 (permalink)  
Antiguo 15/12/2011, 08:23
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Problema al pasarle listado a PDO

es que si es como lo estas indicando no es necesario si quiera que utilices el str_replace, ya que no estas utilizando el bind-param sino que estas colocando el string con los id sin pasarlo y esto lo puedes hacer directo en la consulta sin problema alguno, el problema con los IN sql y PDO es que no puedes pasarle varios parámetros, pero si lo haces manual como lo estas haciendo no hay necesidad de complicarse tanto, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way

Etiquetas: listado, pdo, select
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 12:35.