如何从数据库获取单条数据?修改密码时遇$id未定义错误
解决修改密码功能中的“$id未定义”错误及代码优化
核心问题分析
报错“$id未定义”是因为你在SQL查询中直接使用了$id变量,但这个变量从未被赋值。修改密码时,通常需要指定要修改的用户ID,一般有两种安全的获取方式:
- 从当前登录用户的会话(SESSION)中获取(推荐,避免用户手动篡改ID)
- 从URL的GET参数中获取(需额外验证权限)
同时你的代码还有两个逻辑错误:
if(mysqli_num_rows($query_run) == 0 )判断反了,应该是行数大于0时才处理数据- 直接拼接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
相关产品推荐
相关产品推荐

