会话过期时执行查询时出现问题


Having issue to perform a query when a session has expired

我有一个if/else语句,它检查用户是否仍在登录,否则显示消息说他们需要登录。这包括在内,以防会话已过期。现在我在 else 语句中还有一个 mysqli 代码,它将执行查询以删除Session_CompleteSession表中的任何行,其中TeacherId属于登录的用户并且Session_Complete 0。现在这不起作用,这非常明显,因为显然会话已过期,这意味着教师未登录,因为他们的详细信息在会话过期时已被销毁,因此它无法识别记录的教师,因此查询无法删除行。

所以我的问题是,如果有人试图解决同样的问题,即如果用户因会话过期而被注销,则要执行 qwnt 查询,那么您将如何做到这一点,以便在会话过期之前它会得到登录的老师的TeacherId, $userid, 那么它可以在查询中使用,同时显示用户需要登录的消息?

以下是当前的 if/else 语句:

if ((isset($username)) && (isset($userid))){ //checks the logged in teacher's username and userid
//whole page code here
}else{ 
echo "Please Login to Access this Page | <a href='./teacherlogin.php'>Login</a>";
$incomplete = 0;            
    $deletesession = " DELETE session, session_complete FROM Session AS session 
    LEFT JOIN Session_Complete AS session_complete
    ON session_complete.SessionId = session.SessionId
    WHERE (session.TeacherId = ? AND Complete = ?) "; 
                if (!$delete = $mysqli->prepare($deletesession)) {
      // Handle errors with prepare operation here
    }
    //Dont pass data directly to bind_param store it in a variable
$delete->bind_param("ii",$userid, $incomplete);
 $delete->execute();
        if ($delete->errno) {
          // Handle query error here
        }
        $delete->close();

}
?>

您唯一能做的就是根据您将会话 cookie 设置为持续多长时间来跟踪会话的预期到期时间,或者跟踪用户的上次活动时间,并将其存储在数据库记录中。

您必须设置一个 cron 作业来经常清理会话表,并检查超过到期时间的会话。如果出于某种原因无法使用 cron 作业,则可以将常规代码设置为每隔这么多个视图随机调用会话垃圾收集器(取决于您的典型访问者数量)。

您也可以尝试检查IP地址和User-Agent标头,并尝试将它们与会话相关联,但这很容易出错,我不建议这样做。