PHP会话无法正常工作

时间:2011-01-06 11:59:57

标签: php session iframe wamp

我正在使用wamp2.0 - PHP 5.3,apache 2.2.11,但我的会话没有存储数据。

我有一个接受参数的页面,我想在会话中存储(简化版本),所以当我来到

http://www.example.com/home.php?sessid=db_session_id

脚本如下:

session_start();

$sessid = @$_GET['sessid'];
if ($sessid) {
  $_SESSION['sessid'] = $sessid;
}
var_dump($_SESSION);

和输出:

array(1) { [0]=> string(13) "db_session_id" } 

这很好,但是当我转到link(没有sessid参数)时,$_SESSION数组为空。我在尝试在没有参数的情况下访问页面之前尝试评论$_SESSION['sessid'] = $sessid;行,但它仍然没有用。

我已检查session_id()输出,会话ID保持不变。

来自phpinfo()的会话设置

Session Support enabled
Registered save handlers    files user
Registered serializer handlers  php php_binary wddx

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   no value    no value
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删除。我不知道为什么,但什么时候   评论说,会议工作正常。事实是,iframe必须留下来   那里(当然是坏的,但我无能为力)。   嗯...你知道任何变通办法来解决问题吗?   用iframe?

9 个答案:

答案 0 :(得分:2)

这是一个老问题,但我带着同样的问题来到这里。由于问题没有得到解答,所以我发现了它。

我有类似的问题,在我的情况下问题是我没有在使用会话的所有页面中调用session_start()。我想我应该只在“登录”页面中调用它,但事实并非如此。

此外,请记住必须在session_start()代码之前调用<html>

答案 1 :(得分:2)

您必须在每个页面中调用session_start();命令。它对我有用。在将任何输出(html,输出,甚至空格)发送给用户之前,您还必须调用此方法。

答案 2 :(得分:1)

如果你遇到类似的问题,我发现这是一个非常值得的测试。在浏览器中运行一些请求,看看你得到了什么。

<?php

session_start();

$_SESSION['test'][] = time();

header('Content-type: text/plain');
print_r($_SESSION);

致作者:您的上一条评论提到您的脚本正常运行 - 对您有好处。如果它破了,那么试试上面的代码,让我知道你得到了什么。

答案 3 :(得分:1)

只有当相对于同一个域时,帧才能访问该会话。例如:

<? 
$_SESSION["foo"]="foo"; 
?><html> 
 <body> 
  <iframe src ="test.php" width="200" height="200"></iframe> 
 </body> 
</html> 
<? 
print_r($_SESSION); 
?>

应该在iframe外部和内部工作。如果您仍有问题,请尝试:

 <?php  session_start();

    $sessid = $_GET['sessid'];
    if (isset($sessid) && $sessid != "" && $sessid != NULL) {
      $_SESSION['sessid'] = $sessid;
    }
    print_r($_SESSION);?>

答案 4 :(得分:1)

今天我花了大约四个小时没有在服务器上保存$ _SESSION。 结果证明是一个服务器问题。系统(Windows 2003,IIS 6)使用Windows默认临时文件夹C:\ Windows \ Temp \来存储会话。它创造了它,但它是空的。

出于某种原因,它刚停止工作(之前没有问题)。我最好的猜测是它达到了一些限制或文件夹只包含太多文件。 我通过将session.save_path设置为另一个文件夹来对其进行排序。

答案 5 :(得分:0)

我只能从那里发生的事情中猜出你的会话没有被存储。你的session.save_path - &gt; c:/ wamp / tmp一个可写(取消选中只读属性)文件夹? apache是​​以管理员身份运行还是具有足够权限的某个级别,可以在控制面板中的管理员工具中写入服务中的该文件夹?

实际上,请检查:PHP session vars not being maintained。本质上,在该页面上运行session_id()两次并比较会话ID。如果它们不同,那么您的浏览器不接受会话cookie。

编辑:没有意识到你已经这样做了。 ^

这可能会有所帮助。 Link&lt; ---用会话的调试代码查看第二个建议/答案。

答案 6 :(得分:0)

http://php.net/manual/en/function.session-start.php

你必须在$ _SESSION全局数组中放置一些东西才能注册任何东西,否则它就是空的......

由于您正在测试是否存在sessid以将其添加到$ _SESSION,因此$ _SESSION仍为空。

尝试类似:

session_start();
$_SESSION['sessid'] = 123456789;
var_dump($_SESSION);

答案 7 :(得分:0)

...

可能是因为您本身并未使用域名?在您的问题中,您使用的是example.com,但是您正在本地计算机上进行开发。我假设您使用的是localhost。

您应该知道无法在localhost上设置Cookie,例如:Cookies on localhost with explicit domain

您是否在其他主机上尝试过代码?

http://blog.perplexedlabs.com/2008/12/21/php-sessions-on-localhost/

答案 8 :(得分:0)

我不知道这是否是你问题的原因(错误抑制@似乎有点不合适......),但我会简化一点。

所以而不是:

$sessid = @$_GET['sessid'];
if ($sessid) {
  $_SESSION['sessid'] = $sessid;
}

我会用:

if (isset($_GET['sessid']))
{
  $_SESSION['sessid'] = $_GET['sessid'];
}

顺便说一下,我还会对$_GET['sessid']进行一些输入检查,以确保它只包含允许的字符。