Duplicate entry '[email protected]' for key 'users_i.mail' в чём дело?
Форма для регистрации, в БД поле имя и е-майл задал как уникальные. Уходит с ошибкой Duplicate entry '[email protected]' for key 'users_i.mail'. Как обойти это сообщение и показать юзеру, что такая запись уже есть в БД?
<form action="" method="POST" class="register-form" id="register-form">
<div class="form-group">
<label for="name"><i class="zmdi zmdi-account material-icons-name"></i></label>
<input type="username" name="full_name" id="name" pattern="[A-Za-z-0-9]{5,15}" title="Только латинские буквы. Длина строки ниже 5 или свыше 15 символов" placeholder="Логин от 5 до 15 символов" required <?php if (!empty($_POST['full_name'])) {
echo "value=\"" . $_POST["full_name"] . "\"";
} ?> />
</div>
<div class="form-group">
<label for="email"><i class="zmdi zmdi-email"></i></label>
<input type="email" name="email" id="email" placeholder="Ваша почта" required <?php if (!empty($_POST['email'])) {
echo "value=\"" . $_POST["email"] . "\"";
} ?> />
</div>
<div class="form-group">
<label for="pass"><i class="zmdi zmdi-lock"></i></label>
<input type="password" name="pass" id="pass" placeholder="Пароль" required <?php if (!empty($_POST['pass'])) {
echo "value=\"" . $_POST["pass"] . "\"";
} ?> />
</div>
<div class="form-group">
<label for="re-pass"><i class="zmdi zmdi-lock-outline"></i></label>
<input type="password" name="re_pass" id="re_pass" placeholder="Повторите пароль" required <?php if (!empty($_POST['re_pass'])) {
echo "value=\"" . $_POST["re_pass"] . "\"";
} ?> />
</div>
<div class="form-group">
<label for="number"><i class="zmdi zmdi-phone"></i></label>
<input type="number" name="phone" id="phone" placeholder="Телефон №" required <?php if (!empty($_POST['phone'])) {
echo "value=\"" . $_POST["phone"] . "\"";
} ?> />
</div>
<div class="form-group">
<input type="checkbox" name="agree-term" id="agree-term" class="agree-term" value="yes" />
<!-- <label for="agree-term" class="label-agree-term"><span><span></span></span>Я, принимаю все условия <a href="blocks/terms.php">
<p>Условие и обслуживание</p>
</a></label>-->
</div>
<div class="form-group form-button">
<input type="submit" name="signup" id="signup" class="form-submit" value="Регистрация" />
</div>
</form>
файл для БД
<?php
// VAR input
$name = $_POST['full_name'];
$em = $_POST['email'];
$pas = $_POST['pass'];
$re_pass = $_POST['re_pass'];
$phon = $_POST['phone'];
$s = 0;
//if ($pas == '' || $name == '' || $em == '' ||$phon == 0) {
//echo ("<script language='JavaScript'>alert('Ошибка, поля пустые!');</script>");
//} else {
$pas = password_hash($pas, PASSWORD_DEFAULT);
//$pas = md5($pas + $salt);
// Create connection
require_once("blocks/testmysql.php");
// insert informations
//echo ("<script language='JavaScript'>alert($phon);</script>");
$sql = "INSERT INTO users_i (log_name, email, pass, date_1, telefon, summa_t, dt, kt) VALUES ('$name', '$em', '$pas', NOW(), '+$phon', '$s', '$s', '$s')";
$result = mysqli_query($conn, $sql) or die(mysqli_error($conn));
//}
?>
Ответы (2 шт):
Есть два варианта.
Первый, интуитивный:
- select из бд пользователя по уникальному имейлу
- если пользователь нашёлся, сообщить об ошибке: имейл занят
- иначе insert в бд нового
Тут ошибка Duplicate entry всё ещё может возникнуть, если кто-то попробует зарегистрироваться с таким имейлом одновременно с первым пользователем. В обычном случае это очень редкое явление и можно на это забить.
Второй, более строгий:
- insert в бд
- поймать исключение
- если это Duplicate entry, сообщить об ошибке: имейл занят
Решил задачу с первым вариантом предложенный Егор Банинном. Проверку сделал с помощью запроса в БД, конечно это будет не таким уж хорошим вариантом, если учесть частое обращение в БД.
// Проверка логина и е-майл адреса клиента
$row1 = mysqli_query($conn, "SELECT * FROM `users_i` WHERE `email`='$em'") or die(mysqli_error($conn));
$row2 = mysqli_query($conn, "SELECT * FROM `users_i` WHERE `log_name`='$name'") or die(mysqli_error($conn));
$row1 = mysqli_fetch_array($row1);
$row1 = $row1['email'] ?? null;
$row2 = mysqli_fetch_array($row2);
$row2 = $row2['log_name'] ?? null;
if (strcmp($row2, $name) == 0) {
echo ("<script language='JavaScript'>alert('логин существуют!');</script>");
}
elseif (strcmp($row1, $em) == 0) {
echo ("<script language='JavaScript'>alert('е-майл существуют!');</script>");
} else {
Вот кусок кода.