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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Нюанс PDO::exec ?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Как работает PDO::exec ?
shum0531
Отправлено: 11 Мая, 2014 - 21:37:38
Post Id



Гость


Покинул форум
Сообщений всего: 92
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




Доброго времени суток! Помогите понять принцип работы 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 если была попытка обновить строку старыми данными. Вернее данные для обновления, идентичны данным в базе и не нуждаются в их изменении (в моем случае это вполне возможно).

Так ли это?
 
 Top
KingStar
Отправлено: 11 Мая, 2014 - 22:08:59
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




обновление считается true в том случае, если есть что обновить, если нечего обновлять, т.е. как вы заметили обновляемые данные идентичны записанным ранее - то и соответственно обновлять нечего, возвращает false
(Добавление)
для уверенности, если имеются сомнения - в phpMyAdmin сделайте SQL запрос с обновлением новыми данными, и старыми - результат покажет сколько обновилось строк. В случае с идентичными данными результат будет типа "обновлено 0 строк", в случае изменений - "1 строка"


-----
То что программа работает, не означает что она написана правильно!
 
 Top
shum0531
Отправлено: 11 Мая, 2014 - 22:24:14
Post Id



Гость


Покинул форум
Сообщений всего: 92
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




KingStar
А PDO::query обновляет данные в любом случае?
В данный скрипт поставил query и не стало ошибки
 
 Top
teddy
Отправлено: 11 Мая, 2014 - 22:39:52
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




shum0531
exec() возвращает количество строк которые были затронуты в запросах insert,delete,update.
Т.е если за один запрос по условию к примеру было удалено/отредактировано/добавлен о 5 записей, то exec вернет число 5. Возможно потому, что в Вашем запросе не было изменений, exec вернул 0, который при не строгом сравнении равен false, собственно в этом и причина, я думаю.

Не нужно использовать подобные флаги для отката. Вместо этого, используйте try catch для транзакции, в catch вызывайте метод rollBack.
 
 Top
KingStar
Отправлено: 11 Мая, 2014 - 22:41:36
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




нет, exec возвращает количество обновленных строк, а query возвращает объект PDO
(Добавление)
teddy согласен, try catch - и будет счастье


-----
То что программа работает, не означает что она написана правильно!
 
 Top
teddy
Отправлено: 11 Мая, 2014 - 22:46:43
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




KingStar пишет:
нет, exec возвращает количество обновленных строк

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

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

Сам query() вызывается через объект PDO, который в свою очередь возвращает экземпляр класса PDOStatement, а это немного разные вещи.

(Отредактировано автором: 11 Мая, 2014 - 22:47:19)

 
 Top
KingStar
Отправлено: 11 Мая, 2014 - 22:50:04
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




teddy, Хм мдя... если быть точнее... вы прям умник умникович! писал своими словани, быть точнее - в маны
(Добавление)
Цитата:
query — Выполняет SQL запрос и возвращает результирующий набор в виде объекта PDOStatement


-----
То что программа работает, не означает что она написана правильно!
 
 Top
teddy
Отправлено: 11 Мая, 2014 - 22:53:32
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




KingStar
Да нет... просто это реально такой момент, где можно наступить на грабли... Я встречал людей, которые искали метод execute в мануале у класса PDO, и конечно же не нашли, потому что он есть у PDOStatement, но не у PDO. Поэтому что бы человек не "потерялся" скажем так, я решил это отметить...

сори если тебя это как то задело, мне это не нужно было...
 
 Top
KingStar
Отправлено: 11 Мая, 2014 - 22:56:01
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




teddy проехали Радость
по ТС видно, что вроде чел не такой уж ноль, поэтому писал простым языком и по сути


-----
То что программа работает, не означает что она написана правильно!
 
 Top
shum0531
Отправлено: 12 Мая, 2014 - 22:06:36
Post Id



Гость


Покинул форум
Сообщений всего: 92
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




Спасибо всем! Увидел элементарные вещи, на которых, почему то не обращал внимание ранее )))

closed
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB