Хранимая процедура с SELECT - ошибка 2014 или 2013.

Develar

Новичок
Хранимая процедура с 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_ERRMODE, PDO::ERRMODE_EXCEPTION);
$Db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::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 - отзовитесь.
 

Mols

Новичок
http://phpclub.ru/talk/showthread.php?s=&threadid=93403&rand=6

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

Develar

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

Mols

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

Develar

Новичок
Андрейка
Не знаете - читаем мануал и не флудим. Данный код сбрасывает из буфера даром никому не нужный результат вызова хранимой процедуры. Я вроде пробовал на PDO такое делать, но прокатывало только на linux.
 

Андрейка

Senior pomidor developer
да я понимаю.. ты занят другим
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

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

camka

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

-~{}~ 18.12.06 01:16:

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

Develar

Новичок
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
 
Сверху