我的Mysql数据库插入调用突然无声地失败

时间:2011-12-15 15:38:03

标签: perl

使用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”;

4 个答案:

答案 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链接到printprint为成功打印返回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->执行失败。