0

我有一个从 MySQL 数据库中检索数据的 Perl 脚本。这是代码:

sub startSession{
    my $self = shift;

    my $dsn = "dbi:".$self{platform}.":".$self{database}.":".$self{host}.":".$self{port};
    print "$dsn\n" ;
    $self{dbHandle} = DBI->connect($dsn,$user,$password);   
}

我提供了来自外部文件的所有信息。我收到错误消息

DBI connect('dbname:**.**.**.**:3306','',...) failed: Access denied for user 'root'@'dbserver' (using password: NO) at line 89

Can't call method "prepare" on an undefined value at at line 97

我非常确定 root 可以从任何主机连接,并且密码也是正确的。

4

3 回答 3

3

我看到的警告的关键部分是“ using password: NO ”。检查密码是否设置正确。

于 2012-05-03T18:20:07.450 回答
3

首先,正如@Sinan Ünür 所说,您的直接问题是您需要更改$self{platform}$self->{platform}等。

$user您的第二个直接问题是,您似乎$password从无处获得(它们没有传递给函数,因此除非它们是全局变量,否则它们是未定义的),这可以解释using password: NO错误的一部分。也许那些应该是$self->{user}$self->{password}

您应该考虑将其放在模块的顶部,至少在开发期间,以自动捕获如下错误:

use warnings qw(all);
use strict;

但我还要评论,从设计的角度来看,您确实应该将 DSN 视为不透明的字符串。每个数据库都有自己的 DSN 格式。因此,如果您想要针对不同的数据库,您将需要不同的 DSN 格式。或者,可能有一天 MySQL 会使用不同的格式(它已经有两种格式)。无论哪种方式,在配置文件中将其更改为一个位置要比跟踪将各个部分连接在一起的每个位置要容易得多。

于 2012-05-03T18:30:34.607 回答
2

据推测,$self是一个 hashref,而不是一个普通的 hash,并且你没有警告。因此,打开它们并使用$self->{platform}等。

于 2012-05-03T18:22:23.287 回答