2009-11-05 68 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

相关问题