safemysql icon indicating copy to clipboard operation
safemysql copied to clipboard

Не реализована работа с хранимыми процедурами

Open x88 opened this issue 11 years ago • 12 comments

Класс не корректно работает с хранимыми процедурами. В частности не реализована очистка нескольких возращаемых результатов, с использованием mysqli_next_result. Так как результаты полностью не очищаются, получаем сообщение Commands out of sync; you can't run this command now.

x88 avatar Jun 29 '13 08:06 x88

Да, это правда. Увы, самому мне с возвращающими несколько результатов процедурами работать не приходилось. Не могли бы вы написать код, который нужен будет в данном случае?

colshrapnel avatar Jun 29 '13 08:06 colshrapnel

    function free($res){
        mysqli_free_result($res);  
            while(mysqli_more_results ($this->conn)){
              mysqli_next_result($this->conn);
              if($_res = mysqli_store_result($this->conn)){
                      mysqli_free_result($_res); 
              }
            }
    }

x88 avatar Jun 29 '13 08:06 x88

Модифицировал стандартную функцию free. Это должно решить проблему.

x88 avatar Jun 29 '13 08:06 x88

Я правильно понимаю, что это только для случая, когда остальные результаты не нужны? И по-хорошему, нужно сделать аналоги mysqli_more_results, mysqli_next_result и mysqli_store_result? и плюс написать что-нибудь вроде freeAll, в которую поместить этот код?

Тогда можно будет как использовать все результаты, так и очистить их?

colshrapnel avatar Jun 29 '13 08:06 colshrapnel

Да, SP возвращает вроде 2 результата, сам результат и статусное сообщение для одного возвращаемого значения. Использовать несколько возвращаемых значений дурной тон, но кто то может использовать.

x88 avatar Jun 29 '13 08:06 x88

Скачал свежую версию класса. Safemysql: Commands out of sync; you can't run this command now. Как правильно работать с процедурами в классе?

webninjadk avatar Mar 24 '18 17:03 webninjadk

Есть решение mysqli_more_results, mysqli_next_result и mysqli_store_result? У меня пустой результат при мультизапросе

alekssskirov avatar Sep 04 '20 14:09 alekssskirov

@alekssskirov Приведите пример кода, пожалуйста

00dev avatar Sep 05 '20 11:09 00dev

Решил так

Так работает

public function query1($query) { $mysqli = $this->conn; if ($mysqli->query($query)) { do { if ($result = $mysqli->store_result()) { while ($row = $result->fetch_row()) $ret[] = $row; $result->free(); } } while ($mysqli->more_results() && $mysqli->next_result()); } return @$ret; }

alekssskirov avatar Sep 07 '20 12:09 alekssskirov

@alekssskirov Я наверное этот момент пропустил. Разве mysqli::query() возвращает "мультирезультат"? Можете привести пример того, что передается в $query?

00dev avatar Sep 07 '20 15:09 00dev

Да ошибся, if ($mysqli->multi_query($query))
Но в маем случаи и query работает :-) , т.к. запросы идут к sphinx для FACET, а sphinx multi отдает и через query()

alekssskirov avatar Sep 07 '20 20:09 alekssskirov

@alekssskirov Хорошо. Ваш код теперь не вызывает вопросов (но его не мешало бы отформатировать в комментарии). Смущает другое. Как это связано с темой issue? "Топикстартер" не потрудился привести пример неработающего кода с использованием данной библиотеки, вы добавили подроностей, но я опять не вижу кода самой процедуры, при работе с которой есть проблемы

00dev avatar Sep 08 '20 09:09 00dev