【问题标题】:check if profile data exists on profile update检查配置文件更新时是否存在配置文件数据
【发布时间】:2016-04-18 16:07:53
【问题描述】:

我有一个个人资料页面,用于编辑的功能和用于编辑的检查功能。

个人资料页面:

if (isset($_POST['edit']) && $_POST['edit'] === 'Edit') {

    $errorMsgs = $user->validateUpdate($_POST);
    if (empty($errorMsgs)) {
    $id = $_POST['id'];
        $username = $_POST['username'];
        $email = $_POST['email'];
    $user->updateProfile($username,$email,$id);
    echo 'edited';
    exit;
    }
    foreach ($errorMsgs as $msg) {
        echo '<li>'. $msg. '</li>';
    }
}


      while ($row = mysqli_fetch_assoc($result)) {
    ?>  
<form action="<?php $_SERVER['PHP_SELF'];?>" method="POST">
<input type="hidden" name="id" value="<?php echo $row['id']; ?>" />
Username<br>
<input type="text" name="username" value="<?php echo $row['username']; ?>" /><br>
Email<br>
<input type="text" name="email" value="<?php echo $row['email']; ?>" /><br>
<input name="edit" type="submit" value="Edit"/>
</form>
 <?php }
        ?>

更新功能:

 function updateProfile($username,$email,$id){
        $con = new Core();
        $con->connect();
        $username = trim(strtolower($username));
        $username = str_replace(' ', '', $username);
        $sql = 'UPDATE users SET username = ?, email = ? where id = ?';
        if ($stmt = $con->myconn->prepare($sql))
        {
            $stmt->bind_param('ssi', $username, $email, $id);
            $stmt->execute();
            $stmt->close();
        }
        else{
            die("errormessage: " . $con->myconn->error);
        }

    }

检查功能:

function validateUpdate(array $userDetails)
    {
        $con = new Core();
        $con->connect();
        $errmsg_arr = array();
        foreach($userDetails as $key => $value) {
            if (empty($value)) {
                $errmsg_arr[] = ucwords($key) . " field is required";
            }
        }

        if (!empty($userDetails['edit'])) {
            if (!empty($userDetails['email']) && !filter_var($userDetails['email'], FILTER_VALIDATE_EMAIL)) {
                $errmsg_arr[] = "the provided email is not a valid email address";
            }

            $sqlu = "SELECT username FROM users WHERE username = ?";
            if($stmt = $con->myconn->prepare($sqlu)){
                $stmt->bind_param('s', $_POST['username']);
                $stmt->execute();

            }
            if($stmt->fetch() > 0){
                $errmsg_arr[] = "Username already exists!";
                $stmt->close();
            }

            $sqle = "SELECT email FROM users WHERE email = ?";
            if($stmt = $con->myconn->prepare($sqle)){
                $stmt->bind_param('s', $_POST['email']);
                $stmt->execute();
            }
            if($stmt->fetch() > 0){
                $errmsg_arr[] = "Email already exists!";
                $stmt->close();
            }
        }
        return $errmsg_arr;
    }

一切都很完美。但是这个检查有一个缺陷。

有人转到他们的个人资料。 该人尝试编辑详细信息,全部编辑:代码回显的“成功编辑”。

但如果此人仅尝试编辑电子邮件而不是所有详细信息,则会收到“用户名值”已存在的错误消息。

现在我的问题是:如果未编辑用户名值,我如何让它不检查它?还是电子邮件价值?

提前致谢!

【问题讨论】:

    标签: php mysqli pdo


    【解决方案1】:

    您将从查询中排除已登录的用户。在进行登录时,您会将用户 ID 保存在会话变量中。您可以使用此变量来防止查询检查用户本身

    $sqlu = "SELECT username FROM users WHERE username = ? AND id != '".$_SESSION['user_id']."'";
    $sqle = "SELECT email FROM users WHERE email = ? AND id != '".$_SESSION['user_id']."'";
    

    这应该可以解决您的问题! More info on session variables

    【讨论】:

    • 这有帮助!我完全没有这样想。谢谢!
    • 没问题^^很高兴我能帮上忙!祝您项目的其余部分好运,如果遇到其他问题,我很乐意提供帮助。附言我刚刚注意到您可能也应该使用准备好的语句添加这些会话变量(而不是像我在这里所做的那样连接它),但我假设您已经正确实现了它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2010-11-23
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多