отловить в php duplicate key

12
A9
На сайте с 19.03.2018
Offline
74
288

Меня интересует модель кода вида:

if(!mysqli_query($db,'insert into table set id=82,md5=asdf32423f23fqf3fa')){echo 'ошибка';die();}

Но при duplicate key в базе, код продолжает выполняться дальше, в php условие не нарушается. Как заставить mysqli_query возвращать false при on duplicate?

insert ignore мне не подойдет, так как в этом случае сохраняется файл, который не попадает в базу, а я получаю неверный ответ от скрипта, что запись в базу завершена успешно

LEOnidUKG
На сайте с 25.11.2006
Offline
1734
#1
Но при duplicate key в базе, код продолжает выполняться дальше, в php условие не нарушается. Как заставить mysqli_query возвращать false при on duplicate?

Погуглю за вас: https://stackoverflow.com/questions/3146838/how-to-handle-error-for-duplicate-entries

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
S3
На сайте с 29.03.2012
Offline
306
#2
С каких это пор пхп разучился обрабатывать исключения?
A9
На сайте с 19.03.2018
Offline
74
#3

Почитал. Там предлагают проверять условие mysql_errno() == 1062. 

С одной стороны, все понятно. Но с другой, откуда берется код ошибки? Я так понял, он берется просто из журнала ошибок. И откуда тогда база знает, что mysql_errno() относится именно к этому запросу?

А еще, в теории, то что я делаю, модет происходить независимо в несколько потоков. То есть, ошибка в одном потоке, а покажет ее во втором.

P.S. так и есть. Берет код последней ошибки. Не подойдет ваше "погуглю за вас"

A9
На сайте с 19.03.2018
Offline
74
#4
Sly32 #:
С каких это пор пхп разучился обрабатывать исключения?

Там ошибка duplicate key, но все равно mysqli_query возвращает true, поэтому и создана тема. Иначе бы и не спрашивал.

Пока беспроигрышный вариант для меня, проверять дубликаты перед записью.

S3
На сайте с 29.03.2012
Offline
306
#5
aramid92 #:

Там ошибка duplicate key, но все равно mysqli_query возвращает true, поэтому и создана тема. Иначе бы и не спрашивал.

Пока беспроигрышный вариант для меня, проверять дубликаты перед записью.

Почитай немного теорию, как работает запрос и что он возвращает и как хэндлится. Никаких true тебе не может возвращаться, если все сделано правильно. Тебе приходит респонс, если доступна база а в ответе будет код ошибки. Если конечно он наглухо не залочен обработкой исключений

[23505] ERROR: duplicate key value violates unique constraint "city_city_key" Detail: Key (city)=(Minsk) already exists.

Вот так ответит тебе примерно база, а ты уже это обрабатываешь в коде.

Проверять дубликаты - двойная работа

E
На сайте с 01.10.2017
Offline
97
#6
aramid92 #:
Почитал. Там предлагают проверять условие mysql_errno() == 1062.

Да, есть такая методика. Но обычно используют более простую: IGNORE и сравнение количества вставляемых записей и вставленных.


aramid92 #:
Там ошибка duplicate key, но все равно mysqli_query возвращает true, поэтому и создана тема.
А вот это странно. В тексте показанного запроса даже синтаксические ошибки присутствуют.
Домены на продажу: https://p20.ru/collection/domains-for-sale
A9
На сайте с 19.03.2018
Offline
74
#7


А вот это странно. В тексте показанного запроса даже синтаксические ошибки присутствуют.

Ошибка тут на форуме есть, потому что опечатался в сообщении, а в скрипте запрос другой и без ошибки.

Успешно решил вопрос проверкой дубликата перед записью. Я сразу об этом подумал, просто не хотел удваивать запросы к базе. Errno тоже делает запрос и не подходит, так как статус может быть связан с другим запросом, нет соответствия

S3
На сайте с 29.03.2012
Offline
306
#8
aramid92 #:

Ошибка тут на форуме есть, потому что опечатался в сообщении, а в скрипте запрос другой и без ошибки.

Успешно решил вопрос проверкой дубликата перед записью. Я сразу об этом подумал, просто не хотел удваивать запросы к базе. Errno тоже делает запрос и не подходит, так как статус может быть связан с другим запросом, нет соответствия

Это странно и не должно так быть. Но в любом случае ты можешь проверять что то типа mysdli_num_rows после запроса. При дупликате тебе вернется 0

E
На сайте с 01.10.2017
Offline
97
#9
aramid92 #:
Успешно решил вопрос проверкой дубликата перед записью.

Это ошибочное решение.

Хотя бы выполняйте сопутствующее действие (операцию над файлом) в зависимости от результата INSERT, а не SELECT.

W1
На сайте с 22.01.2021
Offline
296
#10
Я так и не понял, почему mysqli_query не возвращает false.
Мой форум - https://webinfo.guru –Там я всегда на связи
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий