• Publicidad

Perl + POO "Can't call method "prepare"

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Perl + POO "Can't call method "prepare"

Notapor opmeitle » 2012-09-29 12:17 @553

¡¡Hola!! Aprendí POO y me puse a jugar en Perl, ahora bien... Me sale un error y no sé a qué corresponde, espero algún consejo para poder solucionarlo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. #Modulo MySQL inserta y consultar registros
  4. use warnings;
  5. use strict;
  6. use DBI;
  7. use DBD::mysql;
  8. package MysqlTest;
  9.  
  10. sub new{
  11.     my $class = shift;
  12.     my $query={};
  13.     bless($query, $class);
  14. }
  15. sub conexion{
  16.     my $self=shift;
  17.     my($database, $hostname, $user, $pwd)=@_;
  18.     $self->{"host"}=$hostname;
  19.     $self->{"database"}=$database;
  20.     $self->{"user"}=$user;
  21.     $self->{"pass"}=$pwd;
  22.     my $connect = DBI->connect("DBI:mysql:$database:$hostname", $user, $pwd) or die $DBI::errstr;
  23.     my $mysqlopen = 1;
  24. return;
  25. }
  26. sub consulta{
  27.     my $self=shift;
  28.     if (!my $mysqlopen) { &conexion; }
  29.     my $id = "SELECT * FROM save_bookmarks WHERE id='123'";
  30.     my $result = my $connect->prepare($id);
  31.     $result->execute();
  32.     my @resultado = $result->fetchrow_array();
  33.     print "@resultado\n";
  34.     return;
  35. }
  36. sub datos{
  37.     my $self=shift;
  38.     print "::DATOS DE ACCESO::\n";
  39.     while ((my $key, my $value)=each(%$self)){
  40.         print "$key => $value\n";
  41.     }
  42. }
  43. 1;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Acá dejo el otro archivo donde invoco el objecto y los mensajes.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use MysqlTest;
  4. use warnings;
  5. use strict;
  6.  
  7. my $mysqltest = MysqlTest->new();
  8. $mysqltest->conexion("bookmarks", "localhost", "root", "hacura");
  9. $mysqltest->consulta();
  10. $mysqltest->datos();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y a continuación el error en consola.


Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. Use of uninitialized value $database in concatenation (.) or string at MysqlTest.pm line 22.
  2. Use of uninitialized value $hostname in concatenation (.) or string at MysqlTest.pm line 22.
  3. Can't call method "prepare" on an undefined value at MysqlTest.pm line 30.
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Un saludo, luis.
opmeitle
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-03-23 22:11 @966

Publicidad

Re: Perl + POO "Can't call method "prepare"

Notapor explorer » 2012-09-29 17:21 @764

A mi no me da fallos...

Con el siguiente módulo
Sintáxis: (MysqlTest.pm) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. package MysqlTest;
  3.  
  4. sub new{
  5.     my $class = shift;
  6.     my $query = {};
  7.     bless($query, $class);
  8. }
  9.  
  10. sub conexion {
  11.     my $self=shift;
  12.     my($database, $hostname, $user, $pwd)=@_;
  13.     $self->{"host"}=$hostname;
  14.     $self->{"database"}=$database;
  15.     $self->{"user"}=$user;
  16.     $self->{"pass"}=$pwd;
  17.  
  18.     print "DBI:mysql:$database:$hostname, $user, $pwd\n";
  19.    
  20.     return;
  21. }
  22.  
  23. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y el siguiente programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use MysqlTest;
  3. use warnings;
  4. use strict;
  5.  
  6. my $mysqltest = MysqlTest->new();
  7. $mysqltest->conexion("bookmarks", "localhost", "root", "hacura");
  8.  
  9. use Data::Dumper;
  10. print Dumper $mysqltest;
  11.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
DBI:mysql:bookmarks:localhost, root, hacura
$VAR1 = bless( {
                 'database' => 'bookmarks',
                 'pass' => 'hacura',
                 'user' => 'root',
                 'host' => 'localhost'
               }, 'MysqlTest' );
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Un par de detalles:
  • la línea 8 (la del package), la pondría en la la línea 2
  • la línea 23 no hace nada: estás declarando una variable local, que se perderá en la línea 25
  • el problema está en la línea 28: estás llamando a conexion() sin pasarle parámetros, y ese método no está preparado para esa contingencia. Debes cambiar la línea 28 para que sea igual a la línea 8 del programa. Y fíjate que estás consultando la variable $mysqlopen, que sabemos que no va a existir de ninguna manera, así que el if() siempre es verdadero (niegas el valor de un valor indefinido), así que siempre llama a conexion()
  • en la línea 30 sobra el segundo my()
El ejercicio es bueno: intentar cachear la conexión a la base de datos para realizarla una sola vez.

Inténtalo de nuevo ;)
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 Avanzado

¿Quién está conectado?

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