Página 1 de 2

No detecto el error en esta consulta SQL

NotaPublicado: 2012-09-03 06:40 @319
por danimera
Parece raro, pero obtengo el siguiente error:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. Error en busqueda x: SELECT a.id, a.id_inmueble, a.titulo, a.operacion, a.banos, a.precio, a.tipo, a.precio, a.moneda, a.habitaciones, a.url FROM inmueble_temp a,barrio_temp barrio WHERE ( a.titulo <> '' AND barrio.cross_ref =11010 AND a.idBarrio = barrio.id AND a.operacion='temporada' AND a.tipo='casas' AND a.moneda='ARS' AND a.precio <=90 AND a.habitaciones >=1 AND a.banos >=1 ) 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 '' at line 14 at /usr/lib/perl5/5.8.8/CGI/Carp.pm line 314.  


Mas aun, si copio y pego esa consulta en MySQL no me saca ningún error... por eso creo que mi problema está en el Perl y no en el MySQL. Mi código es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         my $q2 = "
  2.         SELECT
  3.         a.id,
  4.         a.id_inmueble,
  5.         a.titulo,
  6.         a.operacion,
  7.         a.banos,
  8.         a.precio,
  9.         a.tipo,
  10.         a.precio,
  11.         a.moneda,
  12.         a.habitaciones,
  13.         a.url
  14.         FROM
  15.         inmueble_temp a".$from." ".$where;
  16.  
  17.  
  18.  
  19.     #return $q2  ;
  20.     #$qq = "select * from barrios";
  21.     #my $sth = $dbh->prepare("SELECT a.id, a.id_inmueble, a.titulo, a.operacion, a.banos, a.precio, a.tipo, a.precio, a.moneda, a.habitaciones, a.url FROM inmueble_temp a,barrio_temp barrio WHERE ( a.titulo <> '' AND barrio.cross_ref =11010 AND a.idBarrio = barrio.id AND a.operacion='temporada' AND a.tipo='casas' AND a.moneda='ARS' AND a.precio <=90 AND a.habitaciones >=1 AND a.banos >=1 ) ") or die $dbh->errstr();
  22.     #$sth->execute() or  die "Error x:". $dbh->errstr();
  23.     #$inms =  $sth->fetchall_arrayref();
  24.         my $inms = $dbh->selectall_arrayref( $q2, { Slice => {} }  ) or die "Error en búsqueda x: $q2".  $dbh->errstr();
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo raro para mi es que, esa consulta no me da error si la copio y pego directamente en vez de usar la variable $q2... :?

Re: No detecto el error en esta consulta SQL

NotaPublicado: 2012-09-03 08:00 @375
por explorer
Yo no veo ningún error claramente visible. Puede ser cualquier cosa. Hasta el avance de línea que hay delante del primer SELECT.

Yo haría pruebas quitando líneas de código a la sentencia SQL. O empezando por una pequeña que funcione, y luego ir agregando argumentos.

Para estar seguros, saca en pantalla $q2 antes de hacer la consulta, para ver cómo es la consulta que estamos haciendo.

Re: No detecto el error en esta consulta SQL

NotaPublicado: 2012-09-03 08:09 @381
por danimera
Exactamente cuando hago el print de $q2... y este es el resultado, el cual pego en MySQL y se ejecuta bien, solo que el resultado es 0... pero eso no es problema...

Sintáxis: [ Descargar ] [ Ocultar ]
  1. SELECT a.id, a.id_inmueble, a.titulo, a.operacion, a.banos, a.precio, a.tipo, a.precio, a.moneda, a.habitaciones, a.url FROM inmueble_temp a,barrio_temp barrio WHERE ( a.titulo <> '' AND barrio.cross_ref =11010 AND a.idBarrio = barrio.id AND a.operacion='temporada' AND a.tipo='casas' AND a.moneda='ARS' AND a.precio <=90 AND a.habitaciones >=1 AND a.banos >=1 ) 


La anterior consulta me funciona bien si la pego directamente en Perl, pero cuando pongo la variable que contiene la consulta ahí sí tengo el error...

Re: No detecto el error en esta consulta SQL

NotaPublicado: 2012-09-03 10:01 @459
por explorer
Perdona, pero esa no puede ser la salida de $q2... en el programa veo que consta de varias líneas... y lo que muestras es casi una sola.

