PHP会话变量在页面之间变化

时间:2010-09-18 21:53:50

标签: php session session-variables

我有一个我设置的会话变量:

<?php
$token = md5(uniqid(rand(), true));
session_start();
$_SESSION['token'] = $token;
print $_SESSION['token'];
?>

然后在另一页上我有这个:

<?php
session_start();
print $_SESSION['token'];
?>

问题在于它们不匹配。我得到两个完全不同的字符串。 register_globals已关闭。我注意到当我将md5(....)设置为常量字符串时,例如:md5('example')它按预期工作,两个字符串匹配。但那应该不重要。关于这里发生了什么的任何想法?

编辑:Apache Acces Log:

127.0.0.1 - - [18/Sep/2010:17:46:09 -0500] "GET /index.php HTTP/1.1" 200 3182 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3"
127.0.0.1 - - [18/Sep/2010:17:46:09 -0500] "GET /style/style.css HTTP/1.1" 304 - "http://cmb.local:8888/index.php" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3"
127.0.0.1 - - [18/Sep/2010:17:46:09 -0500] "GET /js/signup.js HTTP/1.1" 304 - "http://cmb.local:8888/index.php" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3"
127.0.0.1 - - [18/Sep/2010:17:46:09 -0500] "GET /index.php HTTP/1.1" 200 3182 "http://cmb.local:8888/index.php" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3"
127.0.0.1 - - [18/Sep/2010:17:46:10 -0500] "GET /index.php HTTP/1.1" 200 3182 "http://cmb.local:8888/index.php" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3"

我不太清楚如何阅读,但它在我看来我的文件(我假设的索引为'/'的index.php)被调用了三次。我读得对吗?那里发生了什么?

4 个答案:

答案 0 :(得分:3)

我的完全愚蠢的错误。我在那里有一些空的<img>标签导致了额外的请求。 facepalm 对不起大家,问题解决了。谢谢你的帮助!!

答案 1 :(得分:2)

我能想到的唯一解决方案是你在不知情的情况下向第一页发出第二个请求。您应该检查您的apache访问日志以进行第二次访问...

制作一个简单的请求计数器将是检查此问题的另一种解决方案:

$_SESSION['counter'] = isset($_SESSION['counter'])? $_SESSION['counter'] +1 : 0;

答案 2 :(得分:2)

您会注意到,每次重新访问第一页时,您的会话变量都会发生变化。由于它适用于常量字符串'example',我将假设您重新访问第1页以查看存储在那里的内容。

修复可能是检查以确保在再次设置之前未设置该会话变量。 即。

<?php
session_start();
if(!empty($_SESSION['token'])){
    $token = md5(uniqid(rand(), true));
    $_SESSION['token'] = $token;
}
print $_SESSION['token'];
?>

这段代码应该按预期工作。

答案 3 :(得分:1)

看起来很奇怪。重置令牌的第一块代码必须以某种方式再次运行。