未存储PHP会话数据
我正在创建一个登录系统,但当用户登录时,它实际上并不存储我希望它在会话中存储的任何数据。我甚至检查了会话的文件,它是空的。我有session_start();在所有的页面上。我还能做错什么呢。这是两个主页的代码 登录代码:未存储PHP会话数据,php,session,Php,Session,我正在创建一个登录系统,但当用户登录时,它实际上并不存储我希望它在会话中存储的任何数据。我甚至检查了会话的文件,它是空的。我有session_start();在所有的页面上。我还能做错什么呢。这是两个主页的代码 登录代码: <? if ($DEBUG == true) { error_reporting(E_ALL); } require "header.php"; require_once "dbinterface.php"; require_once "user.class.
<?
if ($DEBUG == true) {
error_reporting(E_ALL);
}
require "header.php";
require_once "dbinterface.php";
require_once "user.class.php";
require_once "config.inc.php";
$db = new db($DB['host'], $DB['user'], $DB['pass'], $DB['database']);
$u_result = $db->run("select user_id from users where user_name = '" . $db->escape($_POST['user_name']) . "'");
if ($u_result == false) {
$url = 'Location: error.php?id=8';
header($url);
}
if (count($u_result) < 1) {
$url = 'Location: error.php?id=3';
header($url);
}
$user = new user($u_result[0]['user_id']);
if ($user->match_password($_POST['pass']) == true) {
$_SESSION['authenticated'] = true;
$_SESSION['user_id'] = $u_result[0]['user_id'];
$_SESSION['user'] = $user;
} else {
$url = 'Location: error.php?id=4';
header($url);
}
session_write_close();
header('Location: index.php');
?>
每个页面中包含的标题:
<?php
if (!session_start()) {
$url = "Location: error.php?id=13";
header($url);
}
?>
一点背景:
- windows 7(也在windows上试用过
- 服务器2008,但目前在7)PHP上
- 5存在本地托管的问题
- 对每个人来说,问题存在于所有人身上
- 浏览器
- 首先,我建议使用 错误报告(E_全部) 在每个文件的开头
- 第二,我认为问题在于,您正在包括2个会话开始,并且正在发生的事情是,您可能没有跟踪您认为相同的会话id
哦,我提到过吗?在一个有大量用户请求的共享环境中,不明确地命名会话可能会导致流血问题(一个用户作为另一个用户登录)。在大多数情况下,这种情况不会发生,但如果您的主机配置真的很糟糕,不命名会话和依赖“默认行为”可能会同时导致多个灾难。-根据PHP文档中的注释,我相信您需要在文件底部执行以下操作。
头('Location:x'));
是使用header()
函数的一种特殊情况,如果在发出header()
调用之前会话没有时间写入,它可能会干扰会话传递。应该解决这个问题
...
session_write_close();
header('Location: index.php');
远大目标但值得一提:
PHP是否正确配置以处理会话?
phpinfo()的输出是什么?查看一下您的php.ini设置。特别是,如果您手动执行
会话启动()操作,您希望将会话.auto\u start
设置为0
。如果您依赖会话cookie或transparant URL重写,您将需要会话。使用\u cookie=1
和/或会话。也使用\u trans\u sid=1
。这里有几条建议(我真的不知道发生了什么和/或为什么;所以它们只是建议;也许有一条可以解决问题^^)
首先,有几个问题:
(至少如果这些建议都没有奏效的话,它们就很重要)
- 您使用的是哪个版本的PHP/Apache
- 你在Windows?Linux上吗
- 如果您使用的是“生产”服务器,那么您使用的是什么托管服务?可能有什么特别之处
- 每个人都有问题吗?
- 当你浏览网站时,总是有问题吗
- 当您从其他浏览器访问站点时,它是否仍然存在
- 从另一台计算机上呢
- 如果在会话中设置数据的脚本末尾使用类似于
的内容,它会给出什么var\u dump($\u SESSION);die;
第一个想法:如果您设置一些头来禁用浏览器的缓存,该怎么办?
像这样的东西,比如:
session_start();
header("Cache-control: private");
第二个想法(至少在windows上):您是否尝试禁用防病毒/防火墙?
会话cookie是否在客户端浏览器中正确创建?
如果您正在使用子域(或不使用):cookie的域可以吗?它的过期日期如何
第三个想法:
- 你说
设置为error\u reporting
,这很好E\u ALL
- 如何显示错误?是否将其设置为On以便显示错误
- PHP/Apache的
中有什么有趣的地方吗错误日志
另一个问题:你确定在
会话\u开始之前没有任何东西到达输出吗?甚至没有空格
还有一个问题:你确定目录/文件的权限吗
<?
session_start();
if ($DEBUG == true) {
error_reporting(E_ALL);
}
if ($u_result == false) {
$url = 'Location: error.php?id=8';
header($url);
exit;
}
header('Location: index.php');
require_once("header.php");