• Publicidad

Código de consulta que no genera nada

Todo acerca de las bases de datos que existen: SQL, MySQL, Oracle, Postgres, CSV, etc.

Código de consulta que no genera nada

Notapor lnx_hg » 2007-09-26 12:20 @555

Hola, soy nuevo en Perl, y estoy haciendo un programita para base de datos con MySQL, pero no marca error ni tampoco muestra resultados en la pantalla. El código se muestra a continuación:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#! /perl/bin/perl
print "content-type: text/html\n\n";

use DBI;

$db="itlm";
$host="localhost";
$port="3306";
$userid="hugoa";
$passwd="hugoa";
$connectionInfo="DBI:mysql:database=$db;$host:$port";

$dbh = DBI->connect($connectionInfo,$userid,$passwd) or die "No se puede conectar con la base de datos, intentelo mas tarde";

$query = "SELECT * FROM alumno";
$sth = $dbh->prepare($query);
$sth->execute();

print "Resultados<p>";
$sth->bind_columns(undef, $id, $nombre);
#aqui
while($sth->fetch()) {
   print "$id  $nombre<br>";
}

$sth->finish();
$dbh->disconnect;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Si alguien me puede contestar lo más rápido posible, se lo agradeceré. Gracias, banda :o
lnx_hg
Perlero nuevo
Perlero nuevo
 
Mensajes: 54
Registrado: 2007-08-13 12:52 @578

Publicidad

Notapor explorer » 2007-09-26 13:53 @620

Yo no veo ningún fallo... me sorprende un poco la primera línea del print, que yo la pondría delante del siguiente print, pero tampoco es causa de fallo.

¿A qué 'pantalla' te refieres? ¿A la terminal en línea?

Hay print, así que debe mostrar algo en pantalla.

Si lo ejecutas desde la línea de comandos como: perl -c tuprograma.pl, ¿sale algo?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor lnx_hg » 2007-09-27 14:05 @628

Ya hice lo que me dices. Lo que sale es "syntax ok". Mira, yo creo que el error se genera después del print "Resultados", porque si lo ejecutas en la pantalla del navegador aparece el texto "Resultados" pero hasta ahí y pienso que las siguientes líneas de códigos no se ejecutan o hay un error pero no lo marca.
Espero que me puedas contestar pronto porque me urge. Gracias. Y felicidades por tu foro porque está muy bien.
lnx_hg
Perlero nuevo
Perlero nuevo
 
Mensajes: 54
Registrado: 2007-08-13 12:52 @578

Notapor lnx_hg » 2007-09-27 14:15 @635

¡Ey!, acabo de ejecutar el programa desde línea de comandos y me marca el siguiente error:

Código: Seleccionar todo
Can´t DBI::st=HASH(0x19e7318)bind_col(1,undef,...) need a reference to scalar at c:/perl/sitie/lib/DBI.pm line 1830.

¿Qué piensas que sea? obviamente esta línea se genera el error: $sth->bind_columns($id, $nombre);.
Por tu atención, gracias.
lnx_hg
Perlero nuevo
Perlero nuevo
 
Mensajes: 54
Registrado: 2007-08-13 12:52 @578

Notapor explorer » 2007-09-27 15:53 @703

Prueba a declarar las variables $id y $nombre antes del bind_columns().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2007-09-27 16:24 @725

¡Hey!, Acabo de darme cuenta de que has variado el número de parámetros a bind_columns() desde el primer ejemplo hasta el último comentario tuyo.

¿La tabla tiene dos o tres valores por registro?

Eso es importante para bind_columns(), que requiere igual número de referencias a variables que valores se recuperan con el SELECT.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Tifa » 2007-12-07 21:39 @944

No sé realmente ni al cien por ciento como funciona el módulo DBI con Mysql, ya que yo uso el módulo Mysql BDB el cual trae funciones diferentes, pero explícame esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "Resultados<p>";
$sth->bind_columns(undef, $id, $nombre);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Por qué haces uso de undef? ¿Esta herramienta no le rebata el valor a las variables que le siguen? ¿en este caso $id y $nombre? Es solo una dudilla que tengo.

Sobre tu error, este:

Código: Seleccionar todo
Can´t DBI::st=HASH(0x19e7318)bind_col(1,undef,...) need a reference to scalar at c:/perl/sitie/lib/DBI.pm line 1830.


Me temo que $std no se está ejecutando... al contrario lo que está haciendo es un tipo de referencia a la ubicación de memoria de dicha variable y no a su valor real... por ejemplo, prueba esto para que me entiendas mejor :)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
my $palabra = "El mundo es azul";
my $referencia = \$palabra;

