• Publicidad

Posible error en consulta

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Posible error en consulta

Notapor danimera » 2012-09-27 10:37 @484

Tengo este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $sq = "
  2.    SELECT
  3.        usuario, contador_emails, adquisicion,
  4.        nombres, email, tipo, telefonos, activo, numero_campana,
  5.        contador_emails, ultimo_envio, sospechoso, ultimo_envio_form,
  6.        estado
  7.    FROM interesado_temp
  8.    WHERE
  9.        email ='" . $emails . "'";
  10.  
  11. $interesado = $dbh->selectrow_hashref( $sq )
  12.     or die "Error Al buscar interesado por email " . $sq . $dbh->errstr();
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y esa vuelta, me retorna el siguiente error:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. <center><img src='http://kreatibox.com/images/logo.png'><br><br><br> 
  2.       <div style=' width:80%; height:90px; background-color:#FFF;border-style:solid;border-size:1px; border-color:#FF0000'><br><b>La aplicacion tiene error:</b><br> Error al buscar interesado por email  
  3.                SELECT 
  4.                usuario, contador_emails, adquisicion, 
  5.                nombres, email, tipo, telefonos, activo, numero_campana, 
  6.                contador_emails, ultimo_envio, sospechoso, ultimo_envio_form, 
  7.                estado 
  8.                FROM interesado_temp 
  9.                WHERE 
  10.                email ='[email protected]' at /usr/lib/perl5/5.8.8/CGI/Carp.pm line 314. 
  11. </div></center> 


No veo qué podría ser.

Como eso hace parte de un ciclo puse algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $sq = "
  2.    SELECT
  3.        usuario, contador_emails, adquisicion,
  4.        nombres, email, tipo, telefonos, activo, numero_campana,
  5.        contador_emails, ultimo_envio, sospechoso, ultimo_envio_form,
  6.        estado
  7.    FROM interesado_temp
  8.    WHERE
  9.        email ='" . $emails . "'";
  10.  
  11. $interesado = $dbh->selectrow_hashref($sq);
  12. #    or die "Error al buscar interesado por email ".$sq.$dbh->errstr() ;
  13.  
  14. if ( $emails eq '[email protected]' ) {
  15.     die $sq . Dumper $interesado;
  16. }
  17.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y el resultado ahora es:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. <center><img src='http://kreatibox.com/images/logo.png'><br><br><br> 
  2.       <div style=' width:80%; height:90px; background-color:#FFF;border-style:solid;border-size:1px; border-color:#FF0000'><br><b>La aplicacion tiene error:</b><br>  
  3.                SELECT 
  4.                usuario, contador_emails, adquisicion, 
  5.                nombres, email, tipo, telefonos, activo, numero_campana, 
  6.                contador_emails, ultimo_envio, sospechoso, ultimo_envio_form, 
  7.                estado 
  8.                FROM interesado_temp 
  9.                WHERE 
  10.                email ='[email protected]'$VAR1 = undef; 
  11. </div></center> 
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Re: Posible error en consulta

Notapor explorer » 2012-09-27 13:38 @610

[Si no quieres que el foro le ponga marcas especiales a las direcciones de correo electrónico ni a los enlaces URL, solo tienes que marcar la casilla "No convertir automáticamente las URLs", que está justo debajo de la caja de edición.]

La documentación de DBI dice que si selectrow_hashref devuelve 'undef', es que se ha producido un error en alguna de las fases "prepare", "execute" y "fetchrow_hashref".

Si tuvieras activado la opción "RaiseError", entonces DBI pararía el programa, sacando el mensaje de error.

Otra simplificación (fíjate en la última línea):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $sq = "
  2.   SELECT
  3.       usuario, contador_emails, adquisicion,
  4.       nombres, email, tipo, telefonos, activo, numero_campana,
  5.       contador_emails, ultimo_envio, sospechoso, ultimo_envio_form,
  6.       estado
  7.   FROM interesado_temp
  8.   WHERE
  9.       email ='$emails'";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Posible error en consulta

Notapor danimera » 2012-10-01 11:03 @502

