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

PHP用户信息修改异常:仅修改最后用户而非当前登录用户

解决用户资料编辑时显示错误用户信息及更新逻辑问题

看起来你在做用户资料编辑功能时碰到了两个头疼的问题:页面总是显示数据库里最后一个用户的信息,而不是当前登录用户的;虽然编辑操作能更新对应账号的数据,但显示逻辑完全不对。我来帮你拆解问题根源,然后给出完整的修复方案:

问题1:页面显示最后一个用户信息的原因

你前端的PHP代码里有两个致命错误:

  1. 条件判断用错了运算符:if($username=$row['username'])这里用的是赋值符号=,而不是比较符号==。这行代码的实际作用是把每一行用户的username赋值给$username,因为非空字符串在PHP里会被判定为true,所以循环里每一次都会执行变量赋值操作。等循环结束后,所有存储用户信息的变量($email、$user、$nume等)都会被最后一条用户数据覆盖,这就是页面总是显示最后一个用户信息的原因。
  2. 没有利用登录态筛选用户:你查询了数据库里所有用户的信息,完全没必要这么做——用户已经登录了,$_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:02:19