Perl模块,来自DBI,“无法调用方法'准备'”错误

时间:2012-09-29 20:26:41

标签: perl perl-module dbi

  

可能重复:
  Perl + POO and “Can't call method ”prepare"

我学习了poo,我得玩perl,创建这个模块但是当我调用segudno方法时,我跳过了以下错误'在连接中使用未初始化的值$ database ...(')...'后跟'Can'电话方法'准备'mm我真的不明白,有什么建议吗?

#!/usr/bin/perl

use warnings;
use strict;
use DBI;
use DBD::mysql;

package MysqlTest;

sub new{
    my $class = shift;
    my $query={};
    bless($query, $class);
}
sub conexion{
    my $self=shift;
    my($database, $hostname, $user, $pwd)=@_;
    $self->{"host"}=$hostname;
    $self->{"database"}=$database;
    $self->{"user"}=$user;
    $self->{"pass"}=$pwd;
    our $connect = DBI->connect("DBI:mysql:database=$database;host=$hostname;", $user, $pwd) or die $DBI::errstr;
    my $mysqlopen = 1;
return;
}
sub consulta{
    my $self=shift;
    if (!my $mysqlopen) { &conexion(); }
    my $id = "SELECT * FROM save_bookmarks WHERE id='123'";
    our $result = my $connect->prepare($id);
    $result->execute();
    my @resultado = $result->fetchrow_array();
    print "@resultado\n";
    return;
}
sub datos{
    my $self=shift;
    print "::DATOS DE ACCESO::\n";
    while ((my $key, my $value)=each(%$self)){
        print "$key => $value\n";
    }
}
1;

在其他文件中调用msg并创建了对象。

#!/usr/bin/perl
use MysqlTest;
use warnings;
use strict;

my $mysqltest = MysqlTest->new();
$mysqltest->conexion("bookmarks", "localhost", "root", "pass");
$mysqltest->consulta();
在控制台中输出

Use of uninitialized value $database in concatenation (.) or string at MysqlTest.pm line 23.
Use of uninitialized value $hostname in concatenation (.) or string at MysqlTest.pm line 23.
Can't call method "prepare" on an undefined value at MysqlTest.pm line 31.

任何想法?

感谢。

1 个答案:

答案 0 :(得分:4)

您的代码包含以下行:

if (!my $mysqlopen) { &conexion(); }

你没有参数调用你的conexion子。但是,这个sub期望你提供几个参数,包括一个受祝福的对象。你可能想解决这个问题。在论证中也应该$database$hostname

您对conexion的来电将始终被执行,因为my $var创建了一个新变量并使用undef对其进行初始化 - 并且{{1}的否定是一个真正的价值。

然后你有这个陈述:

undef

our $result = my $connect->prepare($id); 创建一个新变量my,您尝试在该变量上调用方法$connect。这不起作用,因为创建的变量不是受祝福的引用,只是prepare

Perl中的范围

以下是关于undef的词汇范围如何在Perl中起作用的详细示例

my

您在# $var doesn't exist sub foo { # $var doesn't exist my $var; # $var exists bar(); # $var exists } # $var doesn't exist sub bar { # $var doesn't exist return; } # $var doesn't exist 中定义my变量mysqlopen,然后在conexion中重新定义它。然而,它不是同一个变量,因为这些变量位于不同的范围内。

相反,您可能会在要传递的对象中添加字段consultamysqlopen,因为这是对象数据。然后,您可以像connecthost字段一样使用此信息。

此外,如果没有对象,请不要调用方法database。通常使用conexion创建对象。


修改

我很难调试你的代码同时解析你的英语,所以这里删除了最糟糕的错误代码。但是,我没有使用DBI的经验,因此可能无法直接使用:

new