我有一个Perl脚本,可以从MySQL数据库中检索数据。这是代码:
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可以从任何主机连接,密码也是正确的。
答案 0 :(得分:3)
我看到警告的关键部分是“使用密码:否”。检查密码设置是否正确。
答案 1 :(得分: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将使用不同的格式(它已经有两种)。无论哪种方式,在配置文件中将它更改为一个位置要比在每个地方跟踪各个部分一起容易得多。
答案 2 :(得分:2)
据推测,$self
是一个hashref,而不是一个普通的哈希,并且你没有warnings。所以,打开它们,然后使用$self->{platform}
等。