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

如何实现仅发布CRUD帖子的登录用户可删除该帖子?

实现仅发布者可删除帖子的方案

要实现这个功能,你需要从登录验证、权限校验和安全防护三个方面修改代码,具体步骤如下:

1. 强制检查登录状态

首先要确保当前用户已登录,通常我们会把登录用户的ID存在$_SESSION(比如$_SESSION['user_id'])里,未登录用户直接拦截:

session_start(); // 必须放在文件最顶部,开启session支持
// 未登录则跳转到登录页
if (!isset($_SESSION['user_id'])) {
    $_SESSION['message'] = '请先登录';
    $_SESSION['message_type'] = 'warning';
    header('Location: login.php');
    exit;
}

2. 权限校验:仅允许发布者删除

假设你的task表有user_id字段(存储发布该帖子的用户ID),删除时必须同时匹配帖子ID和当前登录用户的ID,确保只有发布者能操作:

3. 替换不安全的SQL写法

原代码直接拼接$_GET['id']存在严重SQL注入风险,必须改用预处理语句:

修改后的完整代码

<?php
session_start(); // 开启session,必须放在最前面
include("db.php");

// 检查用户是否登录
if (!isset($_SESSION['user_id'])) {
    $_SESSION['message'] = '请先登录';
    $_SESSION['message_type'] = 'warning';
    header('Location: login.php');
    exit;
}

if (isset($_GET['id'])) {
    $task_id = $_GET['id'];
    $current_user_id = $_SESSION['user_id'];

    // 预处理删除语句,同时匹配帖子ID和发布者ID
    $query = "DELETE FROM task WHERE id = ? AND user_id = ?";
    $stmt = mysqli_prepare($conn, $query);
    mysqli_stmt_bind_param($stmt, "ii", $task_id, $current_user_id);
    mysqli_stmt_execute($stmt);

    // 根据受影响行数判断操作结果
    if (mysqli_stmt_affected_rows($stmt) > 0) {
        $_SESSION['message'] = '帖子删除成功';
        $_SESSION['message_type'] = 'danger';
    } else {
        $_SESSION['message'] = '你没有权限删除该帖子,或帖子不存在';
        $_SESSION['message_type'] = 'warning';
    }

    mysqli_stmt_close($stmt);
    header('Location: index.php');
    exit;
}
?>

关键补充说明

  • 如果你的task表还没有user_id字段,需要先执行SQL添加:ALTER TABLE task ADD COLUMN user_id INT NOT NULL;,并且在发布帖子时,要把当前登录用户的user_id存入该字段。
  • session_start()必须放在PHP代码的最顶部,否则无法读取$_SESSION中的用户信息。
  • 预处理语句是必须的安全措施,能彻底避免SQL注入风险,不要省略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:09:21