Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/09/2013, 20:28
starfix
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 12 años, 5 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