php会话奇怪的行为

时间:2011-04-05 16:57:43

标签: php session routes

我有一个带有自定义页面路由系统的PHP网站。

php脚本检查请求的uri并使用switch case来确定需要加载哪个页面。每个页面都有自己的$page_id

这是一个简化版本。

$page_uri =  //code that extracts the relevent part of the uri

switch($page_uri){

case 'about':
  $page_id = 'about';
  break

case 'products':
  $page_id = 'products';
  break;

default:
  $page_id = '404';
  break;

}

include 'sessions.php'; //explanation about this after the code

include $page_id; //code that loads the page based on the $page_id

对于网站的某个功能,我需要知道之前访问过的网页的$page_id

我正在使用会话。

session_start();
$previous_page_id = $_SESSION['current_page_id'];
$_SESSION['current_page_id'] = $page_id;

因此,在会话变量更新为当前$page_id之前,我将存储在$previous_page_id变量中的会话变量中的先前$page_id

问题在于它不起作用。 $previous_page_id总是等于默认的$page_id,即404.我知道实际的路由功能是有效的,因为正确的页面被加载,如果我在存储它之后立即回显会话的值,它是正确的。

我注意到如果我把以下部分放在其他所有部分之前,我可以得到正确的$previous_page_id

session_start();
$previous_page_id = $_SESSION['current_page_id'];

我错过了什么?你能想到我的代码或逻辑有什么问题吗?在PHP会话方面,我应该注意一些奇怪的怪癖吗?

感谢。

更新

似乎在页面顶部添加session_start(); echo $_SESSION['current_page_id'];会使值保持不变。否则,当我将会话值转移到sessions.php中的$previous_page_id时,会话值已更改为404。

任何人都可以理解这一点吗?

4 个答案:

答案 0 :(得分:1)

问题来自缺少的favicon.ico文件,该文件在每次加载页面后触发404页面加载。

答案 1 :(得分:0)

你需要把session_start();在脚本的开头,当你在big switch语句中需要它时,会话就会启动(并且可用)。

答案 2 :(得分:0)

您忘记在包含中添加.php扩展名(+一些较小的内容)。并且请记住,在使用它之前必须在调用时调用session_start。因此,您需要在开始时调用它或在开始时包含会话。

所以看起来应该是这样的:

session_start();

$page_uri =  //code that extracts the relevent part of the uri

switch($page_uri){

case 'about':
  $page_id = 'about';
  break;

case 'products':
  $page_id = 'products';
  break;

default:
  $page_id = '404';
  break;

}  

$previous_page_id = $_SESSION['current_page_id'];
$_SESSION['current_page_id'] = $page_id;

include $page_id . '.php'; //code that loads the page based on the $page_id

答案 3 :(得分:0)

session_start();
$previous_page_id = $_SESSION['current_page_id'];
$_SESSION['current_page_id'] = $page_id;

我真的不明白。 $previous_page_id$page_id相等。 你将它们设置为相等。

您应该在switch语句之后设置它,如下所示:

$page_uri =  //code that extracts the relevent part of the uri

if (file_exists('sessions.php')) {
    include 'sessions.php';
} else {
    trigger_error("'sessions.php' not found", E_USER_ERROR);
}

switch($page_uri) {

case 'about':
  $page_id = 'about';
  break

case 'products':
  $page_id = 'products';
  break;

default:
  $page_id = '404';
  break;

}

if (isset($_SESSION['current_page_id'])) {
    $_SESSION['current_page_id'] = $page_id;
} else {
    trigger_error("'current_page_id' key not set", E_USER_ERROR);
}

if (isset($page_id)) {
    include $page_id;
} else {
    trigger_error("'page_id' not set", E_USER_ERROR);
}

sessions.php

$ss = session_start();
if (!$ss) { trigger_error("Session couldn't be started", E_USER_ERROR); 
if (isset($_SESSION['current_page_id'])) {
    $previous_page_id = $_SESSION['current_page_id'];
} else {
    trigger_error("'current_page_id' key not set", E_USER_ERROR);
}