Estoy empezando a sospechar que algunos espacios en blanco o avances de línea, no son tales. Quizás se te ha colado un carácter extraño (en Unicode se definen más de veinte tipos de espacio en blanco diferentes).

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -E 'for (0 .. 0xFFFF) { printf("%04x\n", $_) if chr($_)=~/\s/ }'
  2. 0009
  3. 000a
  4. 000c
  5. 000d
  6. 0020
  7. 0085
  8. 00a0
  9. 1680
  10. 180e
  11. 2000
  12. 2001
  13. 2002
  14. 2003
  15. 2004
  16. 2005
  17. 2006
  18. 2007
  19. 2008
  20. 2009
  21. 200a
  22. 2028
  23. 2029
  24. 202f
  25. 205f
  26. 3000
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Re: No detecto el error en esta consulta SQL

NotaPublicado: 2012-09-03 10:10 @465
por danimera
Bueno la salida es esta exactamente:

Sintáxis: [ Descargar ] [ Ocultar ]
  1.  
  2.     SELECT 
  3.     a.id, 
  4.     a.id_inmueble, 
  5.     a.titulo, 
  6.     a.operacion, 
  7.     a.banos, 
  8.     a.precio, 
  9.     a.tipo, 
  10.     a.precio, 
  11.     a.moneda, 
  12.     a.habitaciones, 
  13.     a.url 
  14.     FROM 
  15.     inmueble_temp a,barrio_temp barrio WHERE ( a.titulo <> '' AND barrio.cross_ref =1101 0 AND a.idBarrio = barrio.id AND a.operacion='temporada' AND a.tipo='casas' AND a.moneda='ARS' AND a.precio <=90 AND a.habitaciones >=1 AND a.banos >=1 )  


SI ves mi código, tengo comentado $q2 y ya lo descomenté... cuando veo el código fuente veo una línea en blanco antes de SELECT.

Re: No detecto el error en esta consulta SQL

NotaPublicado: 2012-09-03 10:59 @499
por explorer
Veo un espacio en blanco sospechoso entre '1101' y '0'.

Re: No detecto el error en esta consulta SQL

NotaPublicado: 2012-09-04 07:23 @349
por danimera
explorer escribiste:Veo un espacio en blanco sospechoso entre '1101' y '0'.

Sí señor... hay un error ahí: barrio.cross_ref =1010 0 AND a.idBarrio = barrio.id
Humm... rarísimo por qué me coloca ese 0 separado.

Y ese trozo de consulta lo genero así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     if ( $inmueble->{'barrio'} ) {
  2.         $from   = ",barrio_temp barrio";
  3.         $where .= "AND barrio.cross_ref =" . $inmueble->{'barrio'} . " AND a.idBarrio = barrio.id  ";
  4.     }
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Donde $inmueble->{'barrio'} vale 1010. En formulario que lo envía y cuando lo imprimo solo en mi navegador veo 10100 pero si veo el código fuente entonces veo 1010 0.

No sé dónde salió ese 0... Será que es posible que mi editor me esté subiendo archivos con otra codificación.
No sé... pues mi PC lo resintalé hace poco. :?

Re: No detecto el error en esta consulta SQL

NotaPublicado: 2012-09-04 07:53 @370
por explorer
No veo problemas en ese código if(), salvo que hayas tenido cuidado de que $where, antes de entrar ahí, contenga un espacio en blanco al final, para que no quede pegado al 'AND...' que añades luego en la línea 3. Pero veo que esa misma línea 3 la terminas con un espacio en blanco, así que supongo que has tenido cuidado con eso.

El problema está entonces antes, en el lugar donde se define $inmueble->{'barrio'}. Dices que vale 1010, pero, ¿has probado a ejecutar length($inmueble->{'barrio'})?

Si en el navegador lo ves bien pero no en el código, significa que ese espacio puede ser un espacio en blanco de ancho cero (sí, existen).

Yo pasaría el código generado por un conversor hexadecimal y así sabría qué hay ahí.

Re: No detecto el error en esta consulta SQL

NotaPublicado: 2012-09-04 08:22 @390
por danimera
Sí, explorer, tienes razón... El problema estaba antes. Resulta que hice esto al parámetro.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. return "<pre>".Dumper $q->param('barrio');  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y me arrojó:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. $VAR1 = '1010'; 
  2. $VAR2 = '0'; 


¿Cómo es posible que un parámetro venga como array...? O, hum, si solo es un campo de un formulario... aunque... :S ¿será que solo es un campo, será que hay dos campos con el mismo nombre y pasa eso?

Re: No detecto el error en esta consulta SQL

NotaPublicado: 2012-09-04 09:50 @452
por explorer
No me gusta lo que has puesto, porque da la sensación de que '0' viene de resultas de la ejecución de Dumper().

Aunque... es cierto... podría ser que en el formulario existiera más de un control llamado 'barrio'.