Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Нюанс PDO::exec ?
Форумы портала PHP.SU » » Работа с СУБД » Нюанс PDO::exec ?

Страниц (1): [1]
 

1. shum0531 - 11 Мая, 2014 - 21:37:38 - перейти к сообщению
Доброго времени суток! Помогите понять принцип работы PDO::exec, поиск моей проблемы не дал результатов, возможно плохо искал.
Суть:
обновляю большое количество строк в транзакции.
PHP:
скопировать код в буфер обмена
  1. $db->beginTransaction();
  2. $is_error = FALSE;
  3. // цикл ->
  4. $db->exec($sql) or $is_error  = TRUE;

Далее проверяю $is_error для того что бы откатится либо фиксировать.

В данном скрипте $is_error всегда TRUE, то есть PDO::exec где то вернула FALSE. После часа мучений пришёл к выводу, что PDO::exec возвращает FALSE если была попытка обновить строку старыми данными. Вернее данные для обновления, идентичны данным в базе и не нуждаются в их изменении (в моем случае это вполне возможно).

Так ли это?
2. KingStar - 11 Мая, 2014 - 22:08:59 - перейти к сообщению
обновление считается true в том случае, если есть что обновить, если нечего обновлять, т.е. как вы заметили обновляемые данные идентичны записанным ранее - то и соответственно обновлять нечего, возвращает false
(Добавление)
для уверенности, если имеются сомнения - в phpMyAdmin сделайте SQL запрос с обновлением новыми данными, и старыми - результат покажет сколько обновилось строк. В случае с идентичными данными результат будет типа "обновлено 0 строк", в случае изменений - "1 строка"
3. shum0531 - 11 Мая, 2014 - 22:24:14 - перейти к сообщению
KingStar
А PDO::query обновляет данные в любом случае?
В данный скрипт поставил query и не стало ошибки
4. teddy - 11 Мая, 2014 - 22:39:52 - перейти к сообщению
shum0531
exec() возвращает количество строк которые были затронуты в запросах insert,delete,update.
Т.е если за один запрос по условию к примеру было удалено/отредактировано/добавлен о 5 записей, то exec вернет число 5. Возможно потому, что в Вашем запросе не было изменений, exec вернул 0, который при не строгом сравнении равен false, собственно в этом и причина, я думаю.

Не нужно использовать подобные флаги для отката. Вместо этого, используйте try catch для транзакции, в catch вызывайте метод rollBack.
5. KingStar - 11 Мая, 2014 - 22:41:36 - перейти к сообщению
нет, exec возвращает количество обновленных строк, а query возвращает объект PDO
(Добавление)
teddy согласен, try catch - и будет счастье
6. teddy - 11 Мая, 2014 - 22:46:43 - перейти к сообщению
KingStar пишет:
нет, exec возвращает количество обновленных строк

Если быть точнее, то количество затронутых строк в ходе запроса, выполненных посредством метода exec();

KingStar пишет:
а query возвращает объект PDO

Сам query() вызывается через объект PDO, который в свою очередь возвращает экземпляр класса PDOStatement, а это немного разные вещи.
7. KingStar - 11 Мая, 2014 - 22:50:04 - перейти к сообщению
teddy, Хм мдя... если быть точнее... вы прям умник умникович! писал своими словани, быть точнее - в маны
(Добавление)
Цитата:
query — Выполняет SQL запрос и возвращает результирующий набор в виде объекта PDOStatement
8. teddy - 11 Мая, 2014 - 22:53:32 - перейти к сообщению
KingStar
Да нет... просто это реально такой момент, где можно наступить на грабли... Я встречал людей, которые искали метод execute в мануале у класса PDO, и конечно же не нашли, потому что он есть у PDOStatement, но не у PDO. Поэтому что бы человек не "потерялся" скажем так, я решил это отметить...

сори если тебя это как то задело, мне это не нужно было...
9. KingStar - 11 Мая, 2014 - 22:56:01 - перейти к сообщению
teddy проехали Радость
по ТС видно, что вроде чел не такой уж ноль, поэтому писал простым языком и по сути
10. shum0531 - 12 Мая, 2014 - 22:06:36 - перейти к сообщению
Спасибо всем! Увидел элементарные вещи, на которых, почему то не обращал внимание ранее )))

closed

 

Powered by ExBB FM 1.0 RC1