safemysql
safemysql copied to clipboard
Не реализована работа с хранимыми процедурами
Класс не корректно работает с хранимыми процедурами. В частности не реализована очистка нескольких возращаемых результатов, с использованием mysqli_next_result. Так как результаты полностью не очищаются, получаем сообщение Commands out of sync; you can't run this command now.
Да, это правда. Увы, самому мне с возвращающими несколько результатов процедурами работать не приходилось. Не могли бы вы написать код, который нужен будет в данном случае?
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);
}
}
}
Модифицировал стандартную функцию free. Это должно решить проблему.
Я правильно понимаю, что это только для случая, когда остальные результаты не нужны? И по-хорошему, нужно сделать аналоги mysqli_more_results
, mysqli_next_result
и mysqli_store_result
?
и плюс написать что-нибудь вроде freeAll, в которую поместить этот код?
Тогда можно будет как использовать все результаты, так и очистить их?
Да, SP возвращает вроде 2 результата, сам результат и статусное сообщение для одного возвращаемого значения. Использовать несколько возвращаемых значений дурной тон, но кто то может использовать.
Скачал свежую версию класса. Safemysql: Commands out of sync; you can't run this command now. Как правильно работать с процедурами в классе?
Есть решение mysqli_more_results, mysqli_next_result и mysqli_store_result? У меня пустой результат при мультизапросе
@alekssskirov Приведите пример кода, пожалуйста
Решил так
Так работает
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 Я наверное этот момент пропустил. Разве mysqli::query() возвращает "мультирезультат"? Можете привести пример того, что передается в $query
?
Да ошибся, if ($mysqli->multi_query($query))
Но в маем случаи и query работает :-) , т.к. запросы идут к sphinx для FACET, а sphinx multi отдает и через query()
@alekssskirov Хорошо. Ваш код теперь не вызывает вопросов (но его не мешало бы отформатировать в комментарии). Смущает другое. Как это связано с темой issue? "Топикстартер" не потрудился привести пример неработающего кода с использованием данной библиотеки, вы добавили подроностей, но я опять не вижу кода самой процедуры, при работе с которой есть проблемы