MySQL - Convertir Procedimiento en comando sql

 
Vista:

Convertir Procedimiento en comando sql

Publicado por Ansermo (1 intervención) el 13/11/2010 18:12:03
Saludo, hace poco termine una pagina autodidacta que utiliza procedimiento almacenado en su base de datos (procedure Stored) sin embargo no he encontrado hosting gratuito que ofresca el servicio de procedimiento almacenado en su base de datos, por lo tanto he decidido cambiar los procedimientos almacenados a sentencia sql, la mayorias han funcionado sin embargo tengo problema con la sgte.

(PROCEDURE `catalog_get_products_in_category`(
IN inCategoryId INT, IN inShortProductDescriptionLength INT,
IN inProductsPerPage INT, IN inStartItem INT)
BEGIN
PREPARE statement FROM
"SELECT
p.product_id, p.name,
IF(LENGTH(p.description) <= ?,
p.description,
CONCAT(LEFT(p.description, ?), '...')) AS description,
p.price, p.discounted_price, p.price2, p.discounted_price2, p.price3, p.discounted_price3, p.price4,
p.discounted_price4, p.price5, p.discounted_price5, p.price6, p.discounted_price6, p.thumbnail
FROM
product p
INNER JOIN product_category pc
ON p.product_id = pc.product_id
WHERE pc.category_id = ?
ORDER BY p.display DESC
LIMIT ?, ?";

SET @p1 = inShortProductDescriptionLength;
SET @p2 = inShortProductDescriptionLength;
SET @p3 = inCategoryId;
SET @p4 = inStartItem;
SET @p5 = inProductsPerPage;

EXECUTE statement USING @p1, @p2, @p3, @p4, @p5;
END)


LA CUAL ES CONVERTIDO EN LA SIGUIENTE SENTENCIA SQL



$sql =
'PREPARE statement FROM
"SELECT
p.product_id, p.name,
IF(LENGTH(p.description) <= ?,
p.description,
CONCAT(LEFT(p.description, ?), '...')) AS description,
p.price, p.discounted_price, p.price2, p.discounted_price2, p.price3, p.discounted_price3, p.price4,
p.discounted_price4, p.price5, p.discounted_price5, p.price6, p.discounted_price6, p.thumbnail
FROM
product p
INNER JOIN product_category pc
ON p.product_id = pc.product_id
WHERE pc.category_id = ?
ORDER BY p.display DESC
LIMIT ?, ?";

SET @p1 = inShortProductDescriptionLength;
SET @p2 = inShortProductDescriptionLength;
SET @p3 = inCategoryId;
SET @p4 = inStartItem;
SET @p5 = inProductsPerPage;

EXECUTE statement USING @p1, @p2, @p3, @p4, @p5';

sin embargo me presenta el siguiente error "Parse error: parse error in C:\metalarts\business\catalog.php on line 168" la lineas 168 es dice "CONCAT(LEFT(p.description, ?), '...')) AS description," imagino que es por la comilla simple pero es la que recomienda el manual para encerrar string. necesito su ayuda por favor.

"
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Convertir Procedimiento en comando sql

Publicado por GonzaloGC (339 intervenciones) el 13/11/2010 20:57:01
Tu problema no es de MySQL, es un error de código PHP.

"Parse error:..." es un error detectado por el parser de PHP que te está indicando que has cometido un error sintactico en el programa, pero no tiene nada que ver con la sentencia SQL.

El tema puede ser cuestión de comillas o apóstrofes, pero es mucho más simple de lo que supones:
1) Encierra la creación de la sentencia SQL entre comillas.
2) Toda cadena de texto que encuentres DENTRO DEL SQL debe forzosamente estar entre apóstrofes. En tu caso estás poniendo comillas cuando poner el SELECT:
-------------------------------------------- codigo PHP ---------------------------------------------
'PREPARE statement FROM
"SELECT
-------------------------------------------- codigo PHP ---------------------------------------------
El código debería ir:
-------------------------------------------- codigo PHP ---------------------------------------------

