gpt4 book ai didi

mysql - 无法从 perl 脚本运行 MySQL 存储过程

转载 作者:行者123 更新时间:2023-11-29 05:41:24 25 4
gpt4 key购买 nike

我正在尝试从 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;该过程在命令行中完美运行。

怎么了?感谢您的帮助。

最佳答案

您在 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 注入(inject)攻击就是这样发生的。相反,您应该使用 DBI 引用函数,如下所示:

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

我在我的 MySQL 实例(服务器版本:5.1.49-1ubuntu8.1 (Ubuntu))上测试了它并且它有效。

关于mysql - 无法从 perl 脚本运行 MySQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6526686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com