Регистрация PHP: проверка электронной почты существует

php

58 просмотра

3 ответа

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

Когда кто - то подпишется я , очевидно , попросить их заполнить Name, E-Mail, Password, и Confirm Password.

Я проверяю, есть ли E-Mail в базе данных, используя следующий код:

$query = $conn->prepare("SELECT email FROM users WHERE email ='" . $_POST['email'] . "'");
$query->execute();

if ( $query->rowCount() > 0 ) {
    $error = true;
    $email_again = "E-Mail already exists";
}

Моя проблема:

Хорошо, скажем, в тот момент, когда кто-то входит в E-Mail, который уже находится в базе данных, страница обновляется и показывает им ошибку.

Теперь база данных не добавляет ее в таблицу, но она делает увеличение идентификатора на единицу, поэтому в следующий раз, когда кто-то зарегистрируется с действительным адресом электронной почты, а не с идентификатором 2, это будет 3, потому что кто-то пытался зарегистрироваться с помощью электронная почта уже там

$query = $conn->prepare("SELECT email FROM users WHERE email ='" . $_POST['email'] . "'");
$query->execute();

if ( $query->rowCount() > 0 ) {
    $error = true;
    $email_again = "E-Mail already exists";
    exit();
}

Поэтому я продолжил и добавил exit();к ifзаявлению, но затем он просто отображает пустую страницу после отправки, если E-Mail уже находится в базе данных.

Как я могу решить это?

Обновление :

Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'me@stephenhinett.co.uk' for key 'email' in /Applications/MAMP/htdocs/tasks/register.php:69 Stack trace: #0 /Applications/MAMP/htdocs/tasks/register.php(69): PDO->exec('INSERT INTO use...') #1 {main} thrown in /Applications/MAMP/htdocs/tasks/register.php on line 69

Строка 69:

$sql_insert = "INSERT INTO users(name, email, password)
        VALUES ('" . $name . "', '" . $email . "', '" . md5($password) . "')";
$conn->exec($sql_insert);
Автор: Stephen Источник Размещён: 08.11.2019 11:13

Ответы (3)


2 плюса

Решение

Проблема 1

if ( $query->rowCount() > 0 ) {
    $error = true;
    $email_again = "E-Mail already exists";
    exit();
}

Поэтому я пошел дальше и добавил выход (); в оператор if, но затем он просто отображает пустую страницу после отправки, если электронная почта уже есть в базе данных.

Ваша проблема в то время как вы добавили, exitвы не добавили, headerчтобы сказать браузеру, что выводить, если что-нибудь. А exitбез вывода всегда будет белый экран тупости. Exitна этом этапе сценарий прекращается, и поэтому он часто не очень удобен для пользователя в изоляции.

Итак, добавьте заголовок перед выходом, чтобы ваша страница могла правильно перенаправить пользователя. Я также добавил $_SESSIONпеременную, содержащую сообщение, которое вы хотите передать своему пользователю (о дублировании электронной почты):

session_start(); //if not already started at the top of the page
if ( $query->rowCount() > 0 ) {
        $error = true;
        $_SESSION['message'] = "E-Mail already exists.";
        header("Location: somepage.php"); //will display session message
        exit();
    }

И на странице, на которую вы переходите, установите систему для проверки значений sessio для сообщения и вывода сообщения в окно браузера.

Проблема 2

Прочтите сообщение об ошибке: вы пытаетесь продублировать индекс unqiue key ( email) в таблице базы данных, дублированная электронная почта все еще (пытается) INSERTредактироваться какой-либо функцией сценария.

Вы не показывали нам эту функцию скрипта (в строке register.php 69), поэтому я не могу рассказать больше о деталях этого, но вам может быть интересно использовать синтаксис On Dupliate Key Update, чтобы помочь вам преодолеть это.

Примечание (я):

  • Если вы уже используете объектно-ориентированную нотацию для своего SQL, почему вы не используете подготовленные операторы ? Это гораздо более безопасный, а также более эффективный способ проверки того, что электронная почта уже существует в таблице базы данных.

  • Я не понимаю, почему вы хотите увеличить идентификатор строки при попытке дублирования электронной почты, зачем увеличивать idполе? Если значение идентификатора - ваш первичный ключ (PK) и MySQL, auto_incrementто вручную увеличивать это очень плохая практика, и вы будете вызывать все виды связанных проблем. Лучше иметь другой столбец таблицы, например, repetation_attemptsкоторый является стандартным tinyint(3)(или smallint(6)каким- либо другим ) столбцом (по умолчанию ноль), который затем будет обновляться для отслеживания того, сколько попыток дублирования было предпринято в любой строке электронной почты.

    • Идентификатор столбец представляет собой идентификатор entification столбец и не должен быть использован в качестве счетчика .
Автор: Martin Размещён: 20.08.2016 11:54

0 плюса

по соображениям безопасности я рекомендую вам использовать подготовленные заявления. Я не эксперт MySQL, но я думаю, что это ситуация ...

Индекс автоинкремента будет увеличиваться также при неудачных операторах вставки по причинам одновременности:

  1. Запрос A выполняет оператор INSERT, а БД резервирует индекс
  2. Запрос B выполняет оператор INSERT, а БД резервирует индекс
  3. Запрос A терпит неудачу, но "B" завершает свое утверждение, и это одновременно
  4. Чтобы гарантировать последовательность, индекс A будет просто потрачен впустую

Как вы сказали, вы можете проверить вручную, если E-Mail уже существует. Псевдокод:

if(mail_already_exists()){
    show_error();
}else{
    insert_data();
}
Автор: Misterioso Размещён: 20.08.2016 12:07

0 плюса

база данных не добавляет его в таблицу, но она делает увеличение идентификатора на единицу, поэтому в следующий раз, когда кто-то зарегистрируется с действительным адресом электронной почты, а не с идентификатором 2, это будет 3, потому что кто-то пытался зарегистрироваться с помощью E-Mail уже там

Я не вижу причин, по которым ID будет увеличиваться, если вы на самом деле не вставляете данные. Используйте функцию для проверки дубликатов записей.

  1. Проверьте, существует ли EMAIL. Если существует, вернуть TRUE, иначе FALSE
  2. Если TRUE (электронная почта существует), отправьте сообщение пользователю
  3. если ЛОЖЬ, сделайте INSERT.
Автор: Partha Mitra Размещён: 20.08.2016 12:42
Вопросы из категории :
32x32