2010-01-10 78 views
2

爲什麼此代碼默默失敗?我如何得到它以準確地顯示SQL錯誤是什麼?爲什麼我的Perl的DBI->連接的使用默默地失敗了?

$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失敗爲例。

+0

再次,請向我們展示完整的腳本(雖然遮蔽的用戶名和密碼!)。你最後幾個問題的答案與你沒有顯示的東西有關。 – 2010-01-10 15:29:29

+0

@brian對不起。我不會再犯這個錯誤。 – 2010-01-10 17:28:18

回答

8

你沒有看到爲什麼connect失敗了,因爲你沒有做什麼DBI表明你做的。該錯誤將在$DBI::errstr變量:

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

確保你讀,你要使用的任何功能或方法的文檔。 :)

+0

Okie dokes,我從現在開始使用它。 – 2010-01-10 17:33:07

+0

我現在看到你自己的答案。我懷疑你是在我寫這篇文章的同時發現它的,因爲我認爲你在我之前提交了你的答案。如果您的回答是正確的(不是我在抱怨),請不要感到難過:) – 2010-01-10 17:49:51

+0

哈哈,別擔心,我更喜歡您的代碼。 – 2010-01-10 17:57:48

2

啊哈,錯誤存儲在$DBI::errstr,所以我可以修改,像這樣我的代碼:

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

根據該文件,它由設計靜靜地失敗。

+1

你不必假設。這在DBI文檔中有解釋。 :) – 2010-01-10 16:06:23

+0

@brian啊,當然。我多麼愚蠢,我應該重新閱讀文檔,以確保我不會錯過任何東西。 – 2010-01-10 17:29:37

1

通RAISEERROR => 1作爲一個選項進行連接時,那麼你的腳本將在錯誤死亡。我的Perl商店有一個標準配置:

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

不錯。我如何設置標準配置? – 2010-01-10 15:23:44

+1

可能有官方的方式;您可以繼承DBI並覆蓋connect方法。我們的項目有自己的專門的DBH分配模塊,可以從YAML加載配置。 – rjh 2010-01-10 16:21:51

+0

沒問題,謝謝你的提示。 – 2010-01-10 17:33:58

0

您使用'或'是語法錯誤。列出的代碼不應該運行。

你想:

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

注意or die...是原來的說法,並不是一個新的語句的一部分。

+0

糟糕,錯字。發現得好。我現在糾正了這個問題。但也許你的回答應該是一個評論? – 2010-01-10 15:21:37

+0

請勿鍵入代碼。剪切並粘貼您正在使用的實際代碼。我已經提到了幾次,但是你濫用時間來回答你提出的問題,比如語法錯誤,而不是顯示你正在使用的實際代碼。你可以得到更好的答案,並減輕給予你免費幫助的人的負擔,所以請這樣做。 :) – 2010-01-10 15:36:40

+0

@brian是的,你是完全正確的,我很抱歉浪費你的時間;我只能想象你有多討厭這樣嘮叨我。 ;) – 2010-01-10 17:32:30

0

嘗試,包括$的價值!在你的死訊中。

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

請參閱$! in perldoc perlvar

+0

啊,有趣。 – 2010-01-11 14:44:04

+1

這不會有幫助,因爲DBI不會設置'$!'。請參閱文檔:「如果連接失敗(見下文),它將返回'undef'並設置'$ DBI :: err'和'$ DBI :: errstr'(它不會明確設置'$!'。)」 – bazzilic 2014-03-17 04:53:02

1

這裏是我的rjh's answer使用。我想我更喜歡這個在die的方法,但目前還不能確定......

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