PHP会话变量未被维护

时间:2010-12-05 11:21:04

标签: php cookies session-variables wamp session-cookies

我有一个使用会话变量的应用程序没问题。我在每个使用的页面上的标题之前启动会话,它一直很好然后突然间,当我导航到设置会话变量的页面以外的其他页面时,我得到一个未定义的索引错误。 但仅限某些浏览器。有时会话会被​​维护,有时则不会。

似乎某些时候没有存储cookie。我已经使用不同的浏览器进行了检查,有时会存储cookie,有时则不会。

我做了一个实验。我使用firefox来使用应用程序,我一直关注存储会话的tmp文件夹。我把它清理干净了。使用firefox我开始使用应用程序,使用会话正在使用的所有页面,最后我检查了tmp文件夹,并且它有一个会话文件。

与Internet Explorer完全相同,现在有7种不同的会话文件。

我正在使用带有WAMP堆栈的PHP 5.3.0。 Apache 2.2.11。在我的phpinfo()中启用了会话支持。

我在第一页调用var转储并打印出会话数据。在任何后续页面上,会话变量都是空的。

<?php var_dump($_SESSION); ?>

array(0){}

任何人都可以帮我找到解决方法吗?

更新 - PHP INI会话设置

Directive        Local Value     Master Value
session.auto_start Off           Off 
session.bug_compat_42 On         On 
session.bug_compat_warn On       On 
session.cache_expire 180         180 
session.cache_limiter nocache    nocache 
session.cookie_domain 82.68.26.169   82.68.26.169 
session.cookie_httponly Off      Off 
session.cookie_lifetime 0        0 
session.cookie_path /            / 
session.cookie_secure Off        Off 
session.entropy_file no value    no value 
session.entropy_length 0         0 
session.gc_divisor 1000 1000 
session.gc_maxlifetime 1440      1440 
session.gc_probability 1         1 
session.hash_bits_per_character 5 5 
session.hash_function 0 0 
session.name PHPSESSID           PHPSESSID 
session.referer_check no value   no value 
session.save_handler files       files 
session.save_path c:/wamp/tmp    c:/wamp/tmp 
session.serialize_handler php    php 
session.use_cookies On           On 
session.use_only_cookies On      On 
session.use_trans_sid 0          0 

更新 - 解决方案

因为我的应用程序使用iframe从另一个域(我创建的)拉入页面,我试图设置的cookie被阻止。设置一个P3P标题,问题似乎已经解决了!

6 个答案:

答案 0 :(得分:3)

您是否在访问会话数据的每个页面上调用session_start()

编辑:你每次都收到相同的会话ID吗? 此外,由于设置原因,您是否会遗漏某些错误或警告(例如标头已发送)?

答案 1 :(得分:3)

your previous question的建议仍然有效:请比较会话ID。

解决方案可能就像浏览器不接受会话cookie一样简单。

您可以通过调用session_id()来检索会话ID。在session_start()之后立即执行此操作,它应该为您提供一个恒定值如果会话相同。否则,对于每个请求,都会实例化一个新会话。

同时检查C:\wamp\tmp。此目录中的大量文件可能表示每个请求的新会话。

编辑由于我们已经确认了每个请求的新会话,因此需要确定是否接受了会话Cookie。检查浏览器的设置并确认可以找到名称为PHPSESSID的域名(我猜它是“localhost”)的cookie。

答案 2 :(得分:1)

这是

中的感觉
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
{
  $_SESSION['saveddata'] = $row;
}

它会在每次迭代时重写$_SESSION['saveddata']值。可能你的意思是

 $_SESSION['saveddata'][] = $row;

$atid = $_SESSION['saveddata']['autotaskid'];

有意义

答案 3 :(得分:1)

查看会话设置。您有一个完整列表:

<?php

phpinfo();

?>

向下滚动到“会话”表。

特别要确保session.save_path目录存在且可写。

答案 4 :(得分:0)

当为每个请求创建新会话ID时,很可能是会话路径(save_path和cookie_path)存在问题,如果您在一台服务器上托管不同的应用程序(共享主机),则发生这种情况的可能性会更大其中一些应用程序也实现了会话。 这会导致/ tmp目录中出现冲突。 您可以更改ini文件的配置,但最好在运行时配置这些参数。

SELECT
  DISTINCT
  customer_rk,
  max(monthly_income_amt),
  min(monthly_income_amt),
  max(monthly_income_amt) / min(monthly_income_amt) AS income_ratio
FROM asql.individual_customer
WHERE middle_nm LIKE '%ВИЧ'
GROUP BY customer_rk
HAVING income_ratio > 2;

我希望能帮助每个人解决这个问题。 #CodeOn

答案 5 :(得分:0)

我通过清除旧会话的\ tmp目录在本地WAMP上解决了此问题。