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 :: Результат выполнения UPDATE IGNORE с использованием PDO

 PHP.SU

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


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

> Без описания
Deonis
Отправлено: 29 Июля, 2013 - 16:45:13
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


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




Всех приветствую! Сделал маленькую функцию, в которую передается два параметра: подготовленная строка запроса и массив данных. Функция автоматом определяет (по строке запроса) какое действие необходимо выполнить и возвращает результат. В частности, для "UPDATE" - возвращает true или false, в зависимости от успеха операции. Теперь к проблемке: Если использовать конструкцию запроса "UPDATE IGNORE ...", и обновлять запись с уникальным полем в БД, то в случае дублирования данный, мы получим ответом "0" и в случае, если пользователь ничего не изменил в данных - тоже "0" затронутых строк.
Сижу и чешу затылок, как бы разграничить эти результаты и выводить юзверю соответствующее сообщение: или "Такое имя уже используется", или ... ну, тут можно не выводить сообщение, т.к. ошибки не было, а просто данные остались такими же, как до попытки их обновить.
Повторюсь, что использую PDO и кроме того, данные отправляются AJAX-запросом, что не допускает попадания в ответ ошибки сгенерированной на сервере, какой она могла бы быть, если использовать запрос без "IGNORE".
Если кто сталкивался с подобным, прошу натолкнуть на мысль в правильном направлении.
 
 Top
EuGen Администратор
Отправлено: 29 Июля, 2013 - 16:51:45
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Deonis
C точки зрения БД возвращается число затронутых строк (в терминах PDO это PDOStatement::rowCount ), то есть при помощи этого числа случаи разграничить нельзя. Однако Вы можете сделать SELECT до запроса UPDATE и проверить, уникальны ли данные, и, если нет, возвращать соответствующий статус (-1, например) клиенту.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Deonis
Отправлено: 29 Июля, 2013 - 16:56:38
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


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




EuGen пишет:
SELECT до запроса UPDATE

Это дело понятное, только хотелось избежать лишних телодвижений в сторону БД. Но если других вариантов нет, то естественно, что придется.
 
 Top
EuGen Администратор
Отправлено: 29 Июля, 2013 - 17:04:41
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Deonis пишет:
Повторюсь, что использую PDO и кроме того, данные отправляются AJAX-запросом, что не допускает попадания в ответ ошибки сгенерированной на сервере, какой она могла бы быть, если использовать запрос без "IGNORE".

Можете использовать try..catch, чтобы отловить такой случай (и использовать UPDATE без IGNORE) - выбор за Вами.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Deonis
Отправлено: 29 Июля, 2013 - 17:12:54
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


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




EuGen пишет:
Можете использовать try..catch

Безусловно использую, только в исключения это не попадает, т.к. не считается ошибкой выполнения, а без IGNORE ошибка выстраивается в ответ ajax-запроса и выводит из строя всю дальнейшую работу сайта. Да Бог с ним, я так подумал, что одним запросом больше - на скорость работы не повлияет, к тому же запрос простейший и по уникальным полям. А то "программистская паранойя" иногда берет верх над здравым смыслом Подмигивание

(Отредактировано автором: 29 Июля, 2013 - 17:14:52)

 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Июля, 2013 - 21:00:35
Post Id



Активный участник


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


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




Deonis пишет:
Безусловно использую, только в исключения это не попадает, т.к. не считается ошибкой выполнения
О чем речь? Мне кажется Вы не совсем владеете данной стороной вопроса.
try ... catch вы пишете сами, локальный, именно для этой ситуации.
По сути работать оно будет как if ... else.
 
 Top
Deonis
Отправлено: 29 Июля, 2013 - 22:48:30
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


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




DeepVarvar пишет:
О чем речь?

Речь видимо в том, что вы не внимательно читали. Запрос, с использованием ключевого слова "IGNORE", не вызовет никаких исключений, ошибок и т.д., потому как строки, имеющие дублирующиеся ключи PRIMARY или UNIQUE в этой таблице, будут попросту проигнорированы, при этом не будет прекращено выполнение.

(Отредактировано автором: 29 Июля, 2013 - 22:50:03)

 
 Top
EuGen Администратор
Отправлено: 29 Июля, 2013 - 23:07:23
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Deonis
Вероятно, Вы не до конца поняли мой комментарий. Я предложил использовать UPDATE без использования IGNORE в синтаксисе. Тогда, если данные нарушат целостность primary/unique ключа, будет выброшено исключение, которое я и предлагал отловить через catch. Иными словами, если исполнится код блока catch на это исключение - это как раз тот случай, когда произошло нарушение целостности ключа, то есть, во-первых, Вы узнали, что строка не была обновлена, а, во-вторых, сделали это без использования предварительного SELECT.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 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