#php #mysql #stored-procedures
#php #mysql #хранимые процедуры
Вопрос:
я написал базовую хранимую процедуру с использованием mysql
DELIMITER //
CREATE PROCEDURE `sp_sel_test`()
BEGIN
SELECT * FROM category c;
END//
DELIMITER ;
теперь я вызываю ее из php
php-код является:
<?php
$txt = $_GET['id'];
$name = $_GET['name'];
$con = mysql_connect("localhost","four","password");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("fourthes_a", $con);
//$result = mysql_query("select * from new_c where name like %". $name ."% or c_name like %" . $name . "% order by name asc;");
$result = mysql_query("call sp_sel_test()");
if ($result === FALSE) {
die(mysql_error());
}
while($row = mysql_fetch_array($result))
{
echo $row['category_id'] . " " . $row['c_name'];
?>
<br />
<?php
}
mysql_close($con);
echo $txt;
?>
теперь он выдает ошибку
ПРОЦЕДУРА fourthes_a.sp_sel_test не может вернуть результирующий набор в данном контексте
Комментарии:
1. Исходный код, похоже, не соответствует сообщению об ошибке. Какая строка равна 26?
2. Вы тестировали это из phpmyadmin или командной строки mysql, чтобы увидеть, возвращает ли хранимая процедура ожидаемый результат?
3. phpMyAdmin также сообщает, что ПРОЦЕДУРА fourthes_a.sp_sel_test не может вернуть результирующий набор в данном контексте
4. Ваш php-код в порядке, это сохраненная процедура, которая повреждена.
5. у меня такое чувство, что это связано с версией php… он показывает 5.2.9
Ответ №1:
mysql_query()
возвращает false при сбое запроса. Вы не проверили, удался ли ваш запрос sproc, поэтому, скорее всего, вы передаете это логическое значение FALSE в функцию выборки, которая справедливо жалуется.
Перепишите свой код следующим образом, в виде простого минимума, для правильной обработки ошибок:
$res = mysql_query('call sp_sel_test()');
if ($res === FALSE) {
die(mysql_error());
}
Никогда не предполагайте, что запрос выполнен успешно. Даже если синтаксис SQL идеален, существует слишком много других причин, по которым запрос не выполняется, чтобы НЕ проверять, сработал ли он.
Комментарии:
1. в вашем коде ПРОЦЕДУРА выдает ошибку fourthes_a.sp_sel_test не может вернуть результирующий набор в данном контексте
Ответ №2:
Вам необходимо установить флаги клиента при подключении для использования хранимых процедур с php. Используйте это:
mysql_connect($this->h,$this->u,$this->p,false,65536);
Смотрите Флаги клиента MySQL для получения более подробной информации. PHP MySQL не позволяет запускать несколько инструкций в одном запросе. Чтобы преодолеть это, вы должны указать PHP разрешить такие запросы, установив флаг CLIENT_MULTI_STATEMENTS в вашем соединении.
Комментарии:
1. Это должно сработать. Если это не сработало. попробуйте вызвать mysql_connect еще раз, используя флаг 131072 или 199608. Который установит флаг множественных результатов.
Ответ №3:
Я знаю, что последний ответ был год назад, но…
СОЗДАЙТЕ ПРОЦЕДУРУ sp_sel_test
(ВЫВЕДИТЕ свой масштабируемый INT / TEXT …)
Инструкции, которые возвращают результирующий набор, не могут быть использованы в хранимой функции. Сюда входят операторы SELECT, которые не используют INTO для извлечения значений столбцов в переменные, операторы SHOW и другие операторы, такие как EXPLAIN. Для операторов, которые могут быть определены во время определения функции для возврата результирующего набора, возникает ошибка «Не разрешено возвращать результирующий набор из функции» (ER_SP_NO_RETSET_IN_FUNC). Для операторов, которые могут быть определены только во время выполнения для возврата результирующего набора, возникает ошибка ПРОЦЕДУРЫ %s, которая не может вернуть результирующий набор в данном контексте (ER_SP_BADSELECT).
Итак, ваш выбор должен быть таким:
SELECT * FROM category **INTO** c;
http://www.cs.duke.edu/csl/docs/mysql-refman/stored-procedures.html