1. Develar

    Develar Новичок

    Сообщения:
    259
    Адрес:
    Saint Petersburg, Russia
    Хранимая процедура с SELECT - ошибка 2014 или 2013.

    Windows XP SP2. PHP 5.2.0. MySQL 5.0.27.

    Написал программу с использованием хранимых процедур. PDO. Версия libmysql.dll из поставки PHP 5.2.0 (5.0.22, 1,40 МБ). Тестовый набор падает через раз с "#2013 - Lost connection to MySQL server during query". Изучил за 4 часа информацию об этом, ни звездочек перед созданием псевдонима поля в SELECT (была такая бага в MySQL), ни тупых настроек с timeout нет. Падает и все тут.
    Взял с mysql.com libmysql.dll (5.0.26, 1,44 МБ). Вот оно счастье - General error: 2014 Cannot execute queries while other unbuffered queries are active. Подумалось - я же не на Unix, да и багу ту давно закрыли. Ладно, навставлял unset($stmt) и $stmt = null и PDO::MYSQL_ATTR_USE_BUFFERED_QUERY. Не помогло. Нашел в документации PDOStatement::closeCursor. Начал было молиться, но посмотрел в комментариях пользователей - эта функция не работает - и она действительно не заработала. Там в же комментариях нашел ей замену - PDOStatement::nextRowSet(), через 10 минут на bugs.php.net (http://bugs.php.net/bug.php?id=34727) узнал что эта функция на windows не реализована.
    Сейчас "решил" проблему тем, что убрал SELECT из хранимой процедуры.

    [sql]CREATE PROCEDURE `test`() BEGIN SELECT 2 * 2; END;[/sql]

    PHP:
    $Db = new PDO('mysql:host=localhost;dbname=test''root''');
    $Db->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
    $Db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODEPDO::FETCH_ASSOC);

    $Pdo $Db->query('CALL test()');
    print_r($Pdo->fetchAll());

    $Pdo $Db->prepare('SELECT 2 * 2');
    $Pdo->execute();

    print_r($Pdo->fetchAll());
    Данный код работает при libmysql.dll из поставки PHP 5.2.0, но при этом тестовый набор периодически падает с 2013 в разных местах. А при libmysql.dll с mysql.com код не работает - 2014, а тестовый набор всегда дает 2014.

    Кто нибудь с этим сталкивался?
    Если решение проблемы в том, чтобы собрать PDO с MySQL 5.0.27 под win xp - то соберите, пожалуйста, за 50$ (libmysql.dll, php_pdo.dll и php_pdo_mysql.dll - оплачу даже если не заработает по yandex.money).

    -~{}~ 04.11.06 14:32:

    Копаю. дело не в PDO. Снес PHP 5.2.0 и поставил PHP 5.1.6 (для совместимости с поставкой php_mysqli.dll от MySQL AB) mysqli сказала то же самое - Commands out of sync; you can't run this command now и также нахально проигнорировала все шаги по устранению - free_result, close и т. п.

    PHP:
    $MySqlI = new mysqli('localhost''root''''test');
    $Db $MySqlI->query('CALL test()');
    print_r($Db->fetch_array());
    $Db->free_result();

    $Db $MySqlI->prepare('SELECT 2 * 2');
    var_dump($MySqlI->error);
    $Db->execute();

    print_r($Db->fetch());

    По-видимому, надо все-таки использовать libmysql.dll версии 5.0.22 в поставке PHP и пусть тестовый набор падает на windows xp через раз, главное чтобы на продукционном сервере работало. Пойду копать Debian.

    -~{}~ 16.12.06 20:54:

    Если кто-нибудь использует хранимые процедуры в MySQL 5 с PDO (или mysqli) в windows - отзовитесь.
  2. Mols

    Mols Новичок

    Сообщения:
    623
    Адрес:
    Донецк
    http://phpclub.ru/talk/showthread.php?s=&threadid=93403&rand=6

    когда я начинал проект работал с МуСКЛем на винде... если переоткрывать соединение всё нормально было. Доработку с вторым резалтом делал уже на никсах.... но думаю это не важно. должно работать и на винде.
  3. Develar

    Develar Новичок

    Сообщения:
    259
    Адрес:
    Saint Petersburg, Russia
    Mols
    Модераторы твою тему перенесли, а я и не заметил.
    На linux с этим тоже проблемы - но там бага конкретная и если написать, то исправят. А вот на wndows бага сложно воспроизводимая - хотя надо тоже написать. До меня дошло что идет два результата - в хранимой и как CALL - только все равно не помогло... Надо пошаманить еще значит... Спасибо.
  4. Андрейка

    Андрейка Senior pomidor developer

    Сообщения:
    990
    Адрес:
    Семипалатинский полигон
    а если добавить [m]mysqli_next_result[/m] между двумя запросами?
  5. Mols

    Mols Новичок

    Сообщения:
    623
    Адрес:
    Донецк
    if(mysqli_next_result($this->conn))
    {
    $recordset = mysqli_store_result($this->conn);
    };
    вот это надо сделать между двумя вызовами процедур и всё...
    но повторюсь, у меня нет OUT параметров в процедурах.... если у кого-то они есть то может быть этого и не достаточно . Да и.... нет никаких проблем на линуксе... и на FreeBSD тоже.. везде всё работает...
  6. Андрейка

    Андрейка Senior pomidor developer

    Сообщения:
    990
    Адрес:
    Семипалатинский полигон
    Mols
    написал прям как заклинание) мож объяснить че твой код делает то?:)
  7. Develar

    Develar Новичок

    Сообщения:
    259
    Адрес:
    Saint Petersburg, Russia
    Андрейка
    Не знаете - читаем мануал и не флудим. Данный код сбрасывает из буфера даром никому не нужный результат вызова хранимой процедуры. Я вроде пробовал на PDO такое делать, но прокатывало только на linux.
  8. Андрейка

    Андрейка Senior pomidor developer

    Сообщения:
    990
    Адрес:
    Семипалатинский полигон
    да я понимаю.. ты занят другим
    libmysql.dll из поставки PHP 5.2.0 (5.0.22, 1,40 МБ).
    libmysql.dll (5.0.26, 1,44 МБ).
    libmysql.dll с mysql.com
    PDO с MySQL 5.0.27

    ни звездочек перед созданием псевдонима поля в SELECT (была такая бага в MySQL)
    Подумалось - я же не на Unix, да и багу ту давно закрыли
    посмотрел в комментариях пользователей - эта функция не работает
    узнал что эта функция на windows не реализована
    Пойду копать Debian

    ты на правильном пути. удачи, не буду отвлекать..
  9. camka

    camka не самка

    Сообщения:
    509
    Адрес:
    ru_EE
    Develar
    Как заметил Mols в обсуждении по приведенной им ссылке, которую я все-таки советую вам почитать, call может возвращать (и обычно возвращает) больше одной выборки, даже если вы сами непосредственно возвращаете только одну в коде вызываемой процедуры. Вторая выборка идет для внутренних нужд, видимо, для возвращения кодов ошибок процедуры. Таким образом, чтобы перейти к следующему запросу, вам необходимо извлечь результаты всех выборок, возвращаемых предыдущим запросом.

    -~{}~ 18.12.06 01:16:

    Попробуйте использовать [m]mysqli_real_query[/m], если этому есть какой-то эквивалент в PDO.
  10. Develar

    Develar Новичок

    Сообщения:
    259
    Адрес:
    Saint Petersburg, Russia
    camka
    В том то и дело, что это не работает в windows (nextRowset в PDO вообще не реализовано под windows - состояние бага в wont fix), а в debian все отлично - я хотел узнать есть ли у кого положительный опыт использования windows+pdo+mysql5. Как оказалось - все жалуются.

    Всем спасибо. Буду ждать http://bugs.php.net/bug.php?id=39759 & http://bugs.php.net/bug.php?id=39858
  11. camka

    camka не самка

    Сообщения:
    509
    Адрес:
    ru_EE