|
|
|
| Есть такая процедура созданная через MySql Administrator, т.е синтаксис на 100%, всё должно работать.
CREATE DEFINER=`root`@`localhost` PROCEDURE `spGetReligionArticleList`()
BEGIN
SELECT * FROM client.religion_articles;
END
|
В учебнике так и не нашел толком как её вызвать и получить результат.
Там говорится об использовании CALL()
Но я так понял что на странице PHP это дело не пройдет.
Поэтому решил проэксперементировать так:
// подключение
...
$sqlResult = mysql_query("CALL spGetReligionArticleList() ");
// отсоеденение
...
// вывод данных
while ( $list = mysql_fetch_array( $sqlResult ) ) {
echo($list['article_id']); echo("<br/>");
echo($list['article_name']); echo("<br/>");
}
mysql_free_result($sqlResult);
|
Получаем:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\Server\Apache2.2\htdocs\religion\aTest.php on line 21
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in C:\Server\Apache2.2\htdocs\religion\aTest.php on line 25
Если же вместо процедуры использовать прямой запрос SELECT, то всё работает.
Как быть?
Как правильно вызвать процедуру?
Заранее спасибо. | |
|
|
|
|
|
|
|
для: codexomega
(14.09.2006 в 06:38)
| | я использовал процедуры для того чтобы они выполняли что-либо в базе (редактировали поля согласно параметрам), а вот в качестве select я их не использовал :(
ps: я вызывал процедуры запросом CALL( proc(param1,param2) ); | |
|
|
|
|
|
|
|
для: codexomega
(14.09.2006 в 06:38)
| | Хм... так у вас процедура ничего не возвращает, отрабатывает запрос
SELECT * FROM client.religion_articles;
|
но результирующая таблица не выходит за пределы процедуры. Вы что хотите сделать процедурой? | |
|
|
|
|
|
|
|
для: cheops
(14.09.2006 в 13:39)
| | А что она должна возвращать?
Что я хочу сделать? Заменить запрос процедурой.
Имя процедуры хранить как константу в классе, затем вызывать по необходимости.
Такое вполне возможно на MSSQL Server - использовать SELECT внутри процедуры.
Реализуемо ли последнее в MySQL?
Т.е буквально запихать запрос:
SELECT * FROM client.religion_articles;
|
в хранимую процедуру, для вывода данных из таблицы? | |
|
|
|
|
|
|
|
для: codexomega
(15.09.2006 в 07:03)
| | В блоке
// подключение
...
$sqlResult = mysql_query("CALL spGetReligionArticleList() ");
// отсоеденение
...
// вывод данных
while ( $list = mysql_fetch_array( $sqlResult ) ) {
echo($list['article_id']); echo("<br/>");
echo($list['article_name']); echo("<br/>");
}
mysql_free_result($sqlResult);
|
уберите "отсоеденение", соединение нужно оставить, для того, чтобы получить результирующую таблицу. | |
|
|
|
|
|
|
|
для: cheops
(15.09.2006 в 11:27)
| | Знаете, не помогло. Выводит те-же ошибки.
Может я неправильно использую хранимые процедуры в MySQL?
Было бы удобнее управлять сайтом так как описано выше, храня названия процедур в константах, сам запрос менять только в одном месте и вызывать по надобности...
Может мне функции нужны вместо процедур? Или вызов неверный?
Вообще, вот что у меня за структура:
class DataBaseManager
<?php
class DataBaseManager{
// - Connect to DataBase
public function makeConnection($server,$user,$pass,$db) {
$link = mysql_connect($server,$user,$pass) or die ('Connection Error. <br/> '.mysql_error());
mysql_select_db($db) or die ('DataBase Error. <br/>'.mysql_error());
return $link;
}
// - Close connection
public function closeConnection(){
mysql_close();
}
// - Execute query
public function executeQuery($query){
$queryResult = mysql_query($query);
return $queryResult;
}
// - Call stored procedure
public function callStoredProcedure($storedProcedure){
$queryResult = mysql_query("CALL ".$storedProcedure."()");
return $queryResult;
}
}
?>
|
class DataBaseProcedureConstants
<?php
class DataBaseProcedureConstants{
public function _construct(){}
// article procedures
const getArticleList = "spGetReligionArticleList";
}
?>
|
test.php
<?php
echo("HELLO!");
// require classes
require_once("../framework/database/classDataBaseManager.php");
require_once("../framework/database/classDataBaseProcedureConstants.php");
// using classes
DataBaseManager::makeConnection("localhost","root","xxxx","xxxx");
$sqlResult = DataBaseManager::callStoredProcedure(DataBaseProcedureConstants::getArticleList);
//DataBaseManager::closeConnection();
while ( $list = mysql_fetch_array( $sqlResult ) ) {
echo($list['article_id']); echo("<br/>");
echo($list['article_name']); echo("<br/>");
}
mysql_free_result($sqlResult);
?>
|
| |
|
|
|
|
|
|
|
для: codexomega
(16.09.2006 в 05:57)
| | Проверьте значение дескриптора $sqlResult на ошибки
<?php
if(!$sqlResult) exit(mysql_error());
?>
|
Что возвращается? | |
|
|
|
|
|
|
|
для: cheops
(16.09.2006 в 13:35)
| | PROCEDURE client.spGetReligionArticleList can't return a result set in the given context | |
|
|
|
|
|
|
|
для: codexomega
(17.09.2006 в 02:55)
| | Товарищ cheops, спасибо за поддержку.
Вывод ошибки по вашей подсказке вывел меня на верный путь.
На англо-язычных форумах подобная проблема кое-где описана.
Оказалось что библиотека mysql не поддерживает мульти-запросы, и для моего случая ипользуется улучшенная версия - библиотека mysqli(improved).
Заменив в коде функции mysql на mysqli, и добавив в файл php.ini строку : extension=php_mysqli.dll, у меня всё получилось.
PS:
>уберите "отсоеденение", соединение нужно оставить, для того, чтобы получить результирующую >таблицу
Это никак не влияет на результат. Прекрасно работает как и раньше в случае с mysql с прямым запросом. | |
|
|
|