我在阅读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.
你的帮助对我来说非常重要。谢谢大家。
答案 0 :(得分:2)
替换
my @client = $execute->fetchrow_array() or die "Error: $DBI::errstr\n";
与
my @client = $execute->fetchrow_array();
您正在获取空数组,这不适合..or die ..
建议的错误检查。
.. or die ..
仅适用于prepare
和execute
方法。
旁注,你也缺乏正确的错误检查:
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)
。