我的个人资料页面,更新详细信息 PHP MYSQL,验证唯一性逻辑

My Profile page, UPDATE details PHP MYSQL, verify uniqueness logic

我有一个 html 表单,其中用户名和电子邮件字段在注册时应该是唯一的。我已经成功创建了这个注册页面,它验证了用户名和电子邮件的唯一性,它检查了密码强度等。

然后我制作了一个我的个人资料页面,只有在登录后才能访问,我应该让用户更新他们的详细信息,甚至是电子邮件和用户名。我最初是通过读取用户数据来填写这个表格的,就像这样

<input type="text" name="username" value="<?php echo $user_data['username']?>"/> 

a.s.o

用于注册的规则显然也应该与更新帐户详细信息一致。因此,我使用相同的代码来检查这些字段。不过我 运行 遇到了问题。

假设我们有用户名 Billy 和 Billy2。 Billy 无法更新到 Billy2,因为 Billy2 已经存在。完美的。 但是 Billy 无法更新为 Billy,因为 Billy 已经存在了。

评论的 if 是我解决问题的尝试,虽然这允许我将 Billy 保留为 Billy,但它也降低了唯一性,它让我将 Billy 更新为 Billy2,这并不酷,因为现在有两个 Billy2。

所以这是 myprofile.php

的完整代码

你会如何解决这个问题?

    <?php 
include 'core/init.php';
protect_page();

if (empty($_POST) === false) {

    $required_fields = array('username', 'password', 'password_again', 'first_name', 'last_name' 'email');
            foreach($_POST AS $key=>$value) {
        if (empty($value) && in_array($key, $required_fields) === true) {
            $errors[] = 'Fields marked with an asterisk are required.';
            break 1;
        }
    }

    if (empty($errors) === true) {

        if (strlen($_POST['password']) < 6) {
                $errors[] = 'Your password must be at least 6 characters long.';
            } elseif (($_POST['password']) !== ($_POST['password_again'])) {
                $errors[] = "Sorry, new password doesn't match. Please try again.";
            } 
            if ($_POST['password'] !== $_POST['password_again']) {
                $errors[] = 'Passwords don\'t match.';
            }

        // if ($user_data['username'] !== $_POST['username'] && $user_data['email'] !== $_POST['email']) {
            if (user_exists($_POST['username']) === true) {
                $errors[] = 'Sorry, the username \'' . $_POST['username'] . '\' is already taken.';
            }
            if (preg_match("/\s/", $_POST['username']) === true) {
                $errors[] = 'Your username must not contain any spaces.';
            }

            if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) {
                $errors[] = 'A valid email address must be provided.';
            }
            if (email_exists($_POST['email']) === true){
                $errors[] = 'Sorry, the email address \'' . $_POST['email'] . '\' is already in use.';
            }
        }
    // }
}

// print_r($errors);

include'includes/overall/header.php'; 
?>
    <h1>My Profile</h1>
    <br>
    <p>Here you can change your account details or <br><a href="index.php">Cancel and return</a> to the Homepage.</p>

    <?php 
    if (isset($_GET['success']) && empty($_GET['success'])) {
        echo 'Your details have been succesfully updated.';
    } else {

                        if (empty($_POST) === false && empty($errors) === true) {
                            change_password($session_user_id, $_POST['password'], $_POST['username'], $_POST['first_name'], $_POST['last_name'], $_POST['email']);
                            Header('Location: changedetails.php?success');
                            } elseif (empty($errors) === false) {
                                echo output_errors($errors);
                            }
                        ?>

                    <form action="" method="post">
                        <ul>
                            <li>Username:*<br>
                                <input type="text" name="username" value="<?php echo $user_data['username']?>"/>
                            </li><br>
                            <li>First Name:*<br>
                                <input type="text" name="first_name" value="<?php echo $user_data['first_name']?>"/>
                            </li><br>
                            <li>Last Name:*<br>
                                <input type="text" name="last_name" value="<?php echo $user_data['last_name']?>"/>
                            </li><br>
                            <li>Email:*<br>
                                <input type="text" name="email" value="<?php echo $user_data['email']?>"/>
                            </li><br>

                            <br><h2>Change Password:</h2>

                            <li>
                                New Password*:<br>
                                <input type="password" name="password" />
                            </li>
                            <li>
                                Confirm New Password*:<br>
                                <input type="password" name="password_again" />
                            </li>
                            <li>
                                <input type="submit" value="Update Profile">
                            </li>
                        </ul>
                        <a href="index.php">Cancel</a>
                    <?php 
            }
include'includes/overall/footer.php';
?>

首先:不要让用户将关键字段修改为用户名或密码...如果您的数据库增长并且其他 table 与用户 [=14] 有关系,您将遇到很多问题=] 通过用户名或电子邮件等关键字段。 现在让我们面对 problem.you 应该一起检查电子邮件和用户名的唯一性,而不是单独检查它们中的每一个。所以 'user_exists' 函数应该得到两个参数,用户名和电子邮件,并检查是否存在具有给定电子邮件和密码的行。

usernameemail 的每组检查都包装成是否已更改的测试,而不是将所有检查包装在一个测试中是否已更改。

if ($user_data['username'] !== $_POST['username'] {
    if (user_exists($_POST['username']) {
        $errors[] = 'Sorry, the username \'' . $_POST['username'] . '\' is already taken.';
    }
    if (preg_match("/\s/", $_POST['username']) === true) {
        $errors[] = 'Your username must not contain any spaces.';
    }
}
if ($user_data['email'] != $_POST['email']) {
    if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) {
        $errors[] = 'A valid email address must be provided.';
    }
    if (email_exists($_POST['email']) === true){
        $errors[] = 'Sorry, the email address \'' . $_POST['email'] . '\' is already in use.';
    }
}