3

为什么这段代码会默默地失败?如何让它准确地告诉我 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未分配的,它会按预期失败,但它并没有告诉我它失败的确切原因。据我所知,etc 的值$db_name都设置为有效值。

我知道真正的错误(MySQL 服务器实际上没有运行),但为了将来参考,我想看看真正的错误,以防我导致身份验证失败。

4

6 回答 6

8

你没有看到connect失败的原因,因为你没有按照DBI显示的去做。错误将在$DBI::errstr变量中:

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

确保您阅读了有关您要使用的任何函数或方法的文档。:)

于 2010-01-10T15:32:27.560 回答
2

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

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

根据文档,它在设计上默默地失败了。

于 2010-01-10T14:53:04.377 回答
1

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

{
  RaiseError => 1,
  PrintError => 0,
  AutoCommit => 1,
  mysql_auto_reconnect => 1,
}
于 2010-01-10T15:08:38.607 回答
1

这是我对rjh's answer的用法。我想我更喜欢这种die方法,但还不确定......

$dbh = DBI->connect($data_source, $username, $password, { RaiseError => 1 });
于 2010-01-11T14:55:35.280 回答
0

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

你要:

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

请注意,这or die...是原始语句的一部分,而不是新语句。

于 2010-01-10T15:18:51.657 回答
0

尝试包括 $ 的价值!在你的死亡信息中。

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

美元!在 perldoc perlvar中。

于 2010-01-11T08:42:52.170 回答