【发布时间】:2016-06-09 04:37:29
【问题描述】:
我知道有很多关于这个主题的帖子,但没有一个解决了我的问题。
我的 Windows 计算机上运行着 WAMP 服务器。我创建了一个登录系统,它能够设置 PHP 会话并验证它们在创建它们的页面上是否正常工作。一旦我通过输入 URL 或 javascript 函数更改到不同的页面,我就会失去会话。
这是我的 test.php,用于登录用户
require_once('config.php');
$user = new User();
$result = $user->login('email@gmail.com', 'mysecretpassword');
echo $result;
echo '</br>';
$result = $user->isLoggedIn();
echo $result;
这是实际登录用户的函数
public function login($email, $password) {
// Hash Password
$password = $this->hashPassword($password);
// Check if email and password match
$query = "SELECT id, confirm_email FROM users WHERE email = ? AND password = ?";
$a_bind_params = array($email, $password);
$a_param_types = array('s','s');
$results = $this->db->select($query, $a_bind_params, $a_param_types);
// If we didnt get a result then email/password must be wrong
if(count($results) == 0) return 1;
// Now check that they verrified their email
if($results[0]['confirm_email'] == 'N') return 2;
// User is real and everything is good
// Update login Date
$a_bind_params = array(date('Y-m-d H:i:s'), $results[0]['id']);
$a_param_types = array('s','s');
$query = "UPDATE users SET login_at = ? WHERE id = ?";
// There was a problem updating their login table so just fail the login
if(!$this->db->update($query, $a_bind_params, $a_param_types)) return 3;
// Login user
Session::set("user_id", $results[0]['id']);
session_regenerate_id(true);
Session::set("login_fingerprint", $this->_generateLoginString ());
return 0;
}
这是检查用户是否登录的函数
// Checks if user is logged in
public function isLoggedIn() {
//if $_SESSION['user_id'] is not set return false
if(Session::get("user_id") == null)
return false;
$loginString = $this->_generateLoginString();
$currentString = Session::get("login_fingerprint");
if($currentString != null && $currentString == $loginString)
return true;
else {
//destroy session, it is probably stolen by someone
$this->logout();
return false;
}
}
这里是创建会话的 Session 函数
public static function startSession() {
ini_set('session.use_only_cookies', true);
$cookieParams = session_get_cookie_params();
session_set_cookie_params(
$cookieParams["lifetime"],
$cookieParams["path"],
$cookieParams["domain"],
SESSION_SECURE,
SESSION_HTTP_ONLY
);
session_start();
session_regenerate_id(true);
}
这些是设置/获取用户会话的函数
public static function set($key, $value) {
$_SESSION[$key] = $value;
}
public static function get($key, $default = null) {
if(isset($_SESSION[$key]))
return $_SESSION[$key];
else
return $default;
}
最后这是我的 config.php 文件,它实际上调用了session_start() 并包含一些常量
// REQUIRE ALL FILES
require_once("ClassSession.php");
require_once("ClassDatabase.php");
require_once("ClassUser.php");
Session::startSession();
如果我导航到另一个名为 test.php 的页面
include "config.php";
$user = new User();
if($user->isLoggedIn()) echo 'logged in';
else 'Not logged in';
会话丢失,用户不再登录。
我检查了 PHP.ini 中的 session.save_path 并检查了 wamp64/temp 文件夹,我的会话存储在其中。我还在每个页面上调用 session_start(),因为我在两个测试页面上都包含了 config.php。不知道为什么我会失去我的会话。
编辑
我忘了提及实际发生的事情。当我登录用户时,我从数据库中查找他们的 user_id 并将其存储到$_SESSION['user_id']。当我从登录用户的页面访问 $_SESSION[user_id] 时,我得到了正确的值。但是,当我切换到另一个页面时,$_SESSION['user_id'] 为空。
更新
session_regenerate_id(true) 不是问题。
【问题讨论】:
-
请用minimal reproducible example更改这组代码
-
可能你错过了
session_start()的电话。 -
我不知道怎么才能让它更小。所有这些都是需要的。如果您阅读了我的整篇文章,您会发现我在每一页上都调用了
session_start()。 -
如果你还是使用普通的 php
$_SESSION,为什么还需要Session类? -
SESSION_SECURE const 的值是多少?也许您将 cookie 限制为 https?