Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Variables externas en sentencia preparada

Estas en el tema de Variables externas en sentencia preparada en el foro de Mysql en Foros del Web. Buenas... según los sabios consejos de gnzsoloyo estoy utilizando sentencias preparadas en algunos casos. el problema me surge cuando trato de crear una especie de ...
  #1 (permalink)  
Antiguo 22/12/2012, 11:01
 
Fecha de Ingreso: septiembre-2007
Mensajes: 106
Antigüedad: 16 años, 7 meses
Puntos: 1
Variables externas en sentencia preparada

Buenas... según los sabios consejos de gnzsoloyo estoy utilizando sentencias preparadas en algunos casos. el problema me surge cuando trato de crear una especie de buscador y no soy capaz de hacerle entender que es una variable de texto lo que quiero que busque en cierto campo de la tabla... uso lo siguiente:

Código MySQL:
Ver original
  1. SET @s = 'SELECT
  2.  secciones.seccion,
  3.  secciones.descripcion,
  4.  secciones.icono,
  5.  productos.producto,
  6.  productos.precio,
  7.  productos.stock,
  8.  productos.oferta,
  9.  secciones.idseccion,
  10.  productos.idProducto,
  11.  productos.nombre
  12. FROM
  13.  secciones
  14.  INNER JOIN productos ON (secciones.idseccion = productos.idSeccion)
  15. WHERE (productos.idProducto > 0)';
  16.  
  17. IF idS > 0 THEN
  18.  SET @s = CONCAT (@s,' AND secciones.idseccion =  ', idS);
  19.  
  20. SET @s = CONCAT (@s,' AND productos.nombre = '%', busca,'%'');
  21. .......

Tengo los parametros idS que es Int y funciona correctamente y el parametro busca que es varchar(100) y es la palabra que recibo y quiero buscar... esa es la que me da problemas. ¿Cómo le hago entender que es texto?

Última edición por gnzsoloyo; 22/12/2012 a las 13:09
  #2 (permalink)  
Antiguo 22/12/2012, 18:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Variables externas en sentencia preparada

Por si no te diste cuenta, el parámetro busca ha quedado como la palabra "busca" dentro de la cadena resultante del CONCAT, y no su contenido.
Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = '%', busca,'%'');
Los apóstrofes deben ir escapados, es decir:
Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = \'%', busca,'\'%');
O bien van dobles, para que MySQL los pueda tomar bien.
Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = ''%', busca,'''%');
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 26/12/2012, 13:26
 
Fecha de Ingreso: septiembre-2007
Mensajes: 106
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Variables externas en sentencia preparada

Hola gnzsoloyo...

pues reemplazando la linea original por cualquiera de las dos que me pones me da error de sintasis... el caso es que al compilar el procedimiento almacenado lo hace sin problemas pero al volver a editarla veo que la línea vuelve a aparecer así:

Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = '%', busca,''%');

Es realmente extraño y como ves el signo % está fuera de lugar... es decir me quita tanto los caracteres \ como ' como si sobraran.
  #4 (permalink)  
Antiguo 26/12/2012, 13:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Variables externas en sentencia preparada

Postea el código completo que intentaste compilar.
Sin vero con exactitud, es difícil entender por qué no compila.
Que no se haya modificado implica que no compiló por tanto sigue estando el anterior...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 26/12/2012, 16:18
 
Fecha de Ingreso: septiembre-2007
Mensajes: 106
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Variables externas en sentencia preparada

Código MySQL:
Ver original
  1.  
  2. SET @s = 'SELECT
  3.  secciones.seccion,
  4.  secciones.descripcion,
  5.  secciones.icono,
  6.  productos.producto,
  7.  productos.precio,
  8.  productos.stock,
  9.  productos.oferta,
  10.  secciones.idseccion,
  11.  productos.idProducto,
  12.  productos.fecha_insert,
  13.  productos.imagen,
  14.  productos.nombre
  15. FROM
  16.  secciones
  17.  INNER JOIN productos ON (secciones.idseccion = productos.idSeccion)
  18. WHERE (productos.idProducto > 0)';
  19.  
  20. IF idS > 0 THEN
  21.  SET @s = CONCAT (@s,' AND secciones.idseccion =  ', idS);
  22.  
  23. SET @s = CONCAT (@s,' AND productos.nombre = '%', busca,''%');
  24.  
  25. SET @s = CONCAT (@s,' ',' ORDER BY ?');
  26.  
  27. IF orden = 'nom' OR orden = 'sto' OR orden = 'fec' THEN
  28.  SET @s = CONCAT (@s,' ','ASC');
  29.  SET @s = CONCAT (@s,' ','DESC');
  30.  
  31. SET @s = CONCAT (@s,' ','LIMIT ?, ?');
  32.  
  33. IF orden = 'nom' OR orden = 'noI' THEN
  34.  SET @a = 12;
  35.  
  36. IF orden = 'sto' OR orden = 'stI' THEN
  37.  SET @a = 6;
  38.  
  39. IF orden = 'fec' OR orden = 'feI' OR orden = '' THEN
  40.  SET @a = 9;
  41.  
  42. SET @b = paginas;
  43. SET @c = comienzo;
  44.  
  45. PREPARE seleccion FROM @s;
  46.  
  47. EXECUTE seleccion USING @a, @b, @c;
  48.  
  49. DEALLOCATE PREPARE seleccion;
  50.  

