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 :: Версия для печати :: Результат выполнения UPDATE IGNORE с использованием PDO
Форумы портала PHP.SU » » Работа с СУБД » Результат выполнения UPDATE IGNORE с использованием PDO

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

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

Это дело понятное, только хотелось избежать лишних телодвижений в сторону БД. Но если других вариантов нет, то естественно, что придется.
4. EuGen - 29 Июля, 2013 - 17:04:41 - перейти к сообщению
Deonis пишет:
Повторюсь, что использую PDO и кроме того, данные отправляются AJAX-запросом, что не допускает попадания в ответ ошибки сгенерированной на сервере, какой она могла бы быть, если использовать запрос без "IGNORE".

Можете использовать try..catch, чтобы отловить такой случай (и использовать UPDATE без IGNORE) - выбор за Вами.
5. Deonis - 29 Июля, 2013 - 17:12:54 - перейти к сообщению
EuGen пишет:
Можете использовать try..catch

Безусловно использую, только в исключения это не попадает, т.к. не считается ошибкой выполнения, а без IGNORE ошибка выстраивается в ответ ajax-запроса и выводит из строя всю дальнейшую работу сайта. Да Бог с ним, я так подумал, что одним запросом больше - на скорость работы не повлияет, к тому же запрос простейший и по уникальным полям. А то "программистская паранойя" иногда берет верх над здравым смыслом Подмигивание
6. DeepVarvar - 29 Июля, 2013 - 21:00:35 - перейти к сообщению
Deonis пишет:
Безусловно использую, только в исключения это не попадает, т.к. не считается ошибкой выполнения
О чем речь? Мне кажется Вы не совсем владеете данной стороной вопроса.
try ... catch вы пишете сами, локальный, именно для этой ситуации.
По сути работать оно будет как if ... else.
7. Deonis - 29 Июля, 2013 - 22:48:30 - перейти к сообщению
DeepVarvar пишет:
О чем речь?

Речь видимо в том, что вы не внимательно читали. Запрос, с использованием ключевого слова "IGNORE", не вызовет никаких исключений, ошибок и т.д., потому как строки, имеющие дублирующиеся ключи PRIMARY или UNIQUE в этой таблице, будут попросту проигнорированы, при этом не будет прекращено выполнение.
8. EuGen - 29 Июля, 2013 - 23:07:23 - перейти к сообщению
Deonis
Вероятно, Вы не до конца поняли мой комментарий. Я предложил использовать UPDATE без использования IGNORE в синтаксисе. Тогда, если данные нарушат целостность primary/unique ключа, будет выброшено исключение, которое я и предлагал отловить через catch. Иными словами, если исполнится код блока catch на это исключение - это как раз тот случай, когда произошло нарушение целостности ключа, то есть, во-первых, Вы узнали, что строка не была обновлена, а, во-вторых, сделали это без использования предварительного SELECT.

 

Powered by ExBB FM 1.0 RC1