2009-11-05 72 views
1

我想運行簡單的perl dbi示例腳本來連接到mysql數據庫並執行一些插入操作。Perl DBI MySQL錯誤消息:無法調用未定義值的方法「做」

代碼:

#! bin/usr/perl -w 

use strict; 
use warnings; 

use DBI(); 
my $dbh = DBI->connect(
    "DBI:mysql:database=SPM;host=IP Address", "username", "password", 
    {'RaiseError'=>1} 
); 

my $dbh->do(
    'INSERT INTO payment_methods(name, description)VALUES(CASH, DOLLAR)' 
); 
my $dbh->disconnect(); 

但是當我嘗試用這個來perl filename.pl跑我獲得以下

Can't call method "do" on an undefined value at perldbi.pl line 12

這就是我用do首次。

我試圖谷歌它,也嘗試所有不同類型的論壇,但徒勞無功,如果你有任何想法,爲什麼發生這種事情,這是什麼方法比這將是非常好的,我會非常感謝你的幫助。

+0

的家當行中使用-w是多餘的,如果你使用'warnings'。請參閱'perldoc perllexwarn'瞭解更多信息:http://perldoc.perl.org/perllexwarn.html – daotoad 2009-11-05 15:36:12

+2

另外,更可能的是,shebang行是錯誤的。 – 2009-11-05 15:54:23

+0

謝謝大家在這個問題上指導我。 – Rachel 2009-11-05 16:13:09

回答

10

你有一個額外my

my $dbh->do(
    'INSERT INTO payment_methods(name, description)VALUES(CASH, DOLLAR)' 
); 

擺脫my的。

要麼你真的沒有在你的腳本啓用warnings或者你忽略了警告:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $x = 1; 
my $x = 2; 
C:\Temp> t 
"my" variable $x masks earlier declaration in same scope at ...
+1

+1好的發現,這太容易忽略了! – Andomar 2009-11-05 15:59:38

+1

只發現它,因爲我在編輯OP的帖子以避免水平滾動。我對橫向滾動的仇恨終於得到了回報。 – 2009-11-05 16:02:50

+0

謝謝思南指導我這個錯誤。 – Rachel 2009-11-05 16:09:14

1

您的數據庫連接失敗。因此 $dbh未定義。

更新:這兩個意見都是正確的。思南有正確的答案 - OP在每一行都使用我。

+1

我輸入正確的用戶名和密碼,因此應該沒有數據庫連接失敗的原因。還有什麼可能導致數據庫連接? – Rachel 2009-11-05 15:42:51

+3

因爲他有'RaiseError'=> 1,如果連接失敗,他的程序不會死? – Andomar 2009-11-05 15:43:07

1

正如daotoad所說,您的DBI->connect呼叫失敗。檢查連接設置,查看是否可以從命令行連接到數據庫等。在Perl腳本中,始終檢查返回值DBI->connect()以查看連接是否成功。

my $dbh = DBI->connect("DBI:mysql:database=SPM;host=IP Address",...) 
      or die sprintf('connect() failed. Error: %s', DBI->errstr); 

my $dbh->do(q{ 
    INSERT INTO payment_methods(name, description)VALUES(CASH, DOLLAR) 
}); 
... 
+0

我能夠從命令行連接到數據庫,但是當我嘗試從Perl腳本中這樣做時,它給了我上面提到的錯誤消息。 – Rachel 2009-11-05 15:48:50

+0

@Sinan - 謝謝,我的DBI很生疏,我忘記了'DBI-> errstr' – mob 2009-11-05 15:59:18

+0

@Ingel:你的意思是'「...; host = IP地址」'還是應該是'「......:host = IP地址「'? – mob 2009-11-05 16:00:05

2

我懷疑它是錯誤消息的原因,但是在插入的值可能不是正確的:

VALUES(CASH, DOLLAR) 

也許應該是:

VALUES(\'CASH\', \'DOLLAR\') 

\是必需的因爲你使用的是'風格的字符串。如果使用"風格的字符串,而不是,你可以離開了\

"... VALUES('CASH','DOLLAR')" 
+2

對於這樣的事情佔位符開發。 – 2009-11-05 16:15:04

相關問題