Todo funciona perfectamente excepto cuando meto la linea que quiero usar para la palabra a buscar... gracias.
  #6 (permalink)  
Antiguo 26/12/2012, 17:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Variables externas en sentencia preparada

No estás prestando suficiente atención...
Esto está mal:
Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = '%', busca,''%');

debería ser así:
Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = '\'%', busca,'%\'');

O bien:
Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = ''%', busca,'%''');
Si te fijas en el resaltado del etiquetado que puse, en tu sentencia la palabra "busca" queda en rojo, como se resalta en este caso a las cadenas de texto. Eso es incorrecto. Al aplicar la etiqueta, el resaltado de esa palabra no existe. Debe quedar en negro, de lo contrario la sintaxis está mal.

Mi consejo es que uses un buen front end con corrector sintáctico para hacer este tipo de cosas. Algo por lo menos como MySQL Workbench, que te marcará en qué punto hay errores antes de intentar compilarlo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 27/12/2012 a las 04:12
  #7 (permalink)  
Antiguo 27/12/2012, 02:19
 
Fecha de Ingreso: septiembre-2007
Mensajes: 106
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Variables externas en sentencia preparada

Creo que no me he explicado bien jeje... a ver, he cambiado las lineas tal como me has indicado, es decir, efectivamente se ve claramente que mi linea:

Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = '%', busca,''%');

se ve que está mal porque la palabra busca aparece rojo como parte de la sentencia y no como variable. Pues he puesto CUALQUIERA de los dos ejemplos que me has escrito y al compilar ME VUELVE a dejar la linea así de mal... es decir, compila pero me quita los símbolos tanto \ como el apóstrofe ' como si sobraran. Uso el editor de mySQL donde se ve bien claro los colores y eso.

El caso es que con las lineas corregidas tal como me has puesto no funciona, me da error de síntasis. Al compilar lo hace perfectamente pero cuando voy a editar vuelve a dejarlo mal. Es curioso.

EDITO:

Acabo de ver que en el mensaje #2 me habías puesto

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = '%', busca,'%'');
Los apóstrofes deben ir escapados, es decir:
Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = \'%', busca,'\'%');
O bien van dobles, para que MySQL los pueda tomar bien.
Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = ''%', busca,'%''');

y ahora me has puesto

Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = '\'%', busca,'%\'');

y

Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = ''%', busca,'%''');

Voy a probar con eso a ver si ahora hay suerte y te cuento jejeje...

Última edición por gnzsoloyo; 27/12/2012 a las 04:14 Razón: Acabo de darme cuenta una cosa
  #8 (permalink)  
Antiguo 27/12/2012, 08:33
 
Fecha de Ingreso: septiembre-2007
Mensajes: 106
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Variables externas en sentencia preparada

Nada, con esas lineas que me has puesto la primera me da error de compilación y la segunda igual que las demás, me quita los apóstrofes ' como si sobraran... madre que dolor de cabeza jejeje. Probare con MySQL Workbench y si soluciono algo lo posteo aquí.

EDITO:

Ya está solucionado, he usado

Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre = ''%', busca,'%''');

Esta no me funcionaba porque por otro lado he metido la pata y debería ser:

Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre LIKE ''%', busca,'%''');

Eso sí, al compilar se quedaba todo así:
Código MySQL:
Ver original
  1. SET @s = CONCAT (@s,' AND productos.nombre LIKE '%', busca,'%'');

Y me estaba encabezonando con la construcción y los apóstrofes cuando eso estaba bien y era principalmente por el LIKE...

Por fiiiinnn... gracias por tu paciencia.

Última edición por suudobal; 27/12/2012 a las 09:02 Razón: Solucionado
  #9 (permalink)  
Antiguo 27/12/2012, 10:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Variables externas en sentencia preparada

No problem. Me alegra que al final pudieras hacerlo funcionar.
Hay ocasiones en que las soluciones parecen simples, pero se te escurren de las manos por pequeñeces.
Es bastante frustrante.

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: externas, select, sentencia, tabla, variables, campos
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 01:18.