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

点击表格按钮时将数据库ID存入SESSION的实现方案

实现PHP用户ID的Session存储改造(规避GET/POST暴露风险)

需求背景

现有一段PHP用户信息更新代码,当前通过GET获取ID、POST提交更新操作。需要修改为:点击表格中的按钮时,将数据库中的ID存入SESSION,全程不暴露ID信息,规避GET/POST传输数据带来的暴露风险,仅在服务器端存储该ID。

用户操作界面示意图

关键改造步骤

  • 启动Session:在所有涉及的页面开头添加session_start(),确保Session功能可用
  • 替换GET传参逻辑:点击编辑按钮时,通过POST请求将ID存入Session,不在URL中暴露ID
  • 移除表单隐藏ID字段:更新操作直接从Session读取ID,不再通过POST传递ID
  • 增加Session校验:防止未授权访问更新页面

改造后的完整代码

1. 用户列表页面(view.php,含编辑按钮)

将原列表中的编辑链接改为POST表单,提交ID并存入Session:

<?php
session_start();
include "config.php";

// 处理编辑按钮提交,将ID存入Session
if(isset($_POST['edit_user'])){
    $user_id = $_POST['user_id'];
    // 可选:校验ID合法性,避免非法ID存入Session
    $check_sql = "SELECT id FROM users WHERE id = '$user_id'";
    $check_result = $conn->query($check_sql);
    if($check_result->num_rows > 0){
        $_SESSION['edit_user_id'] = $user_id;
        header("Location: update.php");
        exit;
    }else{
        header("Location: view.php");
        exit;
    }
}

// 查询用户列表的逻辑...
?>
<!-- 列表中的编辑按钮改为内嵌POST表单 -->
<?php foreach($users as $user): ?>
<tr>
    <td><?php echo $user['firstname']; ?></td>
    <!-- 其他用户信息列... -->
    <td>
        <form method="post" action="" style="display:inline;">
            <input type="hidden" name="user_id" value="<?php echo $user['id']; ?>">
            <button type="submit" name="edit_user">编辑</button>
        </form>
    </td>
</tr>
<?php endforeach; ?>

2. 用户更新页面(update.php)

<?php
session_start();
include "config.php";

// 校验Session中是否存在编辑ID,无则跳转回列表
if(!isset($_SESSION['edit_user_id'])){
    header("Location: view.php");
    exit;
}
$user_id = $_SESSION['edit_user_id'];

// 处理更新提交
if (isset($_POST['update'])) {
    $firstname = $_POST['firstname'];
    $lastname = $_POST['lastname'];
    $email = $_POST['email'];
    $password = $_POST['password'];
    $gender = $_POST['gender']; 

    // 建议使用预处理语句防止SQL注入,此处保留原逻辑示例
    $sql = "UPDATE `users` SET `firstname`='$firstname',`lastname`='$lastname',`email`='$email',`password`='$password',`gender`='$gender' WHERE `id`='$user_id'"; 

    $result = $conn->query($sql); 

    if ($result == TRUE) {
        echo "记录更新成功。";
        // 更新完成后清除Session中的ID,避免误操作
        unset($_SESSION['edit_user_id']);
    }else{
        echo "错误:" . $sql . "<br>" . $conn->error;
    }
} 

// 查询待编辑用户信息
$sql = "SELECT * FROM `users` WHERE `id`='$user_id'";
$result = $conn->query($sql); 

if ($result->num_rows > 0) {        
    $row = $result->fetch_assoc(); // ID唯一,无需循环
    $first_name = $row['firstname'];
    $lastname = $row['lastname'];
    $email = $row['email'];
    $password  = $row['password'];
    $gender = $row['gender'];
?>
<!DOCTYPE html>
<html>
<body>
    <h2>用户信息更新表单</h2>

    <form action="" method="post">
        <fieldset>
            <legend>个人信息:</legend>
            名字:<br>
            <input type="text" name="firstname" value="<?php echo $first_name; ?>">
            <br>
            姓氏:<br>
            <input type="text" name="lastname" value="<?php echo $lastname; ?>">
            <br>
            邮箱:<br>
            <input type="email" name="email" value="<?php echo $email; ?>">
            <br>
            密码:<br>
            <input type="password" name="password" value="<?php echo $password; ?>">
            <br>
            性别:<br>
            <input type="radio" name="gender" value="Male" <?php if($gender == 'Male'){ echo "checked";} ?> >男
            <input type="radio" name="gender" value="Female" <?php if($gender == 'Female'){ echo "checked";} ?>>女
            <br><br>
            <input type="submit" value="更新" name="update">
        </fieldset>
    </form> 
</body>
</html>       
<?php
} else{ 
    unset($_SESSION['edit_user_id']);
    header('Location: view.php');
} 
?>

注意事项

  • 所有使用Session的页面必须在最开头调用session_start(),且函数前不能有任何输出(包括空格、换行)
  • 生产环境中建议使用PDO预处理语句替代直接拼接SQL,彻底防范SQL注入风险
  • 更新完成后及时清除Session中的ID,避免用户后续误操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:47:24