页面间没有保存的PHP会话变量

页面间没有保存的PHP会话变量

问题描述:

我知道这可能是一个重复的问题,但我似乎无法找到我的具体问题的答案。页面间没有保存的PHP会话变量

我有3个PHP文件。 signin.php获取用户数据并将其传递给signin_auth.php。

signin.php然后重定向在成功注册后mytoolkit.php

signin_auth.php使用下面的代码在PHP脚本的末尾:

<? 
session_start(); 

$_SESSION['sessionID'] = $id; 
$_SESSION['time'] = time(); 

header ("Location: mytoolkit.php"); 
exit; 

?> 

然后,用户是重定向到mytoolkit.php,它使用此代码:

<? 

session_start(); 

if (!isset($_SESSION['sessionID'])) { 

    header('Location: signin.php?message=4'); 
     exit; 

} 

$inactive = 5400; 
$session_life = time() - $_SESSION['time']; 

if ($session_life > $inactive) { 

    session_destroy(); 
    header("Location: signin.php?message=5"); 
    exit; 

} 

?> 

会话变量不存储和mytoolkit.php不断改向我signin.php消息= 4

可能是一个愚蠢的错误。我刚刚看了太久。

UPDATE -

所以我有几台服务器。在iPage上。我将整个文件夹移到了不​​同​​的服务器上(abc.com/toolkit现在已经复制到xyz.com/toolkit)该应用程序在xyz.com上运行得非常好......它是第一个为我提供了问题的服务器。

这两个都运行在同一托管公司。我不知道该怎么做。

+0

为什么您使用session_life和非活动破坏的会话,你没有让PHP杀它本身当它是无效的X时间,你可以在php.ini中设置?? – CodeBird 2013-05-08 21:09:11

+0

你说在sign auth的最后是会话代码,你是在输出html还是空白行之前? – 2013-05-08 21:11:00

+0

@on_,我会问同样的事情;代码到页面的最后,'session_start()'不能一起走,和前面的空格一起走。 – 2013-05-08 21:13:45

我觉得这是你的问题

$inactive = 5400; 
    $session_life = time() - $_SESSION['time']; 
    if ($session_life > $inactive) { 
     session_destroy(); 
     header("Location: signin.php?message=5"); 
     exit; 
    } 
+0

我完全拿出来,仍然失败。尽管感谢您的帮助! – 2013-05-08 22:09:07

如果您在脚本中使用header('location: example.com')它发送302重定向到浏览器。现在这不是永久的,但有些浏览器仍然缓存这个结果。只需google it

因此,它很可能是您的浏览器在您访问您的代码之前重定向您的请求。尝试更改signin_auth.phpheader ("Location: mytoolkit.php?t=".time());,然后使用附加的一些随机参数调用页面,以防止第一页缓存。 EG:/signin_auth.php?t=random

+0

感谢雨果 - 我认为这样会工作,但仍然失败 – 2013-05-08 22:09:25

如果您没有在if (!isset($_SESSION['sessionID'])) {声明之前销毁与session_destroy();的会话,那么原因可能是$id具有空值。

+0

'session_destroy();'不是一个好主意,除非你确定你在做什么。 – 2014-04-06 22:20:24

我终于明白了......这是iPage服务器上我的php.ini文件的问题。出于某种原因,他们将其设置为

session.save_path = "/var/php_sessions" 

它应该是我的文档根目录。这不是他们第一次搞砸了。

+1

如果我正确地阅读了这个[php文档页面](http://www.php.net/session.configuration),'session.save_path'应该默认为'“”'我的本地计算机上的'' – dsdsdsdsd 2013-12-10 16:57:26

+0

(php 5.3), 'session.save_path =“C:\ SERVER \ tmp”',但在我的虚拟主机上它和Sean的一样:'session.save_path =“/ var/php_sessions”'......将它改为'“” '工作。 – dsdsdsdsd 2013-12-10 16:59:11

+1

这是错误信息!您不希望将您的会话存储在文档根目录中。除非文件权限正确,否则它会公开公开所有会话。 – geekdenz 2016-12-02 08:06:32

我正在运行httpd作为另一个用户(不是apache)。在检查/etc/php.ini时,我发现“会话目录必须由进程所有者拥有”。因此,在/etc/httpd/conf.d/php.conf我改变了以下内容:

php_value session.save_path "/var/lib/php/session" 
php_value soap.wsdl_cache_dir "/var/lib/php/wsdlcache" 

php_value session.save_path "/home/[httpduser]/php/session" 
php_value soap.wsdl_cache_dir "/home/[httpduser]/php/wsdlcache" 

并重新加载的httpd。

不知道,如果它是一个更好的主意来改变的/ var/lib中/ PHP的店主[httpduser]