• Publicidad

Consulta Base de datos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Consulta Base de datos

Notapor angelltroa » 2010-04-20 18:55 @830

Hola a Todos,

Esta vez tengo una consulta quizás un poco absurda, os comento:

El caso es que estoy haciendo una query a MySQL. Tengo una tabla con 2 campos (ip (vchar),integer). El caso es que quiero ver si una determinada ip se encuentra ya en la base de datos. En el caso de que si se encuentra no hay ningún problema con mi script, pero si no se encuentra imagino que me devuelve esto (Empty set (0,00 sec)) y no sé cómo comprobarlo con una operación condicional o printarlo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5. use DBI;
  6. use ConnectDB;
  7.  
  8.  
  9. my $us="192.168.1.10";
  10. my($dbh,$sth);
  11. $dbh = ConnectDB->connect();
  12. $sth = $dbh->prepare('SELECT ip FROM blacklist WHERE ip = ?') or die("Couldn't prepare statement: " . $dbh->errstr);
  13. $sth->execute($us) or die("Couldn't execute statement: " . $sth->errstr);
  14. my $resultat =  $sth->fetchrow_array();
  15. print "$resultat\n";
  16. $sth->finish;
  17. $dbh->disconnect;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


He probado de inicializar la variable $resultat para que no fuese el caso de que estaba vacía, y tampoco.

Muchas gracias de antemano.
angelltroa
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-04-14 06:11 @299

Publicidad

Re: Consulta Base de datos

Notapor explorer » 2010-04-21 04:45 @239

En contexto escalar, la función fetchrow_array() "puede"(*) devolver el primer campo de la fila de la tabla de resultados de la consulta, o undef si no hay más datos. Se recomienda no usar esta función en contexto escalar, como lo tienes puesto en tu código.

Si la ejecutamos en contexto lista, nos devuelve todos los campos de la fila de la tabla de resultados. En caso de que no haya más datos o exista un error, la función devuelve una lista vacía.

Un uso normal sería así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
         while ( @fila = $sth->fetchrow_array ) {
           print "@fila\n";
         }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En este caso, como sabemos que nos interesa saber la existencia o no de un campo, nos vale con hacer una consulta y ver el resultado del primer campo de la primera fila (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @fila = $sth->fetchrow_array();
if ($fila[0]) {
    # Sí que hemos encontrado una IP
}
else {
   ...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


(*): depende del controlador de la 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: Consulta Base de datos

Notapor angelltroa » 2010-04-21 11:01 @501

Parece sí que funciona de esta forma, pero tengo un error que se me escapa, realmente lo que quiero es hacer un update de un campo,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub is_in{
  2.         my $us="192.168.1.10";
  3.         my($dbh,$sth);
  4.         $dbh = ConnectDB->connect();
  5.         $sth = $dbh->prepare('UPDATE blacklist SET attemps = 1 WHERE ip = ?') or die("Couldn't prepare statement: " . $dbh->errstr);
  6.         $sth->execute($us) or die("Couldn't execute statement: " . $sth->errstr);
  7.         my $resultat$sth->fetchrow_array();
  8.         if ($resultat){
  9.                 #incrementar intento
  10.                 print "DONE\n";
  11.         }
  12.         else{
  13.                 #registrar entrada
  14.                 print "no resultat\n";
  15.         }
  16.         $sth->finish;
  17.         $dbh->disconnect;
  18. }
  19.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema lo tengo en esta línea: my $resultat$sth->fetchrow_array(); me da el siguiente error al ejecutarlo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Uncaught exception from user code:
        DBD::mysql::st fetchrow_array failed: fetch() without execute() at ./exemple-query-real.pl line 21.
 at ./exemple-query-real.pl line 21
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Me he asegurado de no tener problemas de permisos y he probado el UPDATE en la BBDD manualmente y funciona. ¿Qué puede estar pasando?

¡ Gracias a todos !
angelltroa
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-04-14 06:11 @299

Re: Consulta Base de datos

Notapor explorer » 2010-04-21 12:16 @553

Falta un '=', creo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $resultat = $sth->fetchrow_array();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Por otra parte, no tiene sentido hacer un fetchrow si solo quieres hacer un update (salvo que me equivoque). Con un execute(), sería suficiente.
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


Volver a Básico

¿Quién está conectado?

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