为什么我对Perl的DBI->连接的使用无声地失败?

时间:2010-01-10 14:50:49

标签: perl dbi

为什么这段代码会无声地失败?我如何让它向我展示SQL错误究竟是什么?

$dbh=DBI->connect($db_name,$db_user,$db_pass);

我将代码修改为如下所示:

$dbh=DBI->connect($db_name,$db_user,$db_pass)
    or die("could not connect to db: $db_name");

而不是允许我使用$dbh未分配,它会按预期失败,但它并没有告诉我它为什么失败。就我所见,$db_name等的值都设置为有效值。

我知道真正的错误(MySQL服务器实际上没有运行)但是为了将来的参考,我希望看到真正的错误,例如我导致auth失败的情况。

6 个答案:

答案 0 :(得分:8)

你没有看到connect失败的原因,因为你没有做DBI给你做的事情。错误将出现在$DBI::errstr变量中:

$dbh = DBI->connect($data_source, $username, $password)
     or die $DBI::errstr;

确保您阅读了要使用的任何功能或方法的文档。 :)

答案 1 :(得分:2)

啊哈,错误存储在$DBI::errstr中,所以我可以这样修改我的代码:

$dbh=DBI->connect($db_name,$db_user,$db_pass)
    or die("could not connect to db: $DBI::errstr");

根据文档,它在设计上无声地失败。

答案 2 :(得分:1)

Pass RaiseError =>连接时作为选项1,那么您的脚本将因错误而死亡。我的Perl商店有一个标准配置:

{
  RaiseError => 1,
  PrintError => 0,
  AutoCommit => 1,
  mysql_auto_reconnect => 1,
}

答案 3 :(得分:1)

这是我对rjh's answer的使用。我认为我比die方法更喜欢这个,但还不确定......

$dbh = DBI->connect($data_source, $username, $password, { RaiseError => 1 });

答案 4 :(得分:0)

您使用'或'是语法错误。列出的代码根本不应运行。

你想:

$dbh=DBI->connect($db_name,$db_user,$db_pass) 
    or die("could not connect to db: $db_name");

请注意or die...是原始陈述的一部分,而不是新陈述。

答案 5 :(得分:0)

尝试包含$的值!在你的消息中。

$dbh = DBI->connect($db_name, $db_user, $db_pass)
  or die("could not connect to db ($db_name): $!");

请参阅$! in perldoc perlvar