Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我使用Perl';s DBI->;无提示连接失败?_Perl_Dbi - Fatal编程技术网

为什么我使用Perl';s DBI->;无提示连接失败?

为什么我使用Perl';s DBI->;无提示连接失败?,perl,dbi,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"); 它不允许我使用$dbhunassigned,而是会像预期的那样失败,但它没有告诉我失败的确切原因。据我所知,$

为什么这段代码会无声地失败?如何让它准确地显示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
unassigned,而是会像预期的那样失败,但它没有告诉我失败的确切原因。据我所知,
$db_name
等的值都设置为有效值


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

Aha,错误存储在
$DBI::errstr
中,因此我可以这样修改代码:

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

根据文档,由于设计原因,它会以静默方式失败。

在连接时将RaiseError=>1作为一个选项传递,然后脚本将在出现错误时终止。My Perl shop的标准配置为:

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

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

你想要:

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

请注意,
或die…
是原始语句的一部分,而不是新语句。

您不明白为什么
连接会失败,因为您没有执行演示您要执行的操作。错误将出现在
$DBI::errstr
变量中:

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

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

尝试包含$的值!在你的死亡留言里

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

以下是我对的用法。我想我更喜欢这种方法而不是
die
方法,但还不确定

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

哎呀,打字错误。好的。我现在已经纠正了这个问题。但也许你的答案应该是注释?不要输入代码。剪切并粘贴您正在使用的实际代码。我已经多次提到过这一点,但是你在滥用人们的时间来回答你提出的问题,比如语法错误,而不是显示你正在使用的实际代码。你可以得到更好的答案,减轻给你免费帮助的人的负担,所以请这样做。:)@布莱恩:是的,你完全正确,我很抱歉浪费了你的时间;我只能想象你有多讨厌在这件事上唠叨我美好的如何设置标准配置?可能有官方的方式;您可以将DBI子类化并重写connect方法。我们的项目有自己专门的DBH分配模块,从YAML加载配置。如果您决定稍后切换到RoseDB或其他东西,则应用程序级代码保持不变,尽管实现不同。无论是子类还是委托,它仍然隐藏着细节,因此应用程序与之松散耦合。:)同样,请向我们展示完整的脚本(尽管屏蔽了用户名和密码!)。您最后几个问题的答案与您没有展示的内容有关。@brian,对不起。我不会再犯这个错误了。@brian啊,当然。我真傻,我应该经常重新阅读文档以确保我不会错过任何东西。好的,我会从现在开始使用这个。我现在看到了你自己的答案。我怀疑你是在我写它的同时发现的,因为我认为你提交的答案比我的稍早。如果你的答案是正确的(不是我在抱怨):)那没有帮助,不要因为接受你的答案而感到难过,因为DBI没有设置
$。请参阅文档:“如果连接失败(请参见下文),它将返回
undef
,并同时设置
$DBI::err
$DBI::errstr
(它不会显式设置
$!