You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:55:18