SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 23.04.2010 14:26:58

cooler
Завсегдатай
Зарегистрирован: 14.01.2010
Сообщений: 52

mysqli

Здравствуйте , столкнулся с такой проблемой.
Есть метод, который выполняет функцию и возвращает результат в виде массива
Если метод запускать 1 раз (за все время работы сценария php) все работает нормально,
если вызвать например 2 раза (2 разные процедуры) на втором вызове вылетает ошибка
Commands out of sync; you can't run this command now

Вот собственно код:
mysqli_real_query($this->db_handle,"CALL {$proc}");
$result = mysqli_use_result($this->db_handle);
$rows = array();
if ($result){
    while ( $row = mysqli_fetch_assoc($result) ) {
    $rows[] = $row;               
}
mysqli_free_result($result);
}else{
    echo mysqli_error($this->db_handle);
}       
return $rows;

Зарание благодарен за вашу помощь.

Неактивен

 

#2 23.04.2010 16:17:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: mysqli

Есть ощущение, что это вопрос таки по PHP smile

Вызывается ли mysqli_free_result после первого использования? Все ли resultsetы
Вы вычитываете при обработке процедуры? Что возвращает mysqli_more_results?

Неактивен

 

#3 23.04.2010 16:26:56

cooler
Завсегдатай
Зарегистрирован: 14.01.2010
Сообщений: 52

Re: mysqli

проблема в том, что когда я в 1 соединении делаю вызов процедуры а затем пытаюсь сделать любой другой запрос, то вылетает эта ошибка. Это возникает только в том случае, если я сначало вызывал процедуру. Причем при первом вызове процедуры я получаю от нее корректные данные. Поэтому я решил что это проблема зарыта где то в мускуле, мне кажется между вызовами процедур нужно делать какойто вызов команды мускула, возможно вы что-то об этом знаете?

Отредактированно cooler (23.04.2010 16:49:44)

Неактивен

 

#4 23.04.2010 17:05:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: mysqli

Обработка запроса происходит таким образом

1. Клиент: Выполни процедуру А
2. Сервер: Выполняю... готово
3. Клиент: Отдай результат
4. Сервер: Строка1, Строка2, ...
5. Клиент: Отдай результат
6 .Сервер: Больше результатов нет

Вот шаги 5 и 6 — критичны. Если их не сделать, то сервер будет ждать, когда
к нему прийдет команда отдачи следующего результата, а не следующий запрос.

Посмотрите пример выборки данных — там есть правильная последовательность
вызовов методов mysqli: http://ru2.php.net/manual/en/mysqli.use-result.php

Неактивен

 

#5 23.04.2010 17:35:10

cooler
Завсегдатай
Зарегистрирован: 14.01.2010
Сообщений: 52

Re: mysqli

Решил проблему, если кому будет нужно.
После каждого вызова процедуры и обработки данных делайте дополнительно это действие
if ( mysqli_more_results($this->db_handle) ) {
     $nextResult =mysqli_next_result($this->db_handle);
}
Оно проверяет есть ли еще резалт сеты, и если есть извлекаем его. Почемуто процедура возвращает 2 резалт сета (На сколько я понял)

Неактивен

 

#6 23.04.2010 17:46:20

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: mysqli

Ну, по одному сету на каждую выборку внутри процедуры + 1 результат на
сам вызов процедуры (код ответа).

И лучше замените if на while.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson