Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как использовать процедуры?
 
 автор: codexomega   (14.09.2006 в 06:38)   письмо автору
 
 

Есть такая процедура созданная через 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, то всё работает.

Как быть?
Как правильно вызвать процедуру?
Заранее спасибо.

   
 
 автор: kaoz   (14.09.2006 в 09:21)   письмо автору
 
   для: codexomega   (14.09.2006 в 06:38)
 

я использовал процедуры для того чтобы они выполняли что-либо в базе (редактировали поля согласно параметрам), а вот в качестве select я их не использовал :(

ps: я вызывал процедуры запросом CALL( proc(param1,param2) );

   
 
 автор: cheops   (14.09.2006 в 13:39)   письмо автору
 
   для: codexomega   (14.09.2006 в 06:38)
 

Хм... так у вас процедура ничего не возвращает, отрабатывает запрос
SELECT * FROM client.religion_articles;

но результирующая таблица не выходит за пределы процедуры. Вы что хотите сделать процедурой?

   
 
 автор: codexomega   (15.09.2006 в 07:03)   письмо автору
 
   для: cheops   (14.09.2006 в 13:39)
 

А что она должна возвращать?
Что я хочу сделать? Заменить запрос процедурой.
Имя процедуры хранить как константу в классе, затем вызывать по необходимости.
Такое вполне возможно на MSSQL Server - использовать SELECT внутри процедуры.
Реализуемо ли последнее в MySQL?

Т.е буквально запихать запрос:

SELECT * FROM client.religion_articles;


в хранимую процедуру, для вывода данных из таблицы?

   
 
 автор: cheops   (15.09.2006 в 11:27)   письмо автору
 
   для: 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);

уберите "отсоеденение", соединение нужно оставить, для того, чтобы получить результирующую таблицу.

   
 
 автор: codexomega   (16.09.2006 в 05:57)   письмо автору
 
   для: 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);   

  
?>

   
 
 автор: cheops   (16.09.2006 в 13:35)   письмо автору
 
   для: codexomega   (16.09.2006 в 05:57)
 

Проверьте значение дескриптора $sqlResult на ошибки
<?php
  
if(!$sqlResult) exit(mysql_error());
?>

Что возвращается?

   
 
 автор: codexomega   (17.09.2006 в 02:55)   письмо автору
 
   для: cheops   (16.09.2006 в 13:35)
 

PROCEDURE client.spGetReligionArticleList can't return a result set in the given context

   
 
 автор: codexomega   (17.09.2006 в 04:45)   письмо автору
 
   для: codexomega   (17.09.2006 в 02:55)
 

Товарищ cheops, спасибо за поддержку.
Вывод ошибки по вашей подсказке вывел меня на верный путь.
На англо-язычных форумах подобная проблема кое-где описана.
Оказалось что библиотека mysql не поддерживает мульти-запросы, и для моего случая ипользуется улучшенная версия - библиотека mysqli(improved).
Заменив в коде функции mysql на mysqli, и добавив в файл php.ini строку : extension=php_mysqli.dll, у меня всё получилось.

PS:
>уберите "отсоеденение", соединение нужно оставить, для того, чтобы получить результирующую >таблицу

Это никак не влияет на результат. Прекрасно работает как и раньше в случае с mysql с прямым запросом.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования