Проверка уникальности записи, как это работает?

Здравствуйте, объясните пожалуйста, как работает уникальность записи БД, а вернее её проверка?

Я хочу чтобы при совпадении определённой записи в БД, он выводил ошибку. Для этого, я для столбца поставил Индекс. Но пока к сожалению работает один вариант, слишком криво. А второй вообще не работает.

1-й вариант:
$stmt = $dbh->prepare("INSERT INTO users (name, lastname, email, password) VALUES (:name, :lastname, :email, :pass)");
        $stmt->bindParam(':name', $name_t);
        $stmt->bindParam(':lastname', $lastname_t);
        $stmt->bindParam(':email', $email);
        $stmt->bindParam(':pass', $hashed_password);
        $falg = $stmt->execute();

        if ($falg) {
            header ("Location: index.html");
            die;
        } else {
            echo "Данная электронная почта уже используется. ";?><a href="enter.php" style="color: red">Войдите</a> <?php echo "по этой почте или используйте другую";
            die;
        }

Здесь криво работает, выдаёт ошибку, если я не ошибаюсь "00000", и я её сразу же считаю её совпадением записи, и указываю, что такая запись есть. Но это происходит после перезагрузки страницы, с обычным текстом вверху страницы и всё. Что криво.

2-й вариант:
$stmt = $dbh->prepare("INSERT INTO users (name, lastname, email, password) VALUES (:name, :lastname, :email, :pass)");
        $stmt->bindParam(':name', $name_t);
        $stmt->bindParam(':lastname', $lastname_t);
        $stmt->bindParam(':email', $email);
        $stmt->bindParam(':pass', $hashed_password);

        $stmt->execute();

        if ($stmt->fetch(PDO::FETCH_NUM)) {
            echo "Данная электронная почта уже используется. ";?><a href="enter.php" style="color: red">Войдите</a> <?php echo "по этой почте или используйте другую";
        }else{
            echo "Успешно";
        }


Который к сожалению не работает. Тут я думал, отлавливать такую запись в БД, и указывать что она есть. Или же выводить успешно.

Такой вариант у меня работает на другой странице, и он в этой же форме выводит запись, что всё хорошо или плохо. Что-то типа такого:
if ( !empty($pwd) && !empty($email) ) {
                        $stmt = $dbh->prepare('SELECT email, password FROM users WHERE email = :email');
                        $stmt->bindParam(':email', $email);
                        $stmt->execute();
                
                        $user_p = $stmt->fetch(PDO::FETCH_OBJ);
                
                        if ($user_p){
                            if(password_verify($pwd, $user_p->password)){
                                echo "Успешно";
                            }else{
                                echo '<p class="wrong">Неверный Email или пароль</p>';
                            }
                        }else{
                            echo '<p class="wrong">Неверный Email или пароль</p>';
                        }
                    }else{
                        echo '<p class="noValues">Пожалуйста, заполните все поля</p>';
                    }


Но тут к сожалению не работает. Подскажите пожалуйста в каком направлении двигаться?
  • Вопрос задан
  • 328 просмотров
Пригласить эксперта
Ответы на вопрос 1
@granty
Я хочу чтобы при совпадении определённой записи в БД, он выводил ошибку. Для этого, я для столбца поставил Индекс.
Поле email в БД должно быть UNIQUE INDEX, тогда при вставке дубля MySQL будет кидать ошибку, которую можно обрабатывать.
Или можно использовать конструкцию INSERT IGNORE ... ON DUPLICATE KEY, например, чтобы вернуть ID записи с этим email.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы