Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PDO prepare falla en consulta con LIMIT y signo de interrogacion

Estas en el tema de PDO prepare falla en consulta con LIMIT y signo de interrogacion en el foro de PHP en Foros del Web. tengo la siguiente funcion que obtiene los productos de la BD dependiendo de la categoria.... la consulta SQL no falla, lo que falla es la ...
  #1 (permalink)  
Antiguo 23/09/2013, 20:28
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 12 años, 11 meses
Puntos: 25
PDO prepare falla en consulta con LIMIT y signo de interrogacion

tengo la siguiente funcion que obtiene los productos de la BD dependiendo de la categoria.... la consulta SQL no falla, lo que falla es la ejecucion de la consulta.


Código PHP:
Ver original
  1. //devuelve todos los productos que sean de la $Categoria
  2.     public static function obtenerTodosPorCategoria($categoria, $ultimoID= 0, $inicio= 0, $offset= 5){
  3.        
  4.     //se comprueba de que se haya enviado algun valor y que sea un string  
  5.      if (!isset($categoria)) return ProductoDAO::$datosNull;
  6.      
  7.      if (!is_string($categoria) || empty($categoria)) ProductoDAO::$datosIncorrectos;
  8.            
  9.         $retorno= null;
  10.        
  11.        
  12.         $link= Conexion::conectar();
  13.        
  14.        
  15.         //se obtiene el id de la categoria
  16.         $categoriaID= CategoriaDAO::obtenerID($categoria);
  17.        
  18.         if ($link == null) return ProductoDAO::$conexionNull;
  19.  
  20.  
  21.         $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  22.         $consulta= $link->prepare("SELECT * FROM producto WHERE idCategoria = ? AND idProducto > ? LIMIT ? OFFSET ?;");
  23.        
  24.         $consulta->execute(array($categoriaID, $ultimoID, $inicio, $offset));
  25.            
  26.         $resultado= $consulta->fetchAll();
  27.            
  28.         $retorno= array();
  29.            
  30.         //$_Tupla es de tipo PDOStatement
  31.            
  32.         foreach ($resultado as $tupla){
  33.                
  34.             $productoTemp= new Producto();
  35.                    
  36.             $productoTemp->setId($tupla['idProducto']);
  37.             $productoTemp->setNombre($tupla['nombre']);
  38.             $productoTemp->setPrecio($tupla['precio']);
  39.             $productoTemp->setStock($tupla['stock']);
  40.             $productoTemp->setCategoria($tupla['idCategoria']);
  41.             $productoTemp->setPathImagen($tupla['imagen']);
  42.             $productoTemp->setDescripcion($tupla['descripcion']);
  43.                    
  44.                    
  45.             array_push($retorno, $productoTemp);       
  46.         }//fin foreach ($_Link->query($_Consulta) as $_Tupla)
  47.                                
  48.            
  49.            
  50.         //se desconecta de la base de datos
  51.         Conexion::desconectar($link);
  52.            
  53.         return $retorno;
  54.      }//fin BuscarTodosPorCategoria($Categoria)

me devuelve la siguiene excepcion.


Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0' OFFSET '5'' at line 1' in C:\xampp\htdocs\hastamicasa\DAO\ProductoDAO.php:28 9 Stack trace: #0 C:\xampp\htdocs\hastamicasa\DAO\ProductoDAO.php(28 9): PDOStatement->execute(Array) #1 C:\xampp\htdocs\hastamicasa\ajax\obtenerproductos. php(12): ProductoDAO::obtenerTodosPorCategoria('limpieza') #2 {main} thrown in C:\xampp\htdocs\hastamicasa\DAO\ProductoDAO.php on line 289




ahora, si cambio la consulta de la linea 22 por la siguiente no causa problemas:

Código SQL:
Ver original
  1. SELECT * FROM producto WHERE idCategoria = ? AND idProducto > ? LIMIT 0 OFFSET 0;

por lo que el problema esta en LIMIT.... tambien probe las siguiente consulta, con el mismo resultado:

Código SQL:
Ver original
  1. SELECT * FROM producto WHERE idCategoria = ? AND idProducto > ? LIMIT ?,?;

mismo problema.

Dando vueltas por internet, me encontre con que tendria que cambiar los signos de interrogacion por "variables" (o como se llamen, ahora lo ven):

