Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在更新数据之前进行密码确认_Php - Fatal编程技术网

Php 如何在更新数据之前进行密码确认

Php 如何在更新数据之前进行密码确认,php,Php,目标是创建配置文件设置页面,用户可以在其中更改其电子邮件地址,但在更新之前请他们输入密码 所以,我需要从数据库中获取密码,并将其与用户输入的密码进行比较,以及它们是否匹配更新电子邮件地址 但是,当我尝试实现逻辑时,我得到了一个空白页。代码工作到查询。当$passwordCheck=true和$resultCheck=0时,它将停止工作(请参见下面编辑的内容) 已编辑(2019.01.09):将工作重定向到标题('Location:../edituser.php?success=emailupda

目标是创建配置文件设置页面,用户可以在其中更改其电子邮件地址,但在更新之前请他们输入密码

所以,我需要从数据库中获取密码,并将其与用户输入的密码进行比较,以及它们是否匹配更新电子邮件地址

但是,当我尝试实现逻辑时,我得到了一个空白页。代码工作到查询。当$passwordCheck=true和$resultCheck=0时,它将停止工作(请参见下面编辑的内容)

已编辑(2019.01.09):将工作重定向到
标题('Location:../edituser.php?success=emailupdate')
。当输入新电子邮件、更正密码并单击提交按钮时,将显示changeemail.php(我的操作脚本)页面,而不是重定向到edituser.php,并显示成功消息。我认为有些东西坏了,脚本卡住了。另外,添加了完整的脚本

编辑(2019.01.10):我的问题是:如何在使用PHP更新数据之前实现密码确认。上面的描述显示了我如何尝试实现它。我正在寻找有关解决方案的信息、解决此问题的不同方法或代码方面的帮助。对不起,如果我没有澄清我的问题足够详细。我还在下面的图片中添加了配置文件设置

图1。配置文件设置页面

changemail.php脚本:

// Check for submit
if (isset($_POST['submit'])) {
    // Get form data
    $update_id = $_POST['update_id'];
    $email = test_input($_POST['email']);
    $confirm_password = test_input($_POST['confirm_password']);

    // Store post id in session
    session_start();
    $_SESSION['update_id'] = $update_id;

    // Check for empty field
    if (empty($email)) {
        header('Location: ../edituser.php?error=emptyemail');
        exit();
    } else if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { // Check email
        header('Location: ../edituser.php?error=invalidemail');
        exit();
    } else if (empty($confirm_password)) {
        header('Location: ../edituser.php?error=emptyconfirmpassword');
        exit();
    } else {
        // Check if email already exist
        $query = "SELECT email, password FROM users WHERE  email = ?";
        // Create prepared statement
        $stmt = mysqli_stmt_init($conn);

        if (!mysqli_stmt_prepare($stmt, $query)) {
            header('Location: ../edituser.php?error=sqlerror');
            exit();
        } else {
            mysqli_stmt_bind_param($stmt, 's', $email);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_store_result($stmt);
            mysqli_stmt_bind_result($stmt, $email, $password);
            $resultCheck = mysqli_stmt_num_rows($stmt);

            while (mysqli_stmt_fetch($stmt)) {
                // Check if passwords match
                $passwordCheck = password_verify($confirm_password, $password);

                if ($passwordCheck == false) {
                    header('Location: ../edituser.php?error=wrongconfirmpassword');
                    exit();
                } else if ($passwordCheck == true && $resultCheck > 0) {
                    header('Location: ../edituser.php?error=emailtaken');
                    exit();
                }
                // Update email
                $query = "UPDATE users SET email = ? WHERE id = ?";
                $stmt = mysqli_stmt_init($conn);

                if (!mysqli_stmt_prepare($stmt, $query)) {
                    header('Location: ../edituser.php?error=sqlerror');
                    exit();
                } else {
                    mysqli_stmt_bind_param($stmt, 'si', $email, $update_id);
                    mysqli_stmt_execute($stmt);
                    header('Location: ../edituser.php?success=emailupdate');
                    exit();
                }
            }
        } 
    }
    mysqli_stmt_close($stmt);
    // Close connection
    mysqli_close($conn);
} else {
    header('Location: ../edituser.php');
    exit();
}

正如我之前所说的——检查你的逻辑

有时候,最好以“相反”的方式来做---例如,在这种情况下,你说

当输入新电子邮件、更正密码并单击提交按钮时,将显示changeemail.php(我的操作脚本)页面,而不是重定向到edituser.php,并显示成功消息。我认为有些东西坏了,脚本卡住了

所以,换句话说

预期结果:重定向到edituser.php

当前结果:显示emailupdate(这在问题中并不清楚,但我相信是这样的-您正在重定向到edituser.php?success=emailupdate。如果不是这样,请澄清!我下面的示例将假定这一点……)

那么,让我们按照逻辑。。。。。。(删除所有非逻辑和/或重定向代码,以查找其命中位置的原因…)

首先,让我们来看看为什么它不能去你想要的地方

(预期结果:重定向到edituser.php)

删除除您期望之外的所有代码,我们得到

// Check for submit
if (isset($_POST['submit'])) {
    // DO ALL SORTS OF STUFF
} else {
    // NEVER SELECT THIS IF THERE IS A 'SUBMIT' POSTED
    header('Location: ../edituser.php');
    exit();
}
但是,要访问此页面,您有一个“提交”,因此永远不会选择“预期”行

现在,让我们看看发生了什么——以及为什么

// Check for submit
if (isset($_POST['submit'])) {
    // Get form data
    $update_id = $_POST['update_id'];
    $email = test_input($_POST['email']);
    $confirm_password = test_input($_POST['confirm_password']);


    // Check for empty field
    if (empty($email)) {
        // WE HAVE EMAIL, SO THIS IS NOT HIT
    } else if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { // Check email
        // EMAIL IS OK, SO NOT HIT
    } else if (empty($confirm_password)) {
        // PASSWORD IS OK, SO NOT HIT
    } else {

        // EMAIL FOUND SO WE ARE HERE

            while (mysqli_stmt_fetch($stmt)) {
                // Check if passwords match
                $passwordCheck = password_verify($confirm_password, $password);

                if ($passwordCheck == false) {
                    // PASSWORD IS OK, SO NO HIT
                } else if ($passwordCheck == true && $resultCheck > 0) {
                    // OK, SO NO HIT
                }
                // Update email
                $query = "UPDATE users SET email = ? WHERE id = ?";
                $stmt = mysqli_stmt_init($conn);

                if (!mysqli_stmt_prepare($stmt, $query)) {
                    // NO FAILED SQL, SO NO HIT
                } else {
                   // NO OTHER LOGIC, SO THIS _WILL_ BE A HIT........
                   // *****************************************
                   header('Location: ../edituser.php?success=emailupdate');
                   exit();
                   // *****************************************
                }
            }
        } 
    }
} 
同样,从代码中可以清楚地看到,您将获得所描述的结果

