PHP用户信息修改异常:仅修改最后用户而非当前登录用户
解决用户资料编辑时显示错误用户信息及更新逻辑问题
看起来你在做用户资料编辑功能时碰到了两个头疼的问题:页面总是显示数据库里最后一个用户的信息,而不是当前登录用户的;虽然编辑操作能更新对应账号的数据,但显示逻辑完全不对。我来帮你拆解问题根源,然后给出完整的修复方案:
问题1:页面显示最后一个用户信息的原因
你前端的PHP代码里有两个致命错误:
- 条件判断用错了运算符:
if($username=$row['username'])这里用的是赋值符号=,而不是比较符号==。这行代码的实际作用是把每一行用户的username赋值给$username,因为非空字符串在PHP里会被判定为true,所以循环里每一次都会执行变量赋值操作。等循环结束后,所有存储用户信息的变量($email、$user、$nume等)都会被最后一条用户数据覆盖,这就是页面总是显示最后一个用户信息的原因。 - 没有利用登录态筛选用户:你查询了数据库里所有用户的信息,完全没必要这么做——用户已经登录了,
$_SESSION['username']就是当前登录用户的唯一标识,直接用它查询单个用户的信息就好。
问题2:更新资料的逻辑隐患
你的edit_user处理逻辑里,让用户输入username和password来确认身份,但其实用户已经登录了,$_SESSION['username']已经可以安全定位当前用户,不需要额外输入。而且直接用MD5加密后的密码作为查询条件,不仅冗余,还存在安全风险。另外你的SQL语句里重复写了tara='$tara',属于无效的冗余代码。
完整修复方案
1. 修复前端页面(editprofil.php)
修改查询逻辑,直接通过$_SESSION['username']获取当前登录用户的信息,同时给输入框加上默认值,让用户能看到自己原来的资料:
<?php include('server.php'); // 先检查用户是否登录,未登录则跳转到登录页 if(!isset($_SESSION['username'])){ header('location: login.php'); exit(); } // 只查询当前登录用户的信息,避免遍历所有用户 $current_username = $_SESSION['username']; $result = mysqli_query($db,"SELECT * FROM users WHERE username='$current_username'"); $row = mysqli_fetch_array($result); // 把用户信息赋值到变量 $email = $row['email']; $user = $row['username']; $nume = $row['nume']; $prenume = $row['prenume']; $tara = $row['tara']; $oras = $row['oras']; $adresa = $row['adresa']; $numar = $row['numar']; ?> <form method="post" action="editprofil.php"> <table class="table-fill"> <thead> <tr> <th class="text-left" style="font-size:32px;padding-bottom:1em;" >Profil</th> </tr> </thead> <tbody> <tr> <td class="text-left">Username</td> <td class="text-left"><?php echo $user ?></td> </tr> <tr> <td class="text-left">Nume</td> <td class="text-left"><input type="text" name="nume" value="<?php echo $nume; ?>" /></td> </tr> <tr> <td class="text-left">Prenume</td> <td class="text-left"><input type="text" name="prenume" value="<?php echo $prenume; ?>" /></td> </tr> <tr> <td class="text-left" >Email </td> <td class="text-left"> <?php echo $email; ?></td> </tr> <tr> <td class="text-left">Tara</td> <td class="text-left"><input type="text" name="tara" value="<?php echo $tara; ?>" /></td> </tr> <tr> <td class="text-left">Oras</td> <td class="text-left"><input type="text" name="oras" value="<?php echo $oras; ?>" /></td> </tr> <tr> <td class="text-left">Adresa</td> <td class="text-left"><input type="text" name="adresa" value="<?php echo $adresa; ?>" /></td> </tr> <tr> <td class="text-left">Telefon mobil</td> <td class="text-left"><input type="text" name="telefon" value="<?php echo $numar; ?>" /></td> </tr> <tr> <td class="text-left">Data nasterii</td> <td class="text-left"><input type="text" name="varsta" value="<?php echo isset($row['varsta']) ? $row['varsta'] : ''; ?>" /></td> </tr> </tbody> </table> <!-- 移除不必要的用户名和密码输入框,直接用登录态验证身份 --> <div class="button-container"> <button type="submit" class="btn" name="edit_user">Save Changes</button> </div> </form>
2. 修复server.php中的edit_user逻辑
利用$_SESSION['username']定位当前用户,移除冗余的密码验证,同时修复SQL语句的冗余问题:
if (isset($_POST['edit_user'])) { // 确保用户已登录,防止未授权访问 if(!isset($_SESSION['username'])){ header('location: login.php'); exit(); } $current_username = $_SESSION['username']; // 获取表单提交的更新数据 $oras = mysqli_real_escape_string($db, $_POST['oras']); $tara = mysqli_real_escape_string($db, $_POST['tara']); $adresa = mysqli_real_escape_string($db, $_POST['adresa']); $nume = mysqli_real_escape_string($db, $_POST['nume']); $prenume = mysqli_real_escape_string($db, $_POST['prenume']); $telefon = mysqli_real_escape_string($db, $_POST['telefon']); $varsta = mysqli_real_escape_string($db, $_POST['varsta']); // 更新当前登录用户的资料,用username作为唯一标识 $sql = "UPDATE users SET tara='$tara', oras='$oras', nume='$nume', prenume='$prenume', adresa='$adresa', numar='$telefon', varsta='$varsta' WHERE username='$current_username' "; mysqli_query($db, $sql); // 提示更新成功并跳回资料页 $_SESSION['success'] = "Profile updated successfully!"; header('location: editprofil.php'); exit(); }
额外的安全与优化建议
- 防止SQL注入:目前用
mysqli_real_escape_string有一定防护,但更安全的方式是使用预处理语句(Prepared Statements),可以彻底避免SQL注入风险。 - 密码加密升级:MD5加密已经被证明不安全,建议改用PHP内置的
password_hash()和password_verify()函数来处理密码的加密与验证。 - 登录态检查:确保所有需要用户登录才能访问的页面,都先检查
$_SESSION['username']是否存在,防止未登录用户直接访问敏感页面。
内容的提问来源于stack exchange,提问作者AlexS
相关产品推荐
相关产品推荐

