2007-09-26 12:20 @555 |
|
|
lnx_hg
Perlero Nuevo
|
Registrado: 2007-08-13 12:52 @578 Mensajes: 49
|
|
|
Código de consulta que no genera nada
|
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: 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; Si alguien me puede contestar lo más rápido posible, se lo agradeceré. Gracias, banda 
|
2007-09-27 14:05 @628 |
|
|
lnx_hg
Perlero Nuevo
|
Registrado: 2007-08-13 12:52 @578 Mensajes: 49
|
|
|
|
|
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.
|
2007-09-27 14:15 @635 |
|
|
lnx_hg
Perlero Nuevo
|
Registrado: 2007-08-13 12:52 @578 Mensajes: 49
|
|
|
|
¡Ey!, acabo de ejecutar el programa desde línea de comandos y me marca el siguiente error: Código: 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.
|
2007-12-07 21:39 @944 |
|
|
Tifa
Perlero Nuevo
|
Registrado: 2007-10-27 10:41 @487 Mensajes: 11
|
|
|
|
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: Using perl Syntax Highlighting print "Resultados<p>";
$sth->bind_columns(undef, $id, $nombre); ¿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: 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  Using perl Syntax Highlighting #!/usr/bin/perl
my $palabra = "El mundo es azul";
my $referencia = \$palabra;
print $referencia; 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 Using perl Syntax Highlighting 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. 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;
|
2007-12-08 06:01 @292 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10249
|
|
|
|
|
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
|
2007-12-08 17:41 @778 |
|
|
Tifa
Perlero Nuevo
|
Registrado: 2007-10-27 10:41 @487 Mensajes: 11
|
|
|
|
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: 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.
|
2007-12-08 20:14 @885 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10249
|
|
|
|
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
|
2011-12-14 07:04 @336 |
|
|
rullyeah
Perlero Nuevo
|
Registrado: 2011-12-14 07:00 @333 Mensajes: 1
|
|
|
Re: Código de consulta que no genera nada
|
A mi me daba un error parecido, Me bastó por cambiar Using perl Syntax Highlighting $sth->bind_columns(undef, $id, $nombre);
por: Using perl Syntax Highlighting $sth->bind_columns(undef, \$id, \$nombre);
|
|
Página 1 de 1
|
[ 11 mensajes ] |
|
| Reglas del Foro |
No puedes abrir nuevos temas en este Foro No puedes responder a temas en este Foro No puedes editar tus mensajes en este Foro No puedes borrar tus mensajes en este Foro No puedes enviar adjuntos en este Foro
|
|
Socializa |
 |
|