如何使用Ajax、PHP及SQL语句获取当前登录用户的事件数据
问题原因
你现有代码的SQL虽然写了按username字段筛选的逻辑,但绑定参数时传入的$username变量从未被赋值,也没有读取$_SESSION中存储的当前登录用户信息,因此无法正确过滤出当前用户的事件数据。
修复步骤
- 确保
functions.php文件最顶部(所有输出逻辑之前)调用session_start(),否则无法读取SESSION中存储的登录态数据 - 在查询逻辑前先从
$_SESSION中取出当前登录用户的标识,同时增加登录态校验,未登录时直接返回对应提示即可 - 修正参数绑定逻辑,将SESSION中取出的当前用户标识作为筛选条件传入SQL,建议额外加上
status = 1的筛选条件,适配后续可能的软删除需求 - 前端JS代码不需要调整,注意绝对不要通过前端传参传递用户标识,避免被恶意篡改导致越权查询
修正后的PHP后端代码
// 这行必须放在functions.php最顶部,所有输出、业务逻辑之前 session_start(); function getEvents($date = ''){ $date = $date?$date:date("Y-m-d"); $eventListHTML = '<h2 class="sidebar__heading">'.date("l", strtotime($date)).'<br>'.date("F d", strtotime($date)).'</h2>'; // 登录校验,未登录直接返回提示 // 注意把下面的current_username替换成你项目实际存储登录用户名的SESSION键名 if(empty($_SESSION['current_username'])){ $eventListHTML .= '<p>请先登录后查看可用性事件</p>'; echo $eventListHTML; return; } // 从SESSION读取当前登录用户名 $currentUser = $_SESSION['current_username']; global $db; // 增加status=1筛选,匹配现有表的字段逻辑 $stmt = $db->prepare("SELECT * FROM events WHERE date = ? AND username = ? AND status = 1"); // 绑定当前登录用户作为筛选条件 $stmt->bind_param("ss", $date, $currentUser); $stmt->execute(); $result = $stmt->get_result(); if($result->num_rows > 0){ $eventListHTML .= '<ul class="sidebar__list">'; $eventListHTML .= '<li class="sidebar__list-item sidebar__list-item--complete">Availability</li>'; $i=0; while($row = $result->fetch_assoc()){ $i++; $eventListHTML .= '<li class="sidebar__list-item"><span class="list-item__time">'.$i.'.</span>'.$row['title'].'</li>'; } $eventListHTML .= '</ul>'; } echo $eventListHTML; }
安全提示
- 不要通过前端AJAX传用户名/用户ID参数做筛选,前端传入的参数可以被任意篡改,会造成越权查看其他用户日程的安全漏洞,用户身份校验必须以后端SESSION存储的登录信息为准
- 如果你的SESSION中存储的是用户ID而非用户名,把SQL里的
username = ?替换为对应表的用户ID字段即可,绑定参数时传入SESSION中存储的用户ID。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

