Página 1 de 1

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

NotaPublicado: 2012-09-29 12:17 @553
por opmeitle
¡¡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.

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

NotaPublicado: 2012-09-29 17:21 @764
por explorer
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 ;)