我正在为在我的网站中拥有帐户(目前在本地托管)的用户创建密码重置功能。我将PHP
和MYSQL
用于代码的所有逻辑。
我的一些信息:
我的PHP文件:
login.php
new_password.php
forget_password.php
我的数据库表:
password_resets
users
我想要这些步骤:
forget_password.php
并输入Email
。Email
表中存在users
,则应将随机生成并存储在password_resets
表中的重置密码链接发送到其电子邮件。new_password.php
users
表中更新新密码。程序可以将电子邮件地址和令牌保存在password_resets
表中。它还可以将重置链接发送给用户,但是users
表并未使用新密码进行更新。
除了令牌部分,我的代码运行良好。如果删除了if(isset($_GET['token']))
,则在SQL查询中得到的$token
是undefined error
。但是,如果按如下所示添加它,则整个代码将无法正常工作而没有任何错误通知。它使我一直回到new_password.php
页,对数据库没有任何作用。即使输入不匹配的密码,也不会得到$password_confirm_err
。当尝试回显令牌时,它会打印出来。我不知道为什么它不能在sql查询中使用。
<?php // Initialize the session
session_start();
// Include config file
require_once "users_config.php";
// Define variables and initialize with empty values
$new_password=$confirm_password="";
$new_password_err=$confirm_password_err="";
// Processing form data when form is submitted
if(isset($_GET['token'])){$token = $_GET['token']; echo $_GET['token'];
// ENTER A NEW PASSWORD
if (isset($_POST['new_pass'])) {
$new_password = mysqli_real_escape_string($link, $_POST['new_password']);
$confirm_password = mysqli_real_escape_string($link,$_POST['confirm_password']);
// Grab to token that came from the email link
if(empty(trim($_POST["new_password"]))) {
$new_password_err="Please enter the new password.";
}
elseif(strlen(trim($_POST["new_password"])) < 6) {
$new_password_err="Password must have atleast 6 characters.";
}
else {
$new_password=trim($_POST["new_password"]);
}
// Validate confirm password
if(empty(trim($_POST["confirm_password"]))) {
$confirm_password_err="Please confirm the password.";
}
else {
$confirm_password=trim($_POST["confirm_password"]);
if(empty($new_password_err) && ($new_password !=$confirm_password)) {
$confirm_password_err="Password did not match.";
}
}
// Check input errors before updating the database
if(empty($new_password_err) && empty($confirm_password_err)) {
// select email address of user from the password_reset table
$mysql = "SELECT email FROM password_resets WHERE token='$token' LIMIT 1";
$results = mysqli_query($link, $mysql);
$email = mysqli_fetch_assoc($results)['email'];
if ($email) {
$sql = "UPDATE users SET password='$new_password' WHERE email='$email'";
if($stmt=mysqli_prepare($link, $sql)) {
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($stmt, "si", $param_password, $param_email);
// Set parameters
$param_password=password_hash($new_password, PASSWORD_DEFAULT);
$param_email=$email;
// Attempt to execute the prepared statement
if(mysqli_stmt_execute($stmt)) {
// Password updated successfully. Destroy the session, and redirect to login page
session_destroy();
header("location: users_login.php");
exit();
}
else {
echo "Oops! Something went wrong. Please try again later.";
}
}
// Close statement
mysqli_stmt_close($stmt);
}
// Close connection
mysqli_close($link);
}
}
}
我希望“用户”表中的用户密码会使用新密码进行更新,但不是。