print $referencia;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Guarda el archivo y ejecútalo y dime que ves :) ¿algo similar al error de arriba verdad? Mas sin embargo al mismo archivo en vez de print $referencia haz

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print ${$referencia};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y dime qué ves. Verás un simpático "El mundo es azul". Las referencias en Perl son como los punteros en C/C++: si apuntas a la dirección de memoria te imprime en pantalla el tipo de variable y su dirección en memoria, pero no el valor de la variable en si. En tu caso $std está apuntando a la dirección de memoria pero no se está ejecutando ya sea porque apunta a una variable hash vacía o por alguna otra razón o más bien no está llamando al valor real de la variable. Intenta haciéndole una referencia, no te aseguro que vaya a funcionar, no tengo vía de cómo probarlo... pero no pierdes nada con intentar.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#! /perl/bin/perl
 print "content-type: text/html\n\n";
 
 use DBI;
 
 $db="itlm";
 $host="localhost";
 $port="3306";
 $userid="hugoa";
 $passwd="hugoa";
 $connectionInfo="DBI:mysql:database=$db;$host:$port";
 
 $dbh = DBI->connect($connectionInfo,$userid,$passwd) or die "No se puede conectar con la base de datos, intentelo mas tarde";
 
 $query = "SELECT * FROM alumno";
 $sth = \$dbh->prepare($query);
 ${$sth}->execute();
 
 print "Resultados<p>";
 ${$sth}->bind_columns(undef, $id, $nombre);
 #aqui
 while(${$sth}->fetch()) {
    print "$id  $nombre<br>";
 }
 
 ${$sth}->finish();
 ${$sth}->disconnect;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Tifa
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2007-10-27 10:41 @487

Notapor explorer » 2007-12-08 06:01 @292

Tifa:

* Ya se le ha dicho a lnx_hg que justamente estaba el error en esa línea: no tenía declaradas las variables y además había un undef en la llamada a bind_columns(). undef no le está arrebatando los valores, sino indicarle a bind_columns, que no nos interesaba obtener o guardar el primer valor devuelto por la SELECT. Pero es que no se hace así, y por eso el mensaje de error es muy claro...

* No se trata de un tema de referencias... el mensaje de error es claro: "necesito una referencia a un escalar" en esa variable. DBI se está refiriendo a los argumentos que le hemos dado en la llamada a bind_columns(). Uno de ellos es un undef, y precisamente se queja de que eso no es un escalar...

* Las referencias en Perl NO son como los punteros de C, apuntando a un lugar de memoria concreto. Perl maneja la gestión de las variables y sus contenidos de forma más elaborada...

* El estilo de programación "prueba y error" es muy común en Perl, pero desde luego, hay una forma de evitar el círculo prueba-error-prueba-error... y es LEYENDO la documentación. Sí, el manual de DBI tiene centenares de páginas, pero si queremos hacer un trabajo profesional y que se nos trate y se nos pague de forma profesional, quiere decir que manejamos las herramientas y librerías de forma profesional... en el manual de DBI pone claramente: $sth = $dbh->prepare($query);, así que así debería de funcionar... así que entonces el problema no está ahí.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Tifa » 2007-12-08 17:41 @778

Yo solo estaba sugiriendo una ayuda :(

"Necesito una referencia a un escalar": Está claro que $sth no está apuntando al valor de una variable, sino a la dirección o ubicación de memoria de esta... por tal razón había sugerido que forzara o apuntara al valor de ella con ${$variable}; ya que en C apuntamos al valor de un puntero con *p, en Perl apuntamos al valor de la manera antes expresada. No dije que fuera a funcionar, porque no tengo manera de probarlo, pero ya que su programita se queja de que está apuntando a una dirección y no a un valor... a lo mejor esto podría ayudar. A lo mejor está apuntando como dice explorer a undef y por tal razón no tiene un valor... pero en caso de que aun quitando undef no funcione, trata de llamar al valor con ${$variable} ya que realmente este significado:

Código: Seleccionar todo
Can´t DBI::st=HASH(0x19e7318)


indica que $sth es del tipo Hash o así lo esta viendo Perl, y que su dirección en memoria a la cual esta apuntando es 0x19e7318. Continúo desconociendo a qué apunta $sth en esta línea, pero no está captando el valor de las variables.
Tifa
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2007-10-27 10:41 @487

Notapor explorer » 2007-12-08 20:14 @885

Tifa: te agradezco enormemente tu ayuda.

Lo que quería decirte es que cometiste, y sigues cometiendo, el error de pensar que Perl usa posiciones de memoria de la misma forma que lo hace C. No es así. En ninguna parte de la documentación de Perl se hace referencia a esa opción.

Y en cuanto al mensaje de error, no se refiere a $sth, sino que ha intentado hacer un 'bind' de un objeto que por definición no se le puede obtener referencia (undef). Fíjate que en el error habla de bind_col(), así que esa es la función que ha fallado. DBI::st=HASH(0x19e7318) es la indicación de que esa función ha sido llamada como un método de un objeto hash bendecido con la clase DBI (es un hash que se comporta como contenedor de un objeto de clase DBI).

De todas formas, es mejor que sea lnx_hg el que respondo diciendo cómo lo ha arreglado.

Tampoco existe el concepto de "forzar o apuntar a la variable". En la mayor parte de las ocasiones no serviría de nada: Perl lo impediría, al ser de tipos distintos, por ejemplo. En caso de dudas con las estructuras de datos, lo más cómodo es ver qué aspecto tienen, con la ayuda del módulo Data::Dumper.

Repito: gracias por ayudar... pero no creas que porque un lenguaje herede algunas estructuras de otro, TODO sea igual. :-)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Bases de datos

¿Quién está conectado?

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