$sql = "PREPARE statement FROM 'SELECT p.product_id, p.name, IF(LENGTH(p.description) <= ?, p.description, CONCAT(LEFT(p.description, ?), '...')) AS description, p.price, p.discounted_price, p.price2, p.discounted_price2, p.price3, p.discounted_price3, p.price4, p.discounted_price4, p.price5, p.discounted_price5, p.price6, p.discounted_price6, p.thumbnail
FROM product p INNER JOIN product_category pc ON p.product_id = pc.product_id
WHERE pc.category_id = ?
ORDER BY p.display DESC
LIMIT ?, ?' ";
-------------------------------------------- codigo PHP ---------------------------------------------

Consejo final: Usa para programar en PHP una aplicación que tenga resaltado de código y parseo de sintaxis, así te evitarás estos errores muy fácilmente.
Personalmente te recomiendo NetBeans, de Sun (actualmente de Oracle). Tiene un parser muy bueno que incluso revisa la sintaxis de los archivos que no están abiertos en el proyecto que trabajas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Convertir Procedimiento en comando sql

Publicado por ansermo (3 intervenciones) el 14/11/2010 16:46:16
Gracias amigo Gonzalos, me lleve de vuestra sugerencia y estoy descargando Netbeans-6_9_1,
con relacion a la repuesta muy rapida y efectiva, sin embargo sigo confrontando un error aparentemente generado por la misma linea de codigo,
------------------------------------inicio error----------------------------------------------------------------
TEXT: 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 '...')) AS description, ----------ATENCION AQUI----------------
p.price, p.discounted_price, p.price2, p.disco' at line 2
LOCATION: C:\metalarts\business\database_handler.php, line 100, at November 14, 2010, 3:14 pm
Showing backtrace:
trigger_error("SQLSTATE[42000]: Syntax error or access violation: 1064 You have...", "256") # line 100, file: C:\metalarts\business\database_handler.php
DatabaseHandler.GetAll("PREPARE statement FROM
'SELECT
p.product_id, p.name,
...", Array[4]) # line 196, file: C:\tshirtshop\business\catalog.php
Catalog.GetProductsInCategory("22", "1", "1") # line 82, file: C:\metalarts\presentation\products_list.php
ProductsList.init() # line 16, file: C:\metalarts\presentation\smarty_plugins\function.load_presentation_object.php
smarty_function_load_presentation_object(Array[2], Object: Application) # line 5, file: C:\metalarts\presentation\templates_c\%%10^108^1083067C%%products_list.tpl.php
include("C:\metalarts\presentation\templates_c\%%10^108^1083067C%%produc...") # line 1869, file: C:\metalarts\libs\smarty\Smarty.class.php
Smarty._smarty_include(Array[2]) # line 12, file: C:\metalarts\presentation\templates_c\%%69^691^6917ADC1%%department.tpl.php
include("C:\metalarts\presentation\templates_c\%%69^691^6917ADC1%%depart...") # line 1869, file: C:\metalarts\libs\smarty\Smarty.class.php
Smarty._smarty_include(Array[2]) # line 37, file: C:\metalarts\presentation\templates_c\%%41^412^412F4E3D%%store_front.tpl.php
include("C:\metalarts\presentation\templates_c\%%41^412^412F4E3D%%store_...") # line 1256, file: C:\metalarts\libs\smarty\Smarty.class.php
Smarty.fetch("store_front.tpl", null, null, true) # line 1106, file: C:\metalarts\libs\smarty\Smarty.class.php
Smarty.display("store_front.tpl") # line 33, file: C:\metalarts\index.php

------------------------------------fin error----------------------------------------------------------------
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Convertir Procedimiento en comando sql

Publicado por martin (150 intervenciones) el 15/11/2010 03:50:34
Creo que te tenes un parentesis de mas.

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Convertir Procedimiento en comando sql

Publicado por ansermo (3 intervenciones) el 15/11/2010 13:08:20
Disculpa Martin, pero no logro localizar el parentesis de mas que dice, tengo cuatro apertura y cuatro cierre aparentemente todo necesarios:

1-apertura del IF
2-apertura variable del LENGHT
3-Cierre variable del LENGHT
4-apertura del CONCAT
5-apertura del LEFT
6-cierre del LEFT
7-Cierre del CONCAT
8-Cierre del IF

gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Convertir Procedimiento en comando sql

Publicado por GonzaloGC (339 intervenciones) el 15/11/2010 15:30:46
Hay dos puntos probables de error:
1) Insuficientes parámetros. Esa stored query requiere cinco (5) parámetros. Si le pones menos te dará error de sintaxis.

