我有一个带有自定义页面路由系统的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。
任何人都可以理解这一点吗?
答案 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);
}