我在PHP代码中这样设置了我的会话:$_SESSION['user_id'] = $login;
,这在上传到我的服务器并跨不同页面时似乎工作正常,但是当我在本地机器上测试网站时,会话似乎在将脚本留在设置的位置后立即变得未设置。
我正在使用 XAMPP 和完全相同的代码在本地机器上进行测试。
我不确定为什么会出现这个问题,并将不胜感激任何有用的答案。
不起作用的示例:
$_SESSION['user_id'] = $login;
echo '<META HTTP-EQUIV="refresh" content="0;URL=../home.php">';
编辑 1:
这是我登录的整个函数(它是类的一部分):
public function loggingIn(){
session_start();
$db = new Database('localhost','root','','userdata');
$userFunctions = new Users($db);
$username = $_POST['usernameInput'];
$password = $_POST['passwordInput'];
if(empty($username) || empty($password)){
$this->errors['u&p'] = 'Please Enter Your Username AND Password';
$this->printE();
} elseif($userFunctions->user_exists($username)===false){
$this->errors['nm'] = 'That Username/Password Combination Is Not Valid';
$this->printE();
} else {
$login = $userFunctions->login($username, $password);
if($login === false){
$this->errors['nm'] = 'That Username/Password Combination Is Not Valid';
echo 'Login Failed!';
} else {
if(!$userFunctions->economyTableExistsForUser($login)){
$userFunctions->createEconomyTableForUser($login);
}
if(!$userFunctions->schoolTableExistsForUser($login)) {
$userFunctions->createSchoolTableForUser($login);
}
$_SESSION['user_id'] = $login;
echo $_SESSION['user_id']; // working fine
header('Location: ../home.php');
}
}
}
让我们猜测您的家用机器没有:
session.autostart = On
在你的PHP.ini中,而你的另一台机器显然是。
确保已在 PHP 代码中设置:
session_start();
PHP: session_start - 手动
如果你不这样做,那么你的会话就不会开始,除非我的第一个猜想是正确的。
此外,您必须在本地主机上检查PHP版本和php.ini中的设置。确保存储会话文件的目录是可写的,并且会话文件确实存在。
编辑 1:
您最好使用 PHP 解决方案进行重定向:
header("Location: /");
exit();
编辑2:
PHP 具有修改 HTTP 标头的函数。其中一些:
- 页眉
- session_start
- 设置饼干
编辑3:
换行符和空格可能是一个问题,但也有一些不可见的字符序列可能导致Warning: Cannot modify header information
,如UTF-8 BOM(字节顺序标记)。尝试重新保存文件,确保文件保存得与UTF-8 (no BOM)
一样。
编辑4:
要正确调试代码,请确保 PHP 显示所有警告和通知。在会话开始之前运行它:
ini_set('display_errors', -1);
编辑5:
您还必须检查session.gc_maxlifetime
设置:
session.gc_maxlifetime session.gc_maxlifetime指定数据被视为"垃圾"并清理的秒数。垃圾回收在会话启动期间发生。
编辑6:
要查看崇高文本中的空白,请编辑设置:
// Set to "none" to turn off drawing white space, "selection" to draw only the
// white space within the selection, and "all" to draw all white space
"draw_white_space": "selection",
您可以在首选项->设置默认值中进行设置。如果您编辑用户设置首选项->设置 - 用户并按如下方式添加行:
{
"font_size": 10,
"draw_white_space": "all"
}
还要确保它显示所有其他特殊字符以正确调试您的代码!
编辑7:
最后尝试在重定向之前添加session_write_close();
。
编辑8:
在 PHP 文件中设置,在 session_start();
之前,session.save_path = "/home/username/tmp";
指令。在public_html之外创建tmp
目录。 确保tmp
目录具有 chmod 770 并且使用相同的用户/组权限创建。在主目录中运行ls -lsa
以检查新目录是否与其他目录(例如public_html)具有相同的用户/组。如果没有,请确保通过运行 chown username:groupname /home/username/tmp
在 tmp
上以 root 身份更改权限。
对此的快速更新。 我发现这个响应非常有用,但是,请注意,在我的XAMPP安装中,session.autostart=On的php.ini条目略有不同。 我发现了以下内容:
;在请求启动时初始化会话。;http://php.net/session.auto-startsession.auto_start=0
我将其更改为:
;在请求启动时初始化会话。;http://php.net/session.auto-startsession.auto_start=1
php.ini
中启用了会话 cookie ( xamp'php'php.ini
)。
session.use_cookies=1
在你的 php 中.ini检查:
-
variables_order
包含字母S
- 检查
session.save_path
是否存在,并且可由运行 PHP 的用户写入。
如果你使用的是嵌入在 .htm/.html 文档中的 PHP,你需要确保 Apache 可以适当地处理它们。这是通过编辑 httpd.conf 并添加行来完成的
AddType application/x-httpd-php .html .htm
到第 <IfModule mime_module>
部分
我正在与这个问题作斗争,但解决了...
在您的/opt/lampp/etc/php.ini
中尝试更改此行:
session.save_path = "/var/lib/php/session"
为此:
session.save_path = "/opt/lampp/var/session"
注意:也许您需要在/opt/lampp/var
中创建文件夹"会话"
- 开放式
php.ini
- 使用
"1"
更改session.auto_start -
"Stop"
阿帕奇(如果正在运行) - "
Save"
php.ini
-
"Start"
阿帕奇
Session Issue Fixed in Xampp 7.1.6 with following Changes in php.ini
Line #1403 set:
session.auto_start = 1
我在现场工作 Xampp 没有遇到类似的问题。
在我的情况下,诀窍是禁用下面的两行。
header('Set-Cookie: same-site-cookie=huis; SameSite=Lax');
header('Set-Cookie: cross-site-cookie=stijl; SameSite=None; Secure');
因此,我的建议是检查任何修改有关coockies的内容。
> 请在 php ini 中检查您的"session.cookie_path"。默认情况下,它是"session.cookie_path=/"
在 php.ini (C:''xamp''php''php.ini 中启用会话 cookie。
改变
session.use_cookies=0
自
session.use_cookies=1
并记得重新启动 xampp