Código SQL:
Ver original
  1. --cambiando lineas 22 y 24 por las siguientes
  2.  $consulta= $link->PREPARE("SELECT * FROM producto WHERE idCategoria= :categoria AND idProducto > :producto LIMIT :inicio OFFSET :offset;", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
  3.  
  4. $consulta->EXECUTE(array(':categoria' =>$categoriaID, ':producto' => $ultimoID, ':inicio' => $inicio, ':offset' => $offset));

lo anterior segun la documentacion de php





Esto me esta comiendo la cabeza y quisiera saber si alguien tuvo el mismo problema y pudo solucionarlo. En caso de que lo hayan echo, preferiria que la solucion sea usando los signos de interrogacion.


Por el momento voy a seguir buscando la solucion


saludos y gracias
  #2 (permalink)  
Antiguo 23/09/2013, 21:02
 
Fecha de Ingreso: mayo-2012
Ubicación: Argentina, Buenos Aires
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: PDO prepare falla en consulta con LIMIT y signo de interrogacion

Hace un copy & paste de la consulta en el SQL, recuerdo haber tenido un problema similar con el LIMIT. Fijate como lo hace en phpmyadmin o alguno de esos.

PD: Usar etiquetas es la mejor forma de usar PDO.
  #3 (permalink)  
Antiguo 24/09/2013, 02:51
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: PDO prepare falla en consulta con LIMIT y signo de interrogacion

1- PDO prepare usando signos de interrogación trata todas las variables como si fueran cadenas, por lo que usará comillas para delimitar el valor
2- No debes encerrar entre comillas los valores para LIMIT y OFFSET porque deben ser numéricos
3- Puedes hacerlo con :alias para cada valor, o bien, integrar directamente los valores en la consulta, ejemplo:

Código PHP:
Ver original
  1. $consulta = "SELECT * FROM producto WHERE idCategoria = ? AND idProducto > ? LIMIT $offset, $limite";

Teóricamente, no hay riesgos en hacerlo así, ya que se supone que eres tú quien controla y verifica que esos valores sean numéricos y estén dentro del rango permitido.

nelsonpk, de acuerdo, usar etiquetas es la mejor forma de trabajar en PDO, pero con bindParam(), donde puedes especificar tipo y longitud del dato:

Código PHP:
Ver original
  1. // Enlazando parámetros
  2. $sql = "SELECT * FROM tabla WHERE cadena = :cadena";
  3. $sth = $db->prepare($sql);
  4. $sth->bindParam(':cadena', $cadena, PDO::PARAM_STR, 50);
  5. $sth->execute();
__________________
- León, Guanajuato
- GV-Foto
  #4 (permalink)  
Antiguo 24/09/2013, 07:30
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 12 años, 11 meses
Puntos: 25
Respuesta: PDO prepare falla en consulta con LIMIT y signo de interrogacion

bien, ya pude solucionar el tema de la excepcion :). Ahora, la parte de la consulta, la cambie un poco yme quedo de la siguiente manera:

Código PHP:
Ver original
  1. $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  2. $consulta= $link->prepare("SELECT * FROM producto WHERE idCategoria= :categoria AND idProducto > :producto LIMIT :offset;", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
  3.  
  4. $consulta->bindParam(':categoria', $CategoriaID, PDO::PARAM_INT);
  5. $consulta->bindParam(':producto', $ultimoID, PDO::PARAM_INT);
  6. $consulta->bindParam(':offset', $offset, PDO::PARAM_INT);
  7. $consulta->execute();
  8.            
  9. $resultado= $consulta->fetchAll();

creo que el procedimiento esta bien y me tendria que retornar 1 resultado (lo probe en phpmyadmin y devuelve 1 resultado para "SELECT * FROM producto WHERE idCategoria=1 AND idProducto > 0 LIMIT 5;")

al hacer un var_dump($consulta) me devuelve lo siguiente:

object(PDOStatement)#3 (1) { ["queryString"]=> string(94) "SELECT * FROM producto WHERE idCategoria= :categoria AND idProducto > :producto LIMIT :offset;" }

eso esta bien? o tendria que devolver la consulta con las etiquetas reemplazadas con sus valores?
  #5 (permalink)  
Antiguo 24/09/2013, 08:22
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 12 años, 11 meses
Puntos: 25
Respuesta: PDO prepare falla en consulta con LIMIT y signo de interrogacion

perdon por el error, al parecer coloque una mayuscula donde no debia y estaba pasando mal la variable para la etiqueta :categoria:

Código PHP:
Ver original
  1. $consulta->bindParam(':categoria', $categoriaID, PDO::PARAM_INT);


ahora funciona perfectamente :). Muchas gracias por ayudarme

Etiquetas: falla, limit, mysql, pdo, select, signo, sql, variable
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 18:18.