php - 您如何验证用户尝试注册的电子邮件尚未被使用? [PHP 和 MySQL]

标签 php html mysql web

我正在借助教程制作一个基本的注册系统;该教程没有说明如何制作它以验证用户尝试注册的电子邮件是否已被占用,但它会针对用户名进行验证。我该怎么做才能验证用户名和电子邮件都是免费的并且不在数据库中?是的,我确实正确输入了我的数据库详细信息,只是为了这篇文章删除了它们。 (顺便说一下,这是一个 register.php 文件,该网站在输入详细信息并在另一个网页中按回车键后会转到该文件。)

<?php
$DATABASE_HOST = '';
$DATABASE_USER = '';
$DATABASE_PASS = '';
$DATABASE_NAME = '';

$con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);
if (mysqli_connect_errno()) {

    die ('Failed to connect to MySQL: ' . mysqli_connect_error());
}

if ($stmt = $con->prepare('SELECT id, password FROM accounts WHERE username = ?')) {
    if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    die ('Email is not valid!');
    }
    if (preg_match('/[A-Za-z0-9]+/', $_POST['username']) == 0) {
    die ('Username is not valid!');
    }
    if (strlen($_POST['password']) > 20 || strlen($_POST['password']) < 5) {
    die ('Password must be between 5 and 20 characters long!');
    }

    $stmt->bind_param('s', $_POST['username']);
    $stmt->execute();
    $stmt->store_result();

    if ($stmt->num_rows > 0) {

        echo 'Username exists, please choose another!';
    } else {

if ($stmt = $con->prepare('INSERT INTO accounts (username, password, email) VALUES (?, ?, ?)')) {

    $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
    $stmt->bind_param('sss', $_POST['username'], $password, $_POST['email']);
    $stmt->execute();
    echo 'You have successfully registered, you can now login!';
} else {

    echo 'Could not prepare statement!';
}
    }
    $stmt->close();
} else {

    echo 'Could not prepare statement!';
}
$con->close();
?>

最佳答案

按照检查用户名是否已被占用的方式进行操作。将查询更改为 select id, password, email from accounts where username = ?或 useremail = ?,确保将电子邮件添加到 bind_params 中,如果它已被占用,您将获得一行。

请注意,您无法判断用户名是否已被占用或电子邮件是否已被占用。如果您想能够分辨,您可以运行两个不同的查询,或者按如下方式比较结果。

只需获取 1 行(限制为 1),如果用户名或电子邮件地址存在,则通知用户。下面的代码应该可以工作。

$stmt = $con->prepare('select username, useremail from accounts where username = ? or useremail = ? limit 1');
$stmt->bind_param('ss', $_POST['username'], $_POST['useremail']);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($user_name, $user_email);
$stmt->fetch();
$stmt->close();

if ($user_name == $_POST['username']) {
   // Username is taken
} else if ($user_email == $_POST['useremail']) {
   // Email is taken
} else {
   // Email and username are both available
}

关于php - 您如何验证用户尝试注册的电子邮件尚未被使用? [PHP 和 MySQL],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59596817/

相关文章:

javascript - 使用 Ajax 和 jQuery 删除单个项目

php - 计算 1 列中的项目并将其分成两列

php - 如何在GAE中向网络浏览器显示php错误?

html - 使用 Bootstrap v4 验证 Nav-pills

html - Ionic 2 导航栏标题和左右按钮问题

html - 在中心水平对齐旋转木马控件?

mysql - 根据 2 行值删除重复项

MySQL 约束检查是否存在且处于事件状态

javascript - 您不能将对象添加到表中

mysql - 如何在 MySQL 中删除重复记录?