PDO_mysql: неправильные результаты выборок.

Profic
На разных платформах и версиях MySQL поведение buffered api одинаково судя по моему опыту использования. Во всяком случае на FreeBSD 4.11 и NT 5.1 при PHP 5.1.*
 
Develar
Я и не сомневаюсь, что оно одинаково. Однако факт на лицо: при неопределенных обстоятельствах меняется тип используемого api. У меня он - buffered, у crocodile2u - unbuffered.

Кстати, у меня mysql 5.0.13-rc-nt и с ее же клиентом и собраны все модули php.
 
Profic. PDO не работает с MySQL 5. Только с MySQL 3.x/4.x Так написано в руководстве. В силу обстоятельств работа с MySQL 5 мне пока недоступна и я не могу сказать насколько это правда, но, судя по результатам mani13, PDO с MySQL 5 не дружит.

unbuffered в PDO по умолчанию и buffered не рекомендуется к использованию из-за совместимости с другими БД. If you're writing portable code, you should use PDOStatement::fetchAll() instead.
 
Develar
PDO не работает с MySQL 5.
И ты это мне говоришь? У меня все работает замечательно.
unbuffered в PDO по умолчанию и buffered не рекомендуется к использованию из-за совместимости с другими БД. If you're writing portable code, you should use PDOStatement::fetchAll() instead.
Знаю, но у тебя первый пример работает и у меня работает (т.е. используется buffered query), а у crocodile2u с mani13 - нет. Выводов я сделать не могу.
 
Profic
Первый пример работает так как while идет до победного false. То есть PDO понимает, что запрос обработан весь. Поэтому все нормально. PDO ведет себя нормально.

А во втором случае запрос вложен в foreach - результат очевиден - первый запрос не обработан - итерация первого foreach идет.

Странно, что Вы этого не понимаете (именно из-за Ваших личностей я с вами и говорю).

>> И ты это мне говоришь?
Я же четко написал, что не работал с ней и не ручаюсь за свои слова...
 
Спасибо! Как выясняется, все, действительно, подчиняется логике (хотя на первый взгляд кажется, что эта логика слегка извращенная). Насчет обработки ошибок - моя вина - каюсь! Но запросы настолько простые, что я никак не думал получить ошибку...
 
Develar
Я то как раз понимаю как оно работает, я не понимаю почему он ведет себя по разному при одном и том же коде (это я про первый пример).
Во втором же примере как и следовало ожидать третий query() возвращает false и foreach ругается: Warning: Invalid argument supplied for foreach().

Про mysql 5.0: ты сослался на mani13 указав, что не работает, я же привел свой пример показав, что все работает.

si
Идея только одна - проверить что возвращает setAttribute(). И заодно посмотреть, что вернет getAttribute().

ЗЫ. Может быть и правда pdo немного подглючивает. Однако я сам еще не встречался с проблемами.
 
Profic, как это по разному? Ты имеешь в виду unset? Так он ни на что не влияет (точнее мог бы, но запрос то уже обработан) и у меня, как я уже писал, результат идентичен.
 
Develar
Первый пример crocodile2u-а. Один и тот же код у меня работает как я и он этого ожидаем, у него же самого он работает совсем не так. Я именно про это.
 
Develar, Profic:

Вот еще вопрос по PDO_mysql: PDOStatement::rowCount() - у меня что-то не возвращает количество затронутых рядов. Вроде мануал об этом предупреждает, но тем не менее - как у вас обстоит дело с этим?

ЗЫ: то же самое с PDO::exec();
 
Попробовал собрать PDO отдельно(PDO 1.0.2, PDO-MySQL 1.0.1) -- результат тот же...
 
crocodile2u
На PDOStatement::rowCount() никогда не полагался. А вот PDO::exec() ведет себя хорошо. В твоем первом примере $pdo->exec($sql_insert) честно возвращает 2.

ЗЫ. Попробую сегодня-завтра собрать свеженький php, да посмотрю. Может быть деградация... :).
 
Profic, crocodile2u этого не утверждает, точнее утверждал, но мы его разубедили, возможно что сейчас все согласно логике (поставлю сейчас себе MySQL 5 попробую как оно там, хотя вряд ли что-то изменится).
crocodile2u
Лучше бы привели код который вас смущает, а так, в теории все работает:
PHP:
$pdo = new PDO('mysql:host=localhost;dbname=airs', 'root');
$db = $pdo->query("INSERT INTO `test1` VALUES (1), (2), (1), (2)");
var_dump($db->rowCount());
Результат int(4).

-~{}~ 06.02.06 20:29:

PDO нормально справился с первым примером на NT 5.1 PHP 5.1.2 MySQL 5.0.18 и проигнорировал раскомментирование unset как и должен был.

Тему, я думаю, можно считать закрытой.

Вопрос о строке в руководстве "Supported databases MySQL 3.x/4.x" остается открытым, но, наверное, просто на момент ее написания стабильного выпуска MySQL 5 не было, а потом ее забыли исправить.
 
Develar
Таки я тебя не понимаю. Самый первый пост этого топика говорит, что у crocodile2u-а было не так, как оно должно было бы быть на самом деле. Т.е. у него вариант без unset() сваливается после второго select-а, а с unset()-ами работает. У меня же без них и с ними работает правильно и как мне кажется, тут дело все-таки не в pdo, а в чем-то еще. В чем именно - я не знаю, могу только предполагать. Но этих самых предположений - масса, например какой-нить оптимайзер, или что-то вроде zend.ze1_compatibility_mode или настройка сервера (чем черт не шутит). Однако это все кажется мне маловероятным...
 
Я думаю что он просто что-то попутал и всё. С логической точки зрения результат необъясним и точка.

Смутное подозрение, что код который выполняется не есть тот, который представлен
в конце концов crocodile2u сознался и публично извинился перед PDO :) Что нам ещё надо :)
 
Develar
Код, который вызывал непонятное для меня поведение - *именно* тот, который я привел, я уже об этом говорил. Я ни в чем не "сознавался" - просто кое-какие моменты стали для меня яснее. Поведение программы, которую я привел в первом посте, так и остается для меня загадкой (я, кстати, тоже подумал про zend.ze1_compatibility_mode - у меня Off). Другое дело, что это а) можно обойти и б) второй случай для меня просто важнее.

ЗЫ: оптимайзера у меня нет.
 
Только что собрал свеженький cvs php5.1:
PHP 5.1.3-dev (cli) (built: Feb 7 2006 13:03:54)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
with Xdebug v2.0.0rc1-dev, Copyright (c) 2002, 2003, 2004, 2005, 2006, by Derick Rethans

Результат тот-же - первый пример работает как положено.
Ну и второй тоже ведет себя как положено.
 
crocodile2u
Cамое лучшее будет если ты напишешь отчет об ошибке разработчикам PDO.
Будет интересно узнать результаты.
 
Сверху