如何实现仅发布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
相关产品推荐
相关产品推荐

