[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Хранимые процедуры MySQL и PHP
Страницы: 1, 2
psinetron
Здравствуйте.
Необходимо использовать хранимые процедуры в работе, но никак не могу с ними разобраться. Есть денвер. Есть таблица TestTable. В таблице три поля id, param1, param2.
Нужно создать процедуру с запросом SELECT * FROM TestTable, а результат вывести в пхп. Делал так:
В phpMyAdmin открываю мою БД, перехожу на вкладку SQL и пишу там:
CREATE PROCEDURE show_all()
BEGIN
SELECT * FROM TestTable;
END

т.е. вроде как создал процедуру show_all

теперь пхп:
<?php
mysql_connect("test1.ru", "test1dotru", "password");
mysql_select_db("test1dotru");
$result = mysql_query("call show_all()");
while ($row=mysql_fetch_array($result)){
print "id=" . $row['id'] . " param1=" . $row['param1'] . " param2=" . $row['param2']
}
?>


Ничего не работает :(
Пробовал вызывать процедуру из самого phpMyAdmin, он выдает
#1312 - PROCEDURE test1dotru.show_all can't return a result set in the given context

Что я неправильно сделал?
Invis1ble
$result = mysql_query("call show_all()") or die(mysql_error());

возможно, проблема в правах пользователя, от имени которого работает скрипт



Спустя 5 минут, 59 секунд Invis1ble написал(а):
Попробуй переписать немного процедуру
DELIMITER //
CREATE PROCEDURE show_all()
BEGIN
SELECT * FROM TestTable;
END//
DELIMITER ;


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

psinetron
Invis1ble пост1: PROCEDURE test1dotru.show_all can't return a result set in the given context
Invis1ble пост2: ошибка такая: #1312 - PROCEDURE test1dotru.show_all7 can't return a result set in the given context
Invis1ble
Нужно задать возвращаемое значение в процедуре и использовать SELECT * INTO result FROM `table`
В общем там проблема у тебя в том, что не возвращается значение (К.О. smile.gif)
Как решается, чесно говоря не знаю, ибо не было необходимости пока, поэтому не работал с такими задачами.
Если узнаешь - отпишись

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

psinetron
Тогда как это сделать?
     CREATE PROCEDURE show_all(OUT t VARCHAR(255))
BEGIN
SELECT * INTO 't' FROM TestTable;
END$$

Так получается ошибка - слишком много полей

     CREATE PROCEDURE show_all(OUT t VARCHAR(255))
BEGIN
SELECT param1 INTO 't' FROM TestTable;
END$$

а так, что слишком много строк.

Получить удается только один параметр при таком запросе:
    CREATE PROCEDURE show_all(OUT t VARCHAR(255))
BEGIN
SELECT param1 INTO 't' FROM TestTable WHERE id=1;
END$$

т.е. когда в запросе действительно получается только одна строка и из нее мы берем только одно поле :(
Нужно получить именно SELECT * FROM TestTable...
Invis1ble
psinetron
я ж говорю, не сталкивался, по этому не знаю, как сделать выборку более одной строки.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Arni
http://www.devart.com/ru/dbforge/mysql/studio/ качаем и спользуем отладчик. Даже пошаковое выполнение есть с мониторингом данных которые хранятся в переменных.

Цитата (psinetron @ 18.08.2011 - 11:22)
Получить удается только один параметр при таком запросе:


Да так и есть. Внутри хранимых функций нельзя чтобы селект возвращал больше чем одну запись. В этом случае вам нужен while.

_____________
Ходить по воде и разрабатывать программы, следуя спецификации, очень просто… если они заморожены. (Edward V Berard).
________
psinetron
Arni подcкажите пожалуйста что вы имели в виду когда сказали что мне нужен while? Можно пример?
Arni
В хранимых процедурах и функциях есть оператор while. С помощью программы которую я порекомендовал выше это легко сделать и отладить. Там есть готовые вставки if while и все что нужно. В общем через итерации нужно делать несколько запросов, пока не вытянете все записи нужные вам. И следует отметить что это есть слабое место хранимых функций и процедур. Стоит подумать оправдано ли их использование в вашем случае.

_____________
Ходить по воде и разрабатывать программы, следуя спецификации, очень просто… если они заморожены. (Edward V Berard).
________
psinetron
разобрался! Оказывается дело было в версии mysql в денвере. просто нужен более свежий мускл. теперь вот только денверовский phpMyAdmin не хочет работать но да бог с ним )))
psinetron
пхп будет выглядеть так:
$mysqli  = mysqli_connect( "localhost", "root", "password", "my_db");
if (mysqli_multi_query($mysqli, "CALL new_proc();")) {
if ($result = mysqli_store_result($mysqli)){
while ($row = mysqli_fetch_row($result)){
printf ($row[0]);
}
}

//$result = mysqli_multi_query( $mysqli, "CALL new_proc();") or die("Тут выдохлись");

}

Единственный недостаток так это то что $row нельзя вытащить по имени поля, только по порядку.
Invis1ble
psinetron
а покажи код процедуры плиз

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

psinetron
CREATE DEFINER = 'root'@'localhost' PROCEDURE `new_proc`()
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
SELECT * FROM `testtable`;
END;

пожалуйста
Arni
Цитата (psinetron @ 20.08.2011 - 11:28)
CREATE DEFINER = 'root'@'localhost' PROCEDURE `new_proc`()
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
SELECT * FROM `testtable`;
END;

пожалуйста

Полученные таким образом данные разве можно будет использовать внутри процедуры? Сомневаюсь ...

_____________
Ходить по воде и разрабатывать программы, следуя спецификации, очень просто… если они заморожены. (Edward V Berard).
________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.