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]
Данный код работает при 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 и т. п.
По-видимому, надо все-таки использовать libmysql.dll версии 5.0.22 в поставке PHP и пусть тестовый набор падает на windows xp через раз, главное чтобы на продукционном сервере работало. Пойду копать Debian.
-~{}~ 16.12.06 20:54:
Если кто-нибудь использует хранимые процедуры в MySQL 5 с PDO (или mysqli) в windows - отзовитесь.
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());
Кто нибудь с этим сталкивался?
Если решение проблемы в том, чтобы собрать 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 - отзовитесь.