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