PHP会话不保存

时间:2012-01-23 18:48:24

标签: php session

我在我网站的每一页的第一行都写了这个。

include("restd.php");

和restd.php包含以下行:

@session_start();
if(isset($_SESSION['id']))
{
}
else
{
  header("location:index.php");
}

我面临的问题是,当我点击或在我的网站上做某事时。它让我退出并带我去index.php。

我确定它与会话有关。香港专业教育学院尝试了每一件事来避免这个问题,但我使用restd.php因为我不希望任何人复制某人的网址并粘贴并进入网站。

任何登录的人都可以查看其他人的页面。如果他们没有登录,那么他们将被重定向到index.php

编辑:让我们感到困惑的是,所有这些都在我的测试服务器上工作正常,这是easyPHP-5.3.8.0但是当我将所有文件上传到我的服务器时,这个问题就出现了。

9 个答案:

答案 0 :(得分:45)

您的会话目录(可能是/tmp/)不可写。

检查session_save_path()是否可写。

if (!is_writable(session_save_path())) {
    echo 'Session path "'.session_save_path().'" is not writable for PHP!'; 
}

答案 1 :(得分:5)

你真的在页面上设置了$ _SESSION ['id'] ......

您在这里要做的是:

  1. 启动会话并从会话处理程序
  2. 加载$ _SESSION
  3. 检查$ _SESSION是否包含密钥'id'
  4. 如果未设置$ _SESSION ['id'],则重定向到index.php
  5. 你真的在index.php中做到这一点吗?

    session_start();
    $_SESSION['id'] = something;
    

答案 2 :(得分:4)

您需要声明$_SESSION['id']

<强> file1.php

session_start();

$_SESSION['id'] = '123'  

<强> file2.php

include 'file1.php'

if(isset($_SESSION['id']))
{

}
else
{
  header("location:index.php");
}

答案 3 :(得分:1)

我知道这是一个老线程,但是经过几个小时的绝望后,以下内容帮助我解决了同样的问题。发现于:http://php.net/manual/de/function.session-save-path.php

  

我在公共html文件夹旁边创建了一个文件夹,并将这些行放在index.php的第一个点

     

会话文件夹的位置:

     

/域/帐户/会话

     

index.php的位置

     

/domains/account/public_html/index.php

     

我在第0行的index.php中放置了什么:

<?php 
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();
?>

希望这会节省你的时间。

答案 4 :(得分:0)

夫妻俩:

  1. 您的包含文件没有<?php ?>标记,因此内容不会被评估为PHP

  2. 在开始输出任何内容之前,必须先调用Session_start。是这样的吗?

答案 5 :(得分:0)

你仍然没有回答SET $ _SESSION ['id']的位置。 $pid = $_SESSION['id']未设置会话变量。 session_start()在任何会话相关之前出现,它在您的包含之前未显示。

答案 6 :(得分:0)

我遇到了同样的问题并找到了解决办法。如果有人可以解释为什么即使有cookie也没有阅读会话,请告诉我。

<?php
//  logged.php
//  The PHP session system will figure out whether to use cookies or URLs to pass the SID

if(!isset($_COOKIE['PHPSESSID']) && !isset($_GET['PHPSESSID']) && authenticationRoutine(/* Returns true if succesfully authenticated */) ) {
    session_id(uniqid("User--"));
    session_start();
    $_SESSION['id']=session_id();
}

?>



<?php
//  Insecure restd.php (The user can forge a stolen SID cookie or URL GET request, but that is inherent with PHP sessions)

if(!isset($_COOKIE['PHPSESSID']) && !isset($_GET['PHPSESSID']) {header('Location: index.php')}

?>

<强> [编辑]

即使cookie存在并且我阻止了开始新会话,但是会话尚未被读取和启动,因此没有可用的会话变量。在这种情况下,我检查会话是否已经首先启动(不使用session_status(),因为它在PHP 3.5中不存在,由于某种原因它在主机中最为普遍)。如果在PHP中没有启动会话,我会通过测试cookie和GET变量来检查它是否已经启动。如果找到会话ID,脚本将使用该ID恢复会话。如果没有可用的ID,则用户将被重定向到索引。

<?php
//  restd.php
if(empty(session_id())) {
    if(isset($_COOKIE['PHPSESSID']) && !empty($_COOKIE['PHPSESSID'])) {session_id($_COOKIE['PHPSESSID']);}
    elseif(isset($_GET['PHPSESSID']) && !empty($_GET['PHPSESSID'])) {session_id($_GET['PHPSESSID']);}
    else {header('Location: index.php'); exit(0);}
    session_start();
}

答案 7 :(得分:0)

检查您的会话路径可能不存在 所以你可以使用以下方法保存PHP会话路径:

ini_set(' session.save_path','SOME WRITABLE PATH');

答案 8 :(得分:0)

在我的情况下,我忘了我将PHP标记session.cookie_secure设置为on,而开发环境不受TLS保护。

More information about Session/Cookie parameters