No entiendo por qué me dan problemas consultas tan simples como:


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $cliente = $dbh->selectrow_hashref("SELECT id,id_interesado,nombre,apellidos,email FROM cliente WHERE id_interesado = $idInt ") or die "Error en busqueda cliente ". $dbh->errstr();
  2.  
  3.     if ($cliente){
  4.         my $alerta = $dbh->selectrow_hashref("SELECT * FROM alerta WHERE id_cliente = ".$cliente->{id}." AND operacion = '".$operacion."'");
  5.         if ($alerta){
  6.                 return 1;
  7.         }
  8.     }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si pongo un id_interesado que no tenga la consulta obtengo "Error en búsqueda cliente " pero el $dbh->errstr(); no muestra nada...

Lo raro es que insisto en que el hecho de que no exista no debería haber error, y si hay algún error pues debería mostrármelo en pantalla.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Posible error en consulta

Notapor explorer » 2012-10-01 12:13 @550

Esto es lo que pasa cuando usar selectrow_hashref(): como es la combinación de prepare(), execute() y fetchrow_hashref(), si alguna de las tres falla, el resultado será undef.

En cambio, si todo va bien, devolverá una referencia a un hash.

Pero... ¿cómo distinguimos de un error de la consulta (no encontramos a nadie), de un error por la consulta (algo falló al hacer la consulta)?

Podríamos consultar el valor de err() para saber si ocurrió un error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $cliente = $dbh->selectrow_hashref("
  2.    SELECT id,id_interesado,nombre,apellidos,email
  3.    FROM   cliente
  4.    WHERE  id_interesado = $idInt
  5. ");
  6.  
  7. if (defined $dbh->err) {
  8.     die "Error en busqueda cliente ". $dbh->errstr();
  9. }
  10.  
  11. if (0 == keys %$cliente) {
  12.     say "No encontré ningún cliente";
  13. }
  14. else {
  15.     my $alerta = $dbh->selectrow_hashref("
  16.        SELECT *
  17.        FROM   alerta
  18.        WHERE  id_cliente = $cliente->{id}
  19.           AND operacion  = '$operacion'
  20.    ");
  21.  
  22.     if ($alerta){
  23.         return 1;
  24.     }
  25. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De todas maneras, como dice el manual, con algunos controladores de bases de datos, en algunas ocasiones devuelven un código de error que no es un error, sino simplemente un aviso, o información adicional, por lo que hay que consultar mejor el valor de retorno de err().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Posible error en consulta

Notapor danimera » 2012-10-01 12:17 @553

Ok... entonces no podré colocar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $interesado = $dbh->selectrow_hashref( $sq )
  2.  
  3.     or die "Error Al buscar interesado por email " . $sq . $dbh->errstr();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


por que si uso: or die entonces mi aplicación muere. Hummm, Ok.

Inclusive cuando uso la combinación de los 3, el error está al hacer el fetchrow(), pero solo cuando el resultado de la consulta sea 0.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Posible error en consulta

Notapor explorer » 2012-10-01 12:36 @567

Si quieres que la aplicación muera a causa de un fallo por la consulta, podrías hacer lo siguiente: activas la opción 'RaiseError' en el connect(), y luego metes el select_... o el fetch... dentro de un eval{}.

De esa manera, la consulta, si ocurre un error grave, lanzará un die(), pero el programa no morirá al estar dentro de un eval{}. Fuera del eval{} miras el valor de $@ para saber si ocurrió algo, y actúas en consecuencia (reintentar, morir, avisar al usuario, etc.).

Si solo quieres que el programa muera cuando ocurra un fallo grave al hacer la consulta, te vale con activar la opción 'RaiseError' en el connect().

Si solo quieres saber si la consulta devolvió o no clientes, pues entonces debes mirar el contenido del hash referenciado (aunque antes no estará demás que también contemples el caso de que sea un undef, ya que la consulta podría devolver ese valor sin que ocurriese un fallo grave del motor de base de datos).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Posible error en consulta

Notapor danimera » 2012-10-01 14:08 @630

A eso me refería: que si no hay ningún dato no me genere error, pero ya lo tengo.
El problema es colocar un die() al fetchrow().

En todo caso, gracias, ya me quedó más claro cómo funciona :D
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados