PHP会话数据未被存储

The*_*i.9 9 php session

我正在建立登录系统,但是当用户登录时,它实际上并不存储我希望它在会话中的任何数据.我甚至检查了会话的文件,它是空的.我有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');

?>
Run Code Online (Sandbox Code Playgroud)

每个页面都包含的标题:

<?php
if (!session_start()) {
    $url = "Location: error.php?id=13";
    header($url);
}
?>
Run Code Online (Sandbox Code Playgroud)

一点背景:

  • Windows 7(也尝试在Windows上
  • 服务器2008,但目前在7)PHP
  • 存在5个localy托管问题
  • 对于每个人来说,问题都存在
  • 浏览器

Pas*_*TIN 11

这里有几个建议(我真的不知道发生了什么和/或为什么;所以他们只是建议;也许一个人会解决问题^^).

首先,有几个问题:(
至少如果这些建议都不起作用,它们至关重要)

  • 您使用的是哪个版本的PHP/Apache?
  • 你在Windows上吗?Linux?
  • 如果您在"生产"服务器上,您使用的是哪种托管服务?也许它有什么特别之处?
  • 每个人都有问题吗?
    • 浏览网站时是否总有问题?
    • 当您从其他浏览器访问该站点时它是否仍然存在?
    • 从另一台电脑怎么样?
  • 如果您使用类似于var_dump($_SESSION); die;在会话中设置数据的脚本末尾的内容,它会给出什么?


第一个想法:如果你设置一些标题来禁用浏览器的缓存怎么办?
像这样的东西,例如:

session_start();
header("Cache-control: private");
Run Code Online (Sandbox Code Playgroud)


第二个想法(至少如果你在Windows上):你试过禁用你的防病毒/防火墙吗?
是否在客户端的浏览器中正确创建了会话cookie?
如果您正在使用子域(或不使用):cookie的域是否正常?它的失效日期怎么样?


第三个想法:

  • 你说error_reporting是设置的E_ALL,这很好
  • 怎么样display_errors?它是否设置为On以便显示错误?
  • PHP/Apache中有什么有趣的东西error_log吗?


另一个:你确定在绝对之前没有任何东西可以输出到输出session_start吗?甚至没有白色空间?


还有一个:您确定目录/文件的权限吗?

  • 在目录中写入的权限意味着您可以创建新文件和/或删除旧文件.
    • 但是,如果我没记错的话,不是你可以修改它们
  • 要修改文件,您还需要对文件进行写访问
    • 实际上,您的网络服务器需要对这些文件的写访问权^^

会话目录以及创建的(空)文件的权限是什么?


我开始没有想法......运气好的话,也许其中一个会是正确的......或者帮助你找出合适的人选!

祝好运 !


dar*_*mon 9

可能的原因是在标题('Location ...')语句之后继续执行.但是看起来你希望它停止,所以你应该添加'exit;' 重定向到error.php后.例如:

if ($u_result == false) {
    $url = 'Location: error.php?id=8';
    header($url);
    exit;
}
Run Code Online (Sandbox Code Playgroud)

这也可能是你问题的一部分,因为你永远不会去error.php并看到错误代码.最后一行总是执行:

header('Location: index.php');
Run Code Online (Sandbox Code Playgroud)

而且由于header()的默认行为是替换现有的头文件,所以无论如何都总是转到index.php.