PHP重置密码表单点击链接后无法显示问题求助
问题排查与修复方案
你的重置密码表单无法显示,核心是两处关键逻辑错误,加上数据库调用的写法问题,下面是具体修复步骤:
1. 修正数据库查询调用方式
mysqli_query必须先传入数据库连接对象,再传SQL语句,你当前的写法缺少连接参数,导致查询失败,直接进入无数据的分支。
修改这行代码:
$query = mysqli_query($conn, "SELECT * FROM `customers` WHERE `reset_link_token`='".$token."' and `emailaddress`='".$email."';");
2. 颠倒过期日期判断逻辑
你写的if($row['expiry_date'] <= $current_date)是链接过期时才显示表单,完全和需求相反,应该改成链接未过期时显示表单:
if($row['expiry_date'] >= $current_date) { ?>
3. 开启错误提示(新手调试必备)
在PHP代码最顶部添加这两行,能直接显示页面上的错误信息,帮你快速定位问题:
error_reporting(E_ALL); ini_set('display_errors', 1);
4. 修复SQL注入风险(重要)
直接拼接$_GET参数到SQL里极易被攻击,改成预处理语句更安全:
// 替换原来的$query行 $stmt = $conn->prepare("SELECT * FROM `customers` WHERE `reset_link_token`=? and `emailaddress`=?"); $stmt->bind_param("ss", $token, $email); $stmt->execute(); $query = $stmt->get_result();
修复后的完整代码片段
<?php error_reporting(E_ALL); ini_set('display_errors', 1); if($_GET['email'] && $_GET['token']) { $conn = mysqli_connect("localhost", "root", "", "user"); if($conn === false){ die("ERROR: Could not connect. " . mysqli_connect_error()); } $email = $_GET['email']; $token = $_GET['token']; // 预处理语句避免SQL注入 $stmt = $conn->prepare("SELECT * FROM `customers` WHERE `reset_link_token`=? and `emailaddress`=?"); $stmt->bind_param("ss", $token, $email); $stmt->execute(); $query = $stmt->get_result(); $current_date = date("Y-m-d H:i:s"); if (mysqli_num_rows($query) > 0) { $row = mysqli_fetch_array($query); // 修正日期判断:未过期才显示表单 if($row['expiry_date'] >= $current_date) { ?> <form action="update-password.php" method="post"> <input name="email" type="hidden" value="<?php echo $email; ?>" /> <input name="reset_link_token" type="hidden" value="<?php echo $token; ?>" /> <div class="form-group"><label for="new-password">Password</label> <input id="new-password" name="password" type="password" /></div> <div class="form-group"><label for="confirm-password">Confirm Password</label> <input id="confirm-password" name="confirm_password" type="password" /></div> <input class="submit-btn" name="submit" type="submit" /> </form> <?php } else { echo "This forget password link has been expired"; } } else { echo "Invalid reset link"; } } else { echo "Missing required parameters"; } ?>
额外检查项
- 确认
customers表的expiry_date字段是DATETIME类型,且存储格式为YYYY-MM-DD HH:MM:SS,和$current_date格式一致。 - 用
var_dump($_GET);查看页面是否正确接收到email和token参数。
内容的提问来源于stack exchange,提问作者The Dotmen Rule
相关产品推荐
相关产品推荐