我不确定的是您真正希望做什么(因此我不能真正为您推荐代码),尽管您使用的逻辑肯定会将您带到您告诉它要去的地方——即使这不是您希望发生的事情

您可能需要在某个地方进行额外的检查(以确定您是否真的需要更新电子邮件,或只是将其发送到edituser页面,等等)-尽管您必须弄清楚逻辑


希望这将向您展示一些方法,您可以分解代码以达到您想要达到的目的。我经常开始写带有注释的代码,然后返回并用代码填充逻辑。这既提供了一种简单的方法来遵循这些步骤,也为以后的调试提供了注释良好的代码。我强烈建议您在编码时使用这样的系统-当然,在开始时它是有用的,但是有好的注释代码将在您的一生中为您服务。

为了解决我的问题,我添加了另一个问题:

$query = "SELECT password FROM users WHERE id = ?";
$stmt = mysqli_stmt_init($conn);

if (!mysqli_stmt_prepare($stmt, $query)) {
    header('Location: ../index.php?error=sqlerror');
    exit();
} else {
    mysqli_stmt_bind_param($stmt, "i", $update_id);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    $row = mysqli_fetch_assoc($result);

旧查询找不到更新电子邮件的密码,因为它还不存在,将关闭连接。

“我得到一个空白页”检查您的错误日志。此外,您在这里使用的变量没有显示为已定义的变量。如果不了解整个情况,我们就无法给出一个好的答案。如果$passwordCheck=true和$resultCheck=0,那么您就没有逻辑来说明问题。因此,它会出现在“更新电子邮件”后面的行中,即没有标题重定向(因此“空白页”…)。检查您的逻辑以执行所需操作。@PatrickQ添加了完整的脚本。@CFPSupport添加了新信息。