使用DBI();
导致此插入失败的原因是什么,SELECT调用正常,因此它不是凭据问题。
$dbh = DBI->connect("DBI:mysql:$dbname:$dbhost","$dbuser","$dbpass");
my $sth = $dbh->prepare( "INSERT INTO call_fields VALUES ( ?, ?, ?, ? )" ) or die print "$DBI:errstr";
$sth->execute( "NULL", 0, 0, "testing" ) or die print "er $DBI::errstr";
mysql ver 5.5 这是为MSWin32-x64构建的perl 5,版本14,subversion 1(v5.14.1)
注意:此语法可以正常工作:
$ dbh-> do(q /插入call_fields值(null,0,0,“testing”)/)或死“$ dbh :: errstr”;
答案 0 :(得分:6)
设置RaiseError
connection attribute并让DBI进行错误处理。
Perl中的SQL NULL value is represented as undef
,而不是引用的字符串NULL
。
use strictures;
use DBI qw();
my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost", $dbuser, $dbpass, { RaiseError => 1 });
my $sth = $dbh->prepare('INSERT INTO call_fields VALUES ( ?, ?, ?, ? )');
$sth->execute(undef, 0, 0, 'testing');
答案 1 :(得分:4)
声明
die print "$DBI:errstr";
是可疑的。正如Alan Haggai Alavi在评论中指出的那样,你错过了一个冒号。它应该是$DBI::errstr
。此外,它在stdERR(非stdout)中显示1,因为您将die
链接到print
。 print
为成功打印返回1,返回die
然后显示。
它还应该显示print-in stdout - 或者至少是打印中未定义值的警告,但除非你使用use warnings
,否则它将是相当沉默的。 (它可能会打印:errstr
。)
所以:
die $DBI::errstr;
应该改善你的情况。添加
use strict;
use warnings;
如果还没有进一步改善它。
答案 2 :(得分:3)
希望您只是有点困惑,试图整理您所获得的所有信息,这里是您的代码重写,以使用您已经给出的所有建议(以及其他几个)我所做的改变。)
我评论过我在每一行上所做的更改。
# Declared $dbh
# Removed unnecessary quote marks.
my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost", $dbuser, $dbpass);
# Removed unnecessary call to print
# Replaced $DBI::errstr with $sth->errstr
my $sth = $dbh->prepare( 'INSERT INTO call_fields VALUES ( ?, ?, ?, ? )' )
or die $sth->errstr;
# Replaced string "NULL" with undef (which DBI treats as NULL)
# Removed unnecessary call to print
# Replaced $DBI::errstr with $sth->errstr
$sth->execute( undef, 0, 0, 'testing' ) or die $sth->errstr;
我怀疑是删除了不必要的print
调用并将“NULL”切换为实际解决问题的undef
。
此外,我强烈建议a)在连接到DB时设置RaiseError
标志,b)将列名添加到INSERT语句,然后从语句中删除第一个可空的列
答案 3 :(得分:2)
您的错误打印:
... or die print "er $DBI::errstr";
看起来不对。
正如艾伦提到的那样,你修复了双冒号,但是正在执行的打印调用正在返回1.(1 = =成功打印......某处)
将你的骰子语法改为:
... or die "er $DBI::errstr";
你应该得到这样的东西:
er {DBI_ERROR_MESSAGE} at {Script_Name} line XXX.
您写道:
$dbh = DBI->connect("DBI:mysql:$dbname:$dbhost","$dbuser","$dbpass");
my $sth = $dbh->prepare( "INSERT INTO call_fields VALUES ( ?, ?, ?, ? )" ) or die print "$DBI:errstr";
$sth->execute( "NULL", 0, 0, "testing" ) or die print "er $DBI::errstr";
和另一个例子:
$dbh->do(q/insert into call_fields values(null,0,0,"testing") /) or die "$dbh::errstr";
这是一个“苹果与橘子”的比较。第一个是插入字符串“NULL”,但第二个插入'null'值。
我假设你的第一个准备输入值的call_fields表不接受字符串,因此$ sth->执行失败。