Не удается запустить хранимую процедуру MySQL из сценария perl - PullRequest
1 голос
/ 30 июня 2011

Я пытаюсь получить доступ к хранимым процедурам MySQL из сценария Perl, но получаю эту ошибку:

"не удается вернуть набор результатов в данном контексте"

Как вы можете видетьПриведенная ниже процедура возвращает две таблицы результатов.Первоначально я думал, что проблема была результатом этого, но та же самая ошибка возникает, если я вызываю хранимые прокы, у которых есть только один оператор 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");

Ошибка связана с оператором execute.У меня есть необходимые привилегии и новейшая версия MySQL;процедура отлично работает в командной строке.

Что не так?Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 30 июня 2011

У вас есть одинарные кавычки вокруг оператора 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)), и это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...