【问题标题】:Can't run MySQL stored procedure from perl script无法从 perl 脚本运行 MySQL 存储过程
【发布时间】:2011-06-29 20:15:13
【问题描述】:

我正在尝试从 perl 脚本访问 MySQL 存储过程,但收到此错误:

“无法在给定的上下文中返回结果集”

如您所见,以下过程返回两个结果表。最初,我认为问题是由此造成的,但如果我调用只有一个 select 语句的存储过程,也会出现同样的错误。

这是过程:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `GetPictureDataForSendMsg`(memIdVal VARCHAR(4))
begin
   select val, size3
   from members
   where memid=memIdVal;

   select id, filename, picname, picsize
   from pictures
   where memid=memIdVal order by id asc; 
end

调用者:

$input = 'ABC1';
$dbh = DBI->connect("DBI:mysql:$db:$server;mysql_multi_statements=true", "$user", "$password");
my $result = $dbh->prepare('CALL GetPictureDataForSendMsg($input)') or error($q, "Problem with database call");
$result->execute or error($q, "Problem with database call");

错误链接到执行语句。我有必要的权限和最新版本的 MySQL;该过程在命令行中完美运行。

怎么了?感谢您的帮助。

【问题讨论】:

标签: mysql perl stored-procedures


【解决方案1】:

CALL... 语句周围有单引号。变量只插入双引号字符串,而不是单引号字符串。将它们更改为双引号,如下所示:

my $result = $dbh->prepare("CALL GetPictureDataForSendMsg($input)") or error($q, "Problem with database call");

这会将变量插入到字符串中,因此您现在将“CALL GetPictureDataForSendMsg(ABC1)”发送到数据库。那也行不通。数据库会将您提供的任何内容作为参数直接放入 SQL 字符串中。如果您像这样引用 ABC1 'ABC1',那么它会将其视为字符串;否则它会认为 ABC1 是一列的名称 - 它不是。

所以,这条线会起作用:

my $result = $dbh->prepare("CALL GetPictureDataForSendMsg('$input')") or error($q, "Problem with database call");

但是这条线也有问题。如果 $input 表示的字符串包含单引号怎么办?它会破裂。这就是 SQL 注入攻击的发生方式。相反,您应该使用 DBI 报价功能,如下所示:

my $result = $dbh->prepare('CALL GetPictureDataForSendMsg('.$dbh->quote($input).')') or error($q, "Problem with database call");

我在我的 MySQL 实例(服务器版本:5.1.49-1ubuntu8.1 (Ubuntu))上对此进行了测试,它工作正常。

【讨论】:

  • ratsbane,感谢您的评论,您提出了一些很好的建议。但是,即使输入字符串更正,它仍然会出现相同的错误。
  • 你提到当你调用一个只返回一个结果集的存储过程时你会得到同样的错误。我想知道如果您将这个“mysql_multi_statements=true”从连接字符串中删除并尝试调用返回一个结果集的存储过程之一会发生什么。另外,您正在运行什么版本的 MySQL,以及什么版本的 Perl 和 DBI?
  • 删除 multi_statements 子句并切换到简单的一列一行一表 proc 仍然返回相同的错误。我的 MySQL 版本是 5.0.77,我的 DBD 是 3.0007。
  • 我想可能是这样。以下是我正在运行的版本: DBI::VERSION: 1.611 DBD::mysql::VERSION: 4.016 我隐约记得 DBD 在版本 4 之前的存储过程或多个结果集存在一些问题,虽然我找不到引用。
  • Ratsbane,我倾向于同意你的观点。我一直在做很多研究,一旦你把我放在版本问题上,我看到了一些其他证据支持你的说法。不幸的是,由于我们的 Linux 版本,我还不能升级 DBD,所以我无法确认您的解决方案。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 2014-09-30
  • 2010-11-02
  • 1970-01-01
相关资源
最近更新 更多