Я искал Google, но не имел большой удачи в этом, поэтому, возможно, SO может помочь. Я разрабатываю систему аутентификации пользователей для нескольких проектов и должен убедиться, что адрес электронной почты, который также является именем пользователя, уникален.
Я установил поле как уникальное в запросе MySQL, но мне нужен способ отменить запрос SQL и уведомить пользователя о том, что «указанное письмо уже используется», если входящее письмо соответствует существующей записи.
Я мог бы сделать запрос выбора перед вставкой, но мне интересно, есть ли способ написать SQL-запрос, чтобы была выполнена вставка, ЕСЛИ НЕ СУЩЕСТВУЕТ СУЩЕСТВУЮЩИЙ email@example.com В электронной почте или что-то в этом роде.
Тогда, если вставка не будет выполнена, мне нужно знать, и мне нужно уметь отличать ее от другой ошибки.
Это возможно? Как?
Если вы используете PDO, вы можете просто поймать исключение и проверить код состояния, например
// make sure you're set to throw exceptions $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('INSERT INTO `user` (`email`) VALUES (?)'); try { $stmt->execute([$email]); } catch (PDOException $e) { $errorInfo = $stmt->errorInfo(); // apparently PDOException#getCode() is pretty useless if ($errorInfo[1] == 1586) { // inform user, throw a different exception, etc } else { throw $e; // a different error, let this exception carry on } }
См. http://dev.mysql.com/doc/refman/5.5/ru/error-messages-server.html#error_er_dup_entry_with_key_name
Процесс будет схожим при использовании MySQLi
$stmt = $mysqli->prepare('INSERT INTO `user` (`email`) VALUES (?)'); $stmt->bind_param('s', $email); if (!$stmt->execute()) { if ($stmt->errno == 1586) { // inform user, throw a different exception, etc } else { throw new Exception($stmt->error, $stmt->errno); } }