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

Develar

Новичок
Profic
На разных платформах и версиях MySQL поведение buffered api одинаково судя по моему опыту использования. Во всяком случае на FreeBSD 4.11 и NT 5.1 при PHP 5.1.*
 

Profic

just Profic (PHP5 BetaTeam)
Develar
Я и не сомневаюсь, что оно одинаково. Однако факт на лицо: при неопределенных обстоятельствах меняется тип используемого api. У меня он - buffered, у crocodile2u - unbuffered.

Кстати, у меня mysql 5.0.13-rc-nt и с ее же клиентом и собраны все модули php.
 

Develar

Новичок
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.
 

Profic

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

Develar

Новичок
Profic
Первый пример работает так как while идет до победного false. То есть PDO понимает, что запрос обработан весь. Поэтому все нормально. PDO ведет себя нормально.

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

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

>> И ты это мне говоришь?
Я же четко написал, что не работал с ней и не ручаюсь за свои слова...
 

crocodile2u

http://vbolshov.org.ru
Спасибо! Как выясняется, все, действительно, подчиняется логике (хотя на первый взгляд кажется, что эта логика слегка извращенная). Насчет обработки ошибок - моя вина - каюсь! Но запросы настолько простые, что я никак не думал получить ошибку...
 

Profic

just Profic (PHP5 BetaTeam)
Develar
Я то как раз понимаю как оно работает, я не понимаю почему он ведет себя по разному при одном и том же коде (это я про первый пример).
Во втором же примере как и следовало ожидать третий query() возвращает false и foreach ругается: Warning: Invalid argument supplied for foreach().

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

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

ЗЫ. Может быть и правда pdo немного подглючивает. Однако я сам еще не встречался с проблемами.
 

Develar

Новичок
Profic, как это по разному? Ты имеешь в виду unset? Так он ни на что не влияет (точнее мог бы, но запрос то уже обработан) и у меня, как я уже писал, результат идентичен.
 

Profic

just Profic (PHP5 BetaTeam)
Develar
Первый пример crocodile2u-а. Один и тот же код у меня работает как я и он этого ожидаем, у него же самого он работает совсем не так. Я именно про это.
 

crocodile2u

http://vbolshov.org.ru
Develar, Profic:

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

ЗЫ: то же самое с PDO::exec();
 

mani13

Новичок
Попробовал собрать PDO отдельно(PDO 1.0.2, PDO-MySQL 1.0.1) -- результат тот же...
 

Profic

just Profic (PHP5 BetaTeam)
crocodile2u
На PDOStatement::rowCount() никогда не полагался. А вот PDO::exec() ведет себя хорошо. В твоем первом примере $pdo->exec($sql_insert) честно возвращает 2.

ЗЫ. Попробую сегодня-завтра собрать свеженький php, да посмотрю. Может быть деградация... :).
 

Develar

Новичок
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 не было, а потом ее забыли исправить.
 

Profic

just Profic (PHP5 BetaTeam)
Develar
Таки я тебя не понимаю. Самый первый пост этого топика говорит, что у crocodile2u-а было не так, как оно должно было бы быть на самом деле. Т.е. у него вариант без unset() сваливается после второго select-а, а с unset()-ами работает. У меня же без них и с ними работает правильно и как мне кажется, тут дело все-таки не в pdo, а в чем-то еще. В чем именно - я не знаю, могу только предполагать. Но этих самых предположений - масса, например какой-нить оптимайзер, или что-то вроде zend.ze1_compatibility_mode или настройка сервера (чем черт не шутит). Однако это все кажется мне маловероятным...
 

Develar

Новичок
Я думаю что он просто что-то попутал и всё. С логической точки зрения результат необъясним и точка.

Смутное подозрение, что код который выполняется не есть тот, который представлен
в конце концов crocodile2u сознался и публично извинился перед PDO :) Что нам ещё надо :)
 

crocodile2u

http://vbolshov.org.ru
Develar
Код, который вызывал непонятное для меня поведение - *именно* тот, который я привел, я уже об этом говорил. Я ни в чем не "сознавался" - просто кое-какие моменты стали для меня яснее. Поведение программы, которую я привел в первом посте, так и остается для меня загадкой (я, кстати, тоже подумал про zend.ze1_compatibility_mode - у меня Off). Другое дело, что это а) можно обойти и б) второй случай для меня просто важнее.

ЗЫ: оптимайзера у меня нет.
 

Profic

just Profic (PHP5 BetaTeam)
Только что собрал свеженький 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

Результат тот-же - первый пример работает как положено.
Ну и второй тоже ведет себя как положено.
 

Develar

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