За последние 24 часа нас посетили 32906 программистов и 1754 робота. Сейчас ищут 915 программистов ...

mysqli

Тема в разделе "Прочие вопросы по PHP", создана пользователем Amatory999, 23 апр 2010.

  1. Amatory999

    Amatory999 Активный пользователь

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

    Вот собственно код:
    PHP:
    1. $result = mysqli_query($this->db_handle,"CALL {$proc}");
    2.         $rows = array();
    3.         if ($result){
    4.             while ( $row = mysqli_fetch_assoc($result) ) {
    5.                 $rows[] = $row;
    6.             }
    7.         }else{
    8.             echo mysqli_error($this->db_handle);
    9.         }
    10.         mysqli_free_result($result);
    11.         return $rows;
    Зарание благодарен за вашу помощь.
     
  2. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
  3. Amatory999

    Amatory999 Активный пользователь

    С нами с:
    23 июн 2009
    Сообщения:
    93
    Симпатии:
    0
    Нет не поможет.
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Попробуй
    PHP:
    1. $result = mysqli_query($this->db_handle,"CALL {$proc}", MYSQLI_ASYNC);
     
  5. Amatory999

    Amatory999 Активный пользователь

    С нами с:
    23 июн 2009
    Сообщения:
    93
    Симпатии:
    0
    Спасибо, но MYSQLI_ASYNC mysqli_query() - не схавала.
    mysqli_query() expects parameter 3 to be long, string given in

    MYSQLI_ASYNC - а что это вообще такое?
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  7. Amatory999

    Amatory999 Активный пользователь

    С нами с:
    23 июн 2009
    Сообщения:
    93
    Симпатии:
    0
    там написан о что эта константа доступна только при использовании mysqlnd - что это такое?
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Вообще проблема должна решаться более правильным путем. Что за процесс в $proc?
     
  10. Amatory999

    Amatory999 Активный пользователь

    С нами с:
    23 июн 2009
    Сообщения:
    93
    Симпатии:
    0
    Спасибо за помощь. А это точно мне поможет? Можешь объяснить почему возникает ошибка Commands out of sync; you can't run this command now ?
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Amatory999
    Ошибка возникает, потому что где-то нарушается правильный порядок работы с соединением. Использование MYSQLI_ASNC позволит выполнять запросы с нарушением порядка (асинхронно), но проблема проектирования то останется ))
     
  12. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    вырезано цензурой во избежании очередного срача(akrinel)

    PHP:
    1. <?php
    2. var_dump($this->db_handle->more_results());
    3.  
    4. $nextResult =$this->db_handle->next_result();
    5. var_dump($nextResult->fetch_array());
    6.  
    7. $otherResult = $this->db_handle->query('SHOW DATABASES');
    8. var_dump($otherResult->fetch_array());
    9.  
     
  13. Amatory999

    Amatory999 Активный пользователь

    С нами с:
    23 июн 2009
    Сообщения:
    93
    Симпатии:
    0
    Simpliest, спасибо большое.
    В поле $this->db_handle у меня хранится дискриптор полученный от функции mysqli_connect();
    Не могли бы Вы написать что я должен сделать в своем случае?
     
  14. Amatory999

    Amatory999 Активный пользователь

    С нами с:
    23 июн 2009
    Сообщения:
    93
    Симпатии:
    0
    Simpliest, спасибо еще раз. Можете ответить почему вызов процедуры возвращает 2 результата? Причем 2й извлеч не получилось.
     
  15. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Во-первых, для mysqli это не дескриптор.
    А полноценный объект.
    C которым можно делать так

    PHP:
    1. <?php
    2. $this->db_handle->query('tram-pam-pam');
    3.  
    и это описано в мануале.

    Во-вторых, что значит второй результат я не помню, при желании можно погуглить.
    Извлечь же его можно при помощи указанного метода next_result()
     
  16. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Да, кстати, результатов может быть больше чем 2.

    Код (Text):
    1. Число результатов = (Число SELECT в процедуре) + 1
     
  17. vench

    vench Активный пользователь

    С нами с:
    3 май 2010
    Сообщения:
    12
    Симпатии:
    0
    Адрес:
    Россия
    Есть вариант что соединение зарывается в диструторе объекта (если он есть).
    Просто один раз сталкивался с такой проблемой.