Página 1 de 1

Problema al intentar leer datos de una base de datos MySQL

NotaPublicado: 2008-11-27 12:15 @552
por Agus
Hola, ¿qué tal?

Quería consultar porque me sale el siguiente error:

Código: Seleccionar todo
Can't locate object method "fetchrow_array" via package "DBI::db" at /var/lib/asterisk/agi-bin/leodebd.pl line 58.


al intentar correr el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

#ppm>install dbi-mysql
use warnings;
use strict;
use DBI;
use DBD::mysql;

$|=1;

# Setup some variables
my %AGI;
my $fecha;
my $caller;
my $called;
my $tipodellamada;
my $path;

my $dbhost="20.1.10.8";
my $dbname="database";
my $dbuser="user";
my $dbpass="user";
my $genres;

my $dbh;
my $dsn;

my $escuchado;
my $funcionario;
my $fechahora;
my $archivo;
my $uniqueid;
my $sth;

my @data;
##########################################################
#Create a DB connection.                                 #
##########################################################
sub connect_db() {
        my $dsn = "DBI:mysql:database=$dbname;host=$dbhost";
        $dbh->disconnect if $dbh;
        $dbh = DBI->connect($dsn, $dbuser, $dbpass);
}


sub loaddata() {
        $dbh->do("SELECT * FROM grabaciones WHERE escuchado=0");
}

$genres=&connect_db;
$genres=&loaddata();

#creando enlace o coneccion dbh=>database handle


# ciclo de lectura de todos los renglones de la tabla
$sth = $dbh->prepare("SELECT * FROM grabaciones WHERE escuchado=0");
if ($sth && $sth->execute()) {@data = $dbh->fetchrow_array(); }

while (@data) {
#($escuchado, $funcionario, $fechahora, $archivo, $uniqueid)
        #print "SET VARIABLE escuchado $escuchado \n";
        #print "SET VARIABLE funcionario $funcionario \n";
        #print "SET VARIABLE fechahora $fechahora \n";
 #print "SET VARIABLE archivo $archivo \n";
        #print "SET VARIABLE uniqueid $uniqueid \n";
        print "@data"

};

# cerrando tabla, instruccion y coneccion

$dsn->finish;

$dbh->disconnect();

#print my $q->hr();
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4


¡Les agradezco cualquier ayuda!
¡Saludos!

NotaPublicado: 2008-11-27 14:53 @661
por explorer
Bienvenido a los foros de Perl en Español, Agus.

Prueba a cambiar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$dbh->fetchrow_array()
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$sth->fetchrow_array()
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


fetchrow_array() se debe referir a la sentencia SQL que se preparó (prepare()) y luego se ejecutó (execute()).

Repasa las primeras líneas de la documentación de DBI. Verás que pone este orden:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$dbh      =  DBI->connect($data_source, $username, $auth, \%attr);
$sth      = $dbh->prepare($statement);
$rv       = $sth->execute;
@row_ary  = $sth->fetchrow_array;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Todo el mundo está de acuerdo en que quien hizo la documentación de este módulo, lo hizo muy mal en cuanto a la elección de las variables de ejemplo. Él pensaba que, efectivamente, son ejemplos, pero el caso es que casi todos los programas en los que interviene DBI, los programadores suelen elegir esas mismas variables... y como son tan parecidas, es muy fácil equivocarse.

Solución: usar otros nombres de variables, un poco más largas y claras.

NotaPublicado: 2008-11-28 06:34 @315
por Agus
¡¡¡¡Muchas gracias, explorer!!!!

¡¡La verdad que ya estaba pensando en cambiar de lenguaje de programación ya que no podía solucionar el problema!!

¡¡Saludos!!