自2011年以来一直处理这个问题。通常能够解决这个问题。现在出现了一种情况,我真的需要能够处理错误,我想,人们已经知道这个问题多年了,它看起来像修复列表中的那种东西,但是最新的DBI升级而问题仍未解决。有没有人找到解决办法,或者知道如何破解库并让DBI :: errstr在出错时携带一个值?
这是我的代码(是的,我知道带有空白root密码的问题):
use strict;
use DBI;
use DBD::mysql;
use Data::Dumper;
my $platform = "mysql";
my $database = "test";
my $host = "localhost";
my $port = "3306";
my $user = "root";
my $pw = "";
my $dsn;
$dsn = "dbi:mysql:$database:$host:$port";
my $DBI_connect = DBI->connect($dsn, $user, $pw, {RaiseError => 1,PrintError=>1}) or die "$DBI::errstr\n";
my $sql_str = 'INSERT INTO test_tablexx (\'xxx) VALUES (blah)';
my $DBI_query_handle = $DBI_connect->prepare( $sql_str ) or die "Can't prepare SQL statement: $DBI::errstr\n";
my $return = $DBI_query_handle->execute() or warn "$DBI::errstr\n";
print "sys arry".Dumper $@."\n";
print "err: ".$DBI_query_handle->err."\n";
print "errstr: ".$DBI_query_handle->errstr."\n";
print "state: ".$DBI_query_handle->state."\n";
print "err: ".$DBI_connect->err."\n";
print "errstr: ".$DBI_connect->errstr."\n";
print "state: ".$DBI_connect->state."\n";
print Dumper $DBI_query_handle;
print "\n\n-------------------------------------------------------------------\n\n";
my $hash = DBI->installed_versions;
print Dumper $hash;
现在,该表无效,该列的中间有一个引号,该值是一个不带引号的字符串。应该像圣诞树一样点亮错误处理。
如果我将execute语句更改为“$ DBI :: errstr \ n”,它确实会收到错误;它会死,但根本没有消息。
然而结果如下:
sys arry$VAR1 = '
';
err:
errstr:
state:
err:
errstr:
state:
$VAR1 = bless( {}, 'DBI::st' );
-------------------------------------------------------------------
$VAR1 = {
'DBD::SQLite' => '1.37',
'DBD::ExampleP' => '12.014311',
'DBD::Sponge' => '12.010003',
'DBD::Pg' => bless( {
'original' => '2.19.3',
'qv' => 1,
'version' => [
2,
19,
3
]
}, 'version' ),
'DBD::Gofer' => '0.015327',
'DBD::DBM' => '0.08',
'DBD::mysql' => '4.022',
'DBD::ADO' => '2.99',
'DBD::ODBC' => '1.41',
'DBI' => '1.631',
'DBD::File' => '0.42'
};
最后一位是版本信息的转储,所以你们都可以看到我最新的DBI安装。
现在,当我将数据库更改为不存在的内容时,例如:my $ database =“testxxx”,它确实会触发错误:
DBI connect('testxx:localhost:3306','root',...) failed: Unknown database 'testxx' at ../sql_tester.pl line 17.
最后一点信息,当我转储$ DBI :: lasth时,我可以看到错误方法是undef:
print Dumper $DBI::lasth;
$VAR1 = bless( {
'FetchHashKeyName' => 'NAME',
'TraceLevel' => 0,
'ImplementorClass' => 'DBD::mysql::db',
'dbi_imp_data' => undef,
'State' => \undef,
'Username' => 'root',
'Errstr' => \undef,
'ChildHandles' => [
bless( {}, 'DBI::st' )
],
'Driver' => bless( {
'Attribution' => 'DBD::mysql by Patrick Galbraith',
'FetchHashKeyName' => 'NAME',
'TraceLevel' => 0,
'ImplementorClass' => 'DBD::mysql::dr',
'State' => \undef,
'Version' => '4.022',
'Errstr' => \undef,
'ChildHandles' => [
bless( {}, 'DBI::db' )
],
'Name' => 'mysql',
'Err' => \undef
}, 'DBI::dr' ),
'Statement' => 'INSERT INTO test_tablexx (\'xxx) VALUES (blah)',
'Name' => 'test:localhost:3306',
'dbi_connect_closure' => sub { "DUMMY" },
'Err' => \undef
}, 'DBI::db' );
所以请那些SO的好人,当编程的最重要原则之一 - 错误处理 - 在我的程序的核心模块中不起作用时,我该怎么办?!
答案 0 :(得分:4)
根据DBD::mysql changelog,这已在v4.024(2013年9月17日发布)中修复。您的输出显示您仅使用v4.022,因此您需要升级DBD::mysql。您可以找到详细说明问题的错误报告here。