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
Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009
Помог: 14 раз(а)
Всех приветствую! Сделал маленькую функцию, в которую передается два параметра: подготовленная строка запроса и массив данных. Функция автоматом определяет (по строке запроса) какое действие необходимо выполнить и возвращает результат. В частности, для "UPDATE" - возвращает true или false, в зависимости от успеха операции. Теперь к проблемке: Если использовать конструкцию запроса "UPDATE IGNORE ...", и обновлять запись с уникальным полем в БД, то в случае дублирования данный, мы получим ответом "0" и в случае, если пользователь ничего не изменил в данных - тоже "0" затронутых строк.
Сижу и чешу затылок, как бы разграничить эти результаты и выводить юзверю соответствующее сообщение: или "Такое имя уже используется", или ... ну, тут можно не выводить сообщение, т.к. ошибки не было, а просто данные остались такими же, как до попытки их обновить.
Повторюсь, что использую PDO и кроме того, данные отправляются AJAX-запросом, что не допускает попадания в ответ ошибки сгенерированной на сервере, какой она могла бы быть, если использовать запрос без "IGNORE".
Если кто сталкивался с подобным, прошу натолкнуть на мысль в правильном направлении.
EuGen
Отправлено: 29 Июля, 2013 - 16:51:45
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Deonis
C точки зрения БД возвращается число затронутых строк (в терминах PDO это PDOStatement::rowCount ), то есть при помощи этого числа случаи разграничить нельзя. Однако Вы можете сделать SELECT до запроса UPDATE и проверить, уникальны ли данные, и, если нет, возвращать соответствующий статус (-1, например) клиенту.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Deonis
Отправлено: 29 Июля, 2013 - 16:56:38
Посетитель
Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009
Помог: 14 раз(а)
EuGen пишет:
SELECT до запроса UPDATE
Это дело понятное, только хотелось избежать лишних телодвижений в сторону БД. Но если других вариантов нет, то естественно, что придется.
EuGen
Отправлено: 29 Июля, 2013 - 17:04:41
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Deonis пишет:
Повторюсь, что использую PDO и кроме того, данные отправляются AJAX-запросом, что не допускает попадания в ответ ошибки сгенерированной на сервере, какой она могла бы быть, если использовать запрос без "IGNORE".
Можете использовать try..catch, чтобы отловить такой случай (и использовать UPDATE без IGNORE) - выбор за Вами.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Deonis
Отправлено: 29 Июля, 2013 - 17:12:54
Посетитель
Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009
Помог: 14 раз(а)
EuGen пишет:
Можете использовать try..catch
Безусловно использую, только в исключения это не попадает, т.к. не считается ошибкой выполнения, а без IGNORE ошибка выстраивается в ответ ajax-запроса и выводит из строя всю дальнейшую работу сайта. Да Бог с ним, я так подумал, что одним запросом больше - на скорость работы не повлияет, к тому же запрос простейший и по уникальным полям. А то "программистская паранойя" иногда берет верх над здравым смыслом
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Deonis пишет:
Безусловно использую, только в исключения это не попадает, т.к. не считается ошибкой выполнения
О чем речь? Мне кажется Вы не совсем владеете данной стороной вопроса. try ... catch вы пишете сами, локальный, именно для этой ситуации.
По сути работать оно будет как if ... else.
Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009
Помог: 14 раз(а)
DeepVarvar пишет:
О чем речь?
Речь видимо в том, что вы не внимательно читали. Запрос, с использованием ключевого слова "IGNORE", не вызовет никаких исключений, ошибок и т.д., потому как строки, имеющие дублирующиеся ключи PRIMARY или UNIQUE в этой таблице, будут попросту проигнорированы, при этом не будет прекращено выполнение.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Deonis
Вероятно, Вы не до конца поняли мой комментарий. Я предложил использовать UPDATE без использования IGNORE в синтаксисе. Тогда, если данные нарушат целостность primary/unique ключа, будет выброшено исключение, которое я и предлагал отловить через catch. Иными словами, если исполнится код блока catch на это исключение - это как раз тот случай, когда произошло нарушение целостности ключа, то есть, во-первых, Вы узнали, что строка не была обновлена, а, во-вторых, сделали это без использования предварительного SELECT.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.