3

我有一个使用会话变量的应用程序没问题。我在使用 when 的每个页面上的标题之前开始会话,它一直很好,然后当我导航到设置会话变量的页面以外的页面时,似乎突然之间我遇到了未定义的索引错误。但仅在某些浏览器上。有时会保留会话,有时则不会。

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

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

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

我将 PHP 5.3.0 与 WAMP 堆栈一起使用。阿帕奇 2.2.11。在我的 phpinfo() 中启用了会话支持。

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

<?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 标头,问题似乎解决了!

4

6 回答 6

3

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

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

于 2010-12-05T12:17:23.800 回答
3

我对您之前问题的建议仍然有效:请比较会话 ID。

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

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

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

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

于 2010-12-05T14:03:00.067 回答
1

这就是意义

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

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

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

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

于 2010-12-05T11:26:54.950 回答
1

检查您的会话设置。你有一个完整的列表:

<?php

phpinfo();

?>

向下滚动到“会话”表。

特别是,确保session.save_path目录存在并且是可写的。

于 2010-12-05T12:18:10.773 回答
0

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

session_set_cookie_params(0, "/app", ".domain.com");//set session cookie parameters
session_save_path("/home/../public_html/app/sess");//set directory of this app's session data
session_start();//start session

我希望对每个遇到这个问题的人有所帮助。#代码开启

于 2016-11-30T09:40:24.660 回答
0

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

于 2018-08-04T18:36:16.990 回答