Perl DBD fetchrow_array错误:

时间:2013-12-18 17:05:00

标签: mysql perl

我在阅读MySQL时遇到一些奇怪的错误,我的代码是这样的:

my $sql = <<"sqleof";
select t1.name t1_name, t2.name t2_name from t2
    inner join t1 using(Id)
    where t2.Id in (select Id from t3 where t3Id='$id') 
sqleof
#here $dbh had connected correctly and done some query before this; $sql can execute pretty well on MySQL command line and return me some records.
my $execute = $dbh->prepare($sql);
$execute->execute or die "Error: $DBI::errstr\n";
my @client = $execute->fetchrow_array() or die "Error: $DBI::errstr\n";
#here I got error saying: DBD::ODBC::st fetchrow_array failed:     Unable to fetch information about the error

有什么问题?

大家好,很抱歉打扰你。我找到了原因。这是一个低级别的错过,因为我使用了多个$ dbh,我犯了执行名称的错误。

    my $execute_A = $dbh->prepare($sql);
$execute_A->execute or die "Error: $DBI::errstr\n";
my @client = $execute_B->fetchrow_array()  #$execute_B here when I copied lines and modified.

你的帮助对我来说非常重要。谢谢大家。

3 个答案:

答案 0 :(得分:2)

替换

my @client = $execute->fetchrow_array() or die "Error: $DBI::errstr\n";

my @client = $execute->fetchrow_array();

您正在获取空数组,这不适合..or die ..建议的错误检查。

.. or die ..仅适用于prepareexecute方法。


旁注,你也缺乏正确的错误检查:

my $execute = $dbh->prepare($sql) or die $dbh->errstr; # not $DBI::errstr
$execute->execute or die $execute->errstr;             # not $DBI::errstr

另外,使用 sql占位符来阻止sql injection

答案 1 :(得分:0)

尝试将sql查询中的变量$ id更改为?然后通过execute传递变量。像$ execute-&gt; execute($ id)

答案 2 :(得分:0)

在我看来,执行会导致你的mysql服务器崩溃。这是我能想到的唯一原因,可以解释“无法获取有关错误的信息”。如果你正在使用safe_mysqld,你可能甚至都没注意到它会自动重启。

如果是在网站上,并且偶尔会出现此错误,那么有人会试图通过在您的表单中添加3' or 'a'='a之类的东西来破解您(尝试使用此替换id会发生什么情况你问题中的字符串)。如果格式错误,服务器可能会尝试执行任何操作。要防止此类SQL注入攻击,请将查询重写为

my $sql = <<"sqleof";
select t1.name t1_name, t2.name t2_name from t2
    inner join t1 using(Id)
    where t2.Id in (select Id from t3 where t3Id=?) 
sqleof

并致电$execute->execute($id)