0

我喜欢一个 if/else 语句,它检查用户是否仍然登录,否则显示消息说他们需要登录。这包括在会话过期的情况下。现在我在 else 语句中还有一个 mysqli 代码,它将执行查询以删除属于已登录用户和所在位置的表中的任何行Session_CompleteSession表。现在这不起作用,这真的很明显,因为显然会话已经过期,这意味着老师没有登录,因为他们的详细信息在会话过期时已被破坏,因此它无法识别哪个老师已登录,因此查询无法删除行。TeacherIdSession_Complete0

所以我的问题是,如果有人试图解决相同的问题,如果用户由于会话到期而注销,则执行查询,那么你将如何做到这一点,以便在会话之前已经过期它会 somehpw 得到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();


}

?>
4

1 回答 1

0

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

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

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

于 2013-01-22T00:05:47.877 回答