Мне интересно, есть ли простой способ проверить, вызывает ли оператор INSERT конфликт из-за уникального индекса в поле MySQL при выполнении INSERT.
Например, предположим, что я добавляю пользователя в базу данных, а username
— это уникальный индекс:
$sql = new MySQLi(...);
$res = $sql->query('INSERT INTO `users` (`username`) VALUES ("john_galt");');
Пользователь с именем john_galt
уже существует, поэтому INSERT выполняться не будет. Но как я могу лучше всего ответить пользователю со значимой ошибкой (т. е. пользователь с таким именем пользователя уже существует; пожалуйста, выберите уникальное имя)?
Я подумал о нескольких вещах, например, проверить, установлен ли insert_id
, чего не должно быть, если запрос генерирует ошибку. Но эта ошибка может быть что угодно.
Точно так же я мог бы проверить, не является ли $sql->error
пустым, за исключением, опять же, того, что это может быть что угодно — синтаксическая ошибка, неверно отформатированное значение или что-то еще. Очевидно, я не собираюсь распечатывать фактическую ошибку MySQL для конечного пользователя.
Я могу придумать два решения:
- Перед запуском INSERT запустите
SELECT TRUE FROM ``users`` WHERE ``username`` = "john_galt";
, чтобы увидеть, существует ли уже имя пользователя в базе данных, но я чувствую, что добавил уникальное ограничение в поле, чтобы мне не пришлось этого делать - в противном случае цель побеждает. strpos($sql->error, 'Duplicate entry') === 0
-- кажется ужасно хакерским.
Есть ли лучший способ определить это с помощью класса PHP MySQLi?
INSERT
. Экономит больше времени, чем выполнение ожидаемого отказа. :) - person jhnferraris   schedule 10.08.2014