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

如何从数据库获取单条数据?修改密码时遇$id未定义错误

解决修改密码功能中的“$id未定义”错误及代码优化

核心问题分析

报错“$id未定义”是因为你在SQL查询中直接使用了$id变量,但这个变量从未被赋值。修改密码时,通常需要指定要修改的用户ID,一般有两种安全的获取方式:

  • 从当前登录用户的会话(SESSION)中获取(推荐,避免用户手动篡改ID)
  • 从URL的GET参数中获取(需额外验证权限)

同时你的代码还有两个逻辑错误:

  1. if(mysqli_num_rows($query_run) == 0 ) 判断反了,应该是行数大于0时才处理数据
  2. 直接拼接SQL语句存在SQL注入风险,必须使用预处理语句

修正后的完整代码

<?php
// 启动会话(如果是登录用户修改自己的密码,必须启动会话)
session_start();

// 数据库连接(添加错误处理)
$connection = mysqli_connect("localhost", "root", "", "ofad");
if (!$connection) {
    die("数据库连接失败: " . mysqli_connect_error());
}

// 方式1:从SESSION获取当前登录用户ID(推荐)
// 假设登录时已将用户ID存入$_SESSION['admin_id']
if (!isset($_SESSION['admin_id'])) {
    die("请先登录");
}
$id = $_SESSION['admin_id'];

// 方式2:从URL GET参数获取(仅用于管理员修改其他用户密码,需验证权限)
// if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
//     die("无效的用户ID");
// }
// $id = intval($_GET['id']);

// 使用预处理语句执行查询,避免SQL注入
$query = "SELECT * FROM admin WHERE id=? LIMIT 1";
$stmt = mysqli_prepare($connection, $query);
mysqli_stmt_bind_param($stmt, "i", $id);
mysqli_stmt_execute($stmt);
$query_run = mysqli_stmt_get_result($stmt);

// 修正判断条件:当查询到数据时才显示表单
if(mysqli_num_rows($query_run) > 0 ){
    $row = mysqli_fetch_assoc($query_run); // 因为LIMIT 1,不需要while循环
?>

<input type="text" class="input-field" name="id" value="<?php echo $row['id']; ?>" required readonly>

<div class="input-field">
    <label>Current Password</label>
    <input type="password" class="input" name="oldPass" placeholder="Current Password" required>
</div>

<div class="input-field">
    <label>New Password</label>
    <input type="password" class="input"  name="newPass" placeholder="New Password" required>
</div>

<div class="input-field">
    <label>Confirm New Password</label>
    <input type="password" class="input" name="confirmPass" placeholder="Confirm New Password" required>
</div>

<div class="button">
    <input type="submit" id="click" name="save_btn">
    <label for="click" class="save-me">Save</label>
    <!--MODAL POPUP-->
</div>
<?php
} else {
    echo "未找到该用户";
}
// 关闭语句和连接
mysqli_stmt_close($stmt);
mysqli_close($connection);
?>

关键修改说明

  • 定义$id变量:优先使用SESSION获取当前登录用户ID,确保用户只能修改自己的密码;如果是管理员批量操作,再用GET参数并验证ID的有效性
  • 修复逻辑判断:将mysqli_num_rows($query_run) == 0改为> 0,只有查询到用户数据时才显示表单
  • SQL注入防护:使用mysqli预处理语句,避免直接拼接变量到SQL语句中
  • 添加错误处理:增加数据库连接失败、会话未登录的提示,提升代码健壮性
  • 优化表单:将ID输入框设为readonly,防止用户手动篡改ID

内容的提问来源于stack exchange,提问作者mistyyy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:55:18