Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2013, 18:46   #1
dimorik
Пользователь
 
Регистрация: 23.08.2008
Сообщений: 51
Вопрос Ошибка при повторном вызове хранимой процедуры.

Подскажите пожалуйста, может кто сталкивался с такой проблемой:

PHP код:
<?php
include("startingmysql.php"); 

function 
count_protocol($area$protocol){ 
    global 
$link;
    
$query "CALL procedure_number('".$area."', '".$protocol."')";
        
$ver=mysqli_query($link$query);
             if (
$ver){
                 
$array_count mysqli_fetch_assoc($ver);
                 return 
$array_count;
                
             }
    
mysqli_free_result($ver);    //очищаем результирующий набор..

}

$array1 count_protocol('str1''str2'); // первый вызов проходит норм.
$array2 count_protocol('str1''str2'); //тут возникает ошибка

mysqli_close($link);
?>
Первый вызов этой функции, которая в свою очередь вызывает хранимую процедуру на MySQL проходит нормально. Любые другие повторные вызову дают ошибку:
Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in E:\sites\www\www\test.php on line 16
То есть переменная $ver не содержит набора данных именно при повторном вызове.
Сама хранимая процедура работает на ура и при единичном вызове всё выполняет. Из dbForge Studio for MySQL тоже прекрасно выполняется.
Если надо приведу код хранимки.
dimorik вне форума Ответить с цитированием
Старый 10.11.2013, 19:01   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

почему только 1 раз mysqli_free_result?
eval вне форума Ответить с цитированием
Старый 10.11.2013, 19:05   #3
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

это не ошибка, предупреждение
к тому же мне кажется, что уже первый раз не срабатывает
сделайте так
Код:
$array1 = count_protocol('str1', 'str2'); // первый вызов проходит норм.
print_r($array1);
$array2 = count_protocol('str1', 'str2'); //тут возникает ошибка 
print_r($array2);
ADSoft на форуме Ответить с цитированием
Старый 10.11.2013, 19:26   #4
dimorik
Пользователь
 
Регистрация: 23.08.2008
Сообщений: 51
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
почему только 1 раз mysqli_free_result?
Потому, что хранимка всегда возвращает только одну строку с двумя значениями (одна строка, два столбца).

ADSoft, после разового вызова вся функция в целом нормально возвращает массив:
PHP код:
$array1 count_protocol('str1''str2');
echo 
$array1['day'];
echo 
$array1['night']; //тут всё выводится хорошо и это проверено.

//стоит повторно вызвать ф-цию, даже с теми же самыми аргументами
//(и с другими тоже), то вылазит ошибка.

$array2 count_protocol('str1''str2'); // error! 
Причем если закоментировать первый вызов, то второй безовсяких проблем выводит результат, так как он становится единственным вызовом.

PS: сделал наипростейшую хранимку:

Код:
CREATE DEFINER = 'root'@'localhost'
PROCEDURE dip_base.proc()
BEGIN
 SELECT 1 AS day, 2 AS night;
END
В dbForge Studio for MySQL многократно вызываю её:

Код:
CALL proc();
CALL proc();
CALL proc();
CALL proc();
CALL proc();
CALL proc();
Ну без проблем работает!
При аналогичном повторном вызове из PHP - проблема остается. Весь мозг изломал уже.

Последний раз редактировалось dimorik; 10.11.2013 в 19:54.
dimorik вне форума Ответить с цитированием
Старый 10.11.2013, 19:52   #5
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

так может именно после работы первого второй раз и не работает?
типа нечего уже выбирать...
покажите хранимку
ADSoft на форуме Ответить с цитированием
Старый 10.11.2013, 19:52   #6
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

и какой то контрольный набор данных минимальный
ADSoft на форуме Ответить с цитированием
Старый 10.11.2013, 19:55   #7
dimorik
Пользователь
 
Регистрация: 23.08.2008
Сообщений: 51
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
так может именно после работы первого второй раз и не работает?
типа нечего уже выбирать...
покажите хранимку
Сделал наипростейшую хранимку:

Код:
CREATE DEFINER = 'root'@'localhost'
PROCEDURE dip_base.proc()
BEGIN
 SELECT 1 AS day, 2 AS night;
END
В dbForge Studio for MySQL многократно вызываю её:

Код:
CALL proc();
CALL proc();
CALL proc();
CALL proc();
CALL proc();
CALL proc();
Ну без проблем работает!
При аналогичном повторном вызове из PHP - проблема остается. Весь мозг изломал уже.

Последний раз редактировалось dimorik; 10.11.2013 в 19:58.
dimorik вне форума Ответить с цитированием
Старый 10.11.2013, 20:05   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Потому, что хранимка всегда возвращает только одну строку с двумя значениями (одна строка, два столбца).
и что ?
eval вне форума Ответить с цитированием
Старый 10.11.2013, 20:21   #9
dimorik
Пользователь
 
Регистрация: 23.08.2008
Сообщений: 51
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
и что ?
Ну сделал так:
PHP код:
<?php
include("startingmysql.php");

function 
count_protocol($area$protocol){ 
    global 
$link;
    
$query "CALL proc()";
    
$ver mysqli_query($ll$query);
        if (
$ver){        
                while(
$array_count mysqli_fetch_array($ver)){
                echo 
$array_count['days'].'<br>';
                echo 
$array_count['nights'];
               }    
        }
    
mysqli_free_result($ver);    //очищаем результирующий набор..

}

count_protocol('sss''sss');
count_protocol('sss''sss'); // тут ошибка.

mysqli_close($link);
?>
Только смысл-то какой? Всё равно цикл проходит один раз, так как нет там данных больше. Хранимка просто больше одной записи не возвращает. Вобщем проблема та же:
Цитата:
Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in E:\sites\www\www\test.php on line 22
PS: Хотя я не совсем правильно вас понял в начале. Я решил, что речь идет о mysqli_fetch_array(), мозг просто утомил уже в поисках ответа.
Но вызывать mysqli_free_result() более одного раза тоже смысла не вижу.

Последний раз редактировалось dimorik; 10.11.2013 в 20:30.
dimorik вне форума Ответить с цитированием
Старый 10.11.2013, 21:06   #10
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

ну так то правильнее очищать только тогда когда есть что очищать
Код:
function count_protocol($area, $protocol){ 
    global $link;
    $query = "CALL proc()";
    $ver = mysqli_query($ll, $query);
        if ($ver){        
                while($array_count = mysqli_fetch_array($ver)){
                echo $array_count['days'].'<br>';
                echo $array_count['nights'];
               }    
    mysqli_free_result($ver);    //очищаем результирующий набор..
        }


}
ADSoft на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка при вызове процедуры Emperator12 Общие вопросы Delphi 8 22.09.2012 00:52
Сохранение, введенного пользователем, значения в поле TextBox, при повторном вызове формы Denis Ch Microsoft Office Excel 28 02.02.2012 01:12
Перекрытие вариабл при повторном вызове функции KOTBASILIO JavaScript, Ajax 0 18.07.2011 19:09
Ошибка при вызове хранимой функции MySQL tavrocotaps Общие вопросы .NET 0 23.04.2010 10:25
ошибка 1064 при создании хранимой процедуры Grind SQL, базы данных 0 03.02.2010 00:00