PHP+SQL PDO开发:如何实现账户页仅展示登录用户本人提交的领养申请
实现「仅展示当前登录用户领养申请」的调整方案
核心逻辑说明
现有request表已预设userId字段,该字段用于关联提交申请的用户在account表的主键id。原查询语句SELECT * FROM request未加筛选规则,因此会返回全表所有用户的申请数据,只需在查询语句后增加匹配当前登录用户ID的WHERE条件即可实现需求。
分步调整操作
1. 确认登录态存储
用户登录成功后,需将对应账户的account.id值存储在服务端会话(session)中,作为后续身份校验和数据筛选的依据。在账户页查询数据前,先增加登录态判断,未登录用户直接跳转登录页,避免越权访问。
2. 调整SQL查询语句
结合现有PDO数据库连接逻辑,采用预处理参数绑定的方式编写带筛选规则的查询,避免SQL注入风险:
// 开启会话读取登录态 session_start(); // 校验用户是否已登录 if (empty($_SESSION['user_id'])) { header("Location: login.php"); exit; } // 获取当前登录用户的ID,强制转为整数类型避免异常值 $currentUserId = (int)$_SESSION['user_id']; try { // 带筛选条件的SQL语句:仅匹配userId等于当前登录用户ID的申请 $sqlstr = "SELECT * FROM request WHERE userId = :current_user_id"; // 预处理SQL $stmt = $db->prepare($sqlstr); // 绑定参数值 $stmt->bindParam(':current_user_id', $currentUserId, PDO::PARAM_INT); // 执行查询 $stmt->execute(); // 获取查询结果集 $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // 原有循环输出表格的逻辑保持不变,可同步修正原代码中多余的<tr>标签结构问题 foreach ($rows as $row) { echo "<tr> <td>{$row['fullname']}</td> <td>{$row['email']}</td> <td>{$row['address']}</td> <td>{$row['postcode']}</td> <td>{$row['present']}</td> <td>{$row['category']}</td> </tr>"; } echo "</table> <br>"; } catch (PDOException $ex) { echo "查询领养申请数据出错,请稍后重试<br>"; echo "错误详情:" . $ex->getMessage(); }
校验规则注意事项
- 提交领养申请的环节需同步做数据关联:用户提交表单时,必须将当前登录用户的
account.id写入request表的userId字段,否则即便查询逻辑正确,也无法匹配到对应申请记录。 - 匹配规则无需跨表:因
request表已存储userId字段,可直接按ID值筛选,不需要通过关联查询account表的email等字段做匹配,减少查询性能消耗。 - 禁止直接拼接SQL字符串:不可将会话存储的用户ID直接拼接到SQL语句中(例如
SELECT * FROM request WHERE userId = ".$_SESSION['user_id']),这种写法存在SQL注入安全漏洞。
内容的提问来源于stack exchange,提问作者Alia
相关产品推荐
相关产品推荐

