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//devuelve todos los productos que sean de la $Categoria
public static function obtenerTodosPorCategoria($categoria, $ultimoID= 0, $inicio= 0, $offset= 5){
//se comprueba de que se haya enviado algun valor y que sea un string
if (!isset($categoria)) return ProductoDAO
::$datosNull;
if (!is_string($categoria) || empty($categoria)) ProductoDAO
::$datosIncorrectos;
$retorno= null;
$link= Conexion::conectar();
//se obtiene el id de la categoria
$categoriaID= CategoriaDAO::obtenerID($categoria);
if ($link == null) return ProductoDAO::$conexionNull;
$link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$consulta= $link->prepare("SELECT * FROM producto WHERE idCategoria = ? AND idProducto > ? LIMIT ? OFFSET ?;");
$consulta->execute(array($categoriaID, $ultimoID, $inicio, $offset));
$resultado= $consulta->fetchAll();
//$_Tupla es de tipo PDOStatement
foreach ($resultado as $tupla){
$productoTemp= new Producto();
$productoTemp->setId($tupla['idProducto']);
$productoTemp->setNombre($tupla['nombre']);
$productoTemp->setPrecio($tupla['precio']);
$productoTemp->setStock($tupla['stock']);
$productoTemp->setCategoria($tupla['idCategoria']);
$productoTemp->setPathImagen($tupla['imagen']);
$productoTemp->setDescripcion($tupla['descripcion']);
}//fin foreach ($_Link->query($_Consulta) as $_Tupla)
//se desconecta de la base de datos
Conexion::desconectar($link);
return $retorno;
}//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 originalSELECT * 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 originalSELECT * 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--cambiando lineas 22 y 24 por las siguientes
$consulta= $link->PREPARE("SELECT * FROM producto WHERE idCategoria= :categoria AND idProducto > :producto LIMIT :inicio OFFSET :offset;", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$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