2) Uso indebido de palabras reservadas. Esto se puede apreciar fácilmente cuando usas alguna interfase con resaltado para SQL, tal como el MySQL Workbench o MySQL Query Browser:
la consulta en sí contiene esto:

-----------------------------------------------------------------------------------------------------------------------
SELECT
p.product_id,
p.name, -- <-- Esta es una palabra reservada. debe ir por lo menos entre acentos inversos (`)
IF(LENGTH(p.description) <= ?, p.description, CONCAT( LEFT(p.description, ?), '...' ) ) AS description,
p.price,
p.discounted_price,
p.price2,
p.discounted_price2,
p.price3,
p.discounted_price3,
p.price4,
p.discounted_price4,
p.price5,
p.discounted_price5,
p.price6,
p.discounted_price6,
p.thumbnail
FROM
product p INNER JOIN
product_category pc ON p.product_id = pc.product_id
WHERE
pc.category_id = ?
ORDER BY p.display DESC
LIMIT ?, ?
-----------------------------------------------------------------------------------------------------------------------
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Convertir Procedimiento en comando sql

Publicado por Ansermo (3 intervenciones) el 16/11/2010 05:48:48
Gonzalo disculpa que abuse de tu generosidad, pero resulta que apena macujeo el ingles, e imagino que tu experiencia te permite un mejor manejo de dicho idioma, si es que no lo habla, buscando en google he llegado a un foro donde se toca el problema como un bug de php con PDO(http://bugs.php.net/bug.php?id=40740&edit=2 y http://bugs.php.net/bug.php?id=44639 ) sin embargo el poco manejo del idioma ingles y el menos conocimiento de php me dejan practicamente en el aires por lo que te quiero solicitar a fin de que le de una chequeadita a los foros citados y si hay alguna solucion o altenativa que me permita solucionar dicho problema,me la comente por este mismo foro a fin de que otros al que se le pueda presentar dicho problema, tambien tenga repuesta.
te agradezco la consideracion y ayuda de tu parte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Convertir Procedimiento en comando sql

Publicado por GonzaloGC (339 intervenciones) el 16/11/2010 16:19:37
El primero de los casos (http://bugs.php.net/bug.php?id=40740&edit=2) hace referencia a la versión de PHP 5.2.1. que tiene un bug que hace que si está presente la cláusula LIMIT, la librería encierra entre apóstrofes ambos parámetros, como si fuesen cadenas de texto.
Como MySQL espera valores numéricos reales, este bug genera un error de sintaxis no detectable en la escritura del script. Sólo se produce en el servidor.

Por lo que dice este post y el subsiguiente (#44639), el problema subsistía hasta el 30/06/2010.

De todos modos, la descripción se refiere a programar una sentencia preparada con funciones propias de PDO, y no creando la sentencia propiamente en SQL, que es lo que tu estas haciendo. En tu caso no debería estar produciéndose este problema.
Una prueba que deberías hacer es crear esta sentencia preparada directamente a mano por medio de una interfaz no PHP, tal como MySQL Query Browser o MySQL Workbench, al menos para pruebas en localhost, de modo de verificar si el inconveniente está realmente en la sintaxis o es un defecto de PHP.
Si la ejecutas a mano y con valores fijos, no es la sentencia la que está mal, y si lo está al menos sabrás en qué parte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar