我在我的PHP代碼中使用session_destroy()時出現錯誤。錯誤 - session_destroy() - 試圖銷燬未初始化的會話
以下腳本位於每個頁面上,如果用戶已登錄,它將檢查會話是否有效,如果不是,則會話會被終止。
session_start();
// check for users already signed in and check session
if (isset($_SESSION['user_id'])) {
$uid = $_SESSION['user_id'];
// check user_id is a valid id
if (!is_numeric($uid) || $uid < 0) {
session_unset();
session_destroy();
session_regenerate_id(true);
}
// if user agent is different, kill session
if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']) {
session_unset();
session_destroy();
session_regenerate_id(true);
}
// if user's last login record fails to match session_id, kill session
$SQL = "SELECT user_session FROM users_logins ";
$SQL .= "WHERE user_id = :user_id ";
$SQL .= "ORDER BY time_in DESC LIMIT 1;";
$STH = $DBH_P->prepare($SQL);
$STH->bindParam(':user_id', $uid);
$STH->execute();
$row = $STH->fetch();
if ($STH->rowCount() > 0) {
$db_sid = $row['user_session'];
}
if ($db_sid !== session_id()) {
session_unset();
session_destroy();
session_regenerate_id(true);
}
}
我收到的錯誤表示失敗來自最後的session_destroy()
調用。
我是否正確使用session_destroy()
?我已經閱讀了其中的其他問題,但大多數答案都建議在銷燬它之前必須使用session_start()
,但在檢查開始之前,我已經開始了頂部的會話。
_Why_你在使用session_unset和session_destroy嗎?重新生成id應該足夠了。爲什麼你在會話中檢查用戶ID是數字?如果這應該是必要的 - 在將它放入會話之前進行。 – CBroe
@CBroe我使用session_unset和session_destroy記錄用戶,如果發現任何問題,所以當他們去訪問另一個頁面時,他們必須再次登錄。由於會話劫持,我檢查user_id是數字。僅僅因爲我在首先將它放入會話中之前對其進行了檢查,並不表示它會在此頁面上有效,如果有人使用了它。 – TheCarver
我現在在SO上追蹤那個'session_unset'神話,因爲從昨天開始。不管你告訴用戶什麼,不知何故傳聞在你看來,你認爲更適合投入腳本的功能越多越好。事實恰恰相反。 – hakre