未存储PHP会话数据

未存储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.

我正在创建一个登录系统,但当用户登录时,它实际上并不存储我希望它在会话中存储的任何数据。我甚至检查了会话的文件,它是空的。我有session_start();在所有的页面上。我还能做错什么呢。这是两个主页的代码

登录代码:

<?
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存在本地托管的问题
  • 对每个人来说,问题存在于所有人身上
  • 浏览器

确保您的session.save\u dir设置正确。如果您使用的是Media Temple之类的主机,您的主机位于home/########/domains/html中,则它可能设置不正确,无法保存。

看起来没有设置sessionID cookie

  • 首先,我建议使用

    错误报告(E_全部)

    在每个文件的开头

  • 第二,我认为问题在于,您正在包括2个会话开始,并且正在发生的事情是,您可能没有跟踪您认为相同的会话id


当session_start()不是页面上的第一行代码时,我看到奇怪的问题突然出现。尝试将会话_start()移到包含项和要求项上方,然后查看是否可以解决此问题。

找不到会话ID。我曾经遇到过这个问题,会话被疯狂地创建,但没有存储任何内容。(此外,一旦出现此类问题,请确保您对会话文件夹具有适当的写入权限)

你真正想做的是

$sessiond=session_start();//用于新会话的开始,以及

会话开始($sessiond);//在每次后续调用的启动请求中,直到使用session_destroy()销毁会话为止

当然,在网页之间传递$sessiond变量取决于您。我更喜欢使用&sessiond=linkaddition;>(这样,当出现问题时,我会立即知道;P)

请记住,确保正确会话恢复的唯一方法是传递会话ID。我知道这是可选的,在大多数系统上,它应该是开箱即用的,但有时却不能,而且无法保证共享主机上的会话行为

就像protip一样,尝试将会话包装在一个类中,该类使用_set()和_get()的“magic”默认处理程序,这可能会使以后验证会话数据的工作更轻松一些(尤其是_call()处理程序非常有用)。并使类的构造函数期望会话id,其中0(或-1或其他)表示“启动新会话”,并确保如果未明确设置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");