2011-04-05 113 views
0

我有一个自定义页面路由系统的PHP网站。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

你也可以把整个代码。 – Robik 2011-04-05 17:21:33

+0

那么,根据这个手册http://php.net/manual/en/function.session-start.php session_start()返回FALSE如果会议无法启动。尝试检查它的结果。 – Wh1T3h4Ck5 2011-04-05 17:24:54

回答

1

的问题是从一个缺少favicon.ico的文件来这是触发404页每页加载后加载。

+0

这是如此奇怪,但确实造成了我所有的问题。 – Hobbes 2017-03-30 17:18:24

0

你需要把session_start();在脚本的开头,这种方式会话在您的大交换语句中需要时开始(并且可用)。

+1

谢谢你的回答。我认为我不需要switch语句的会话。 switch语句使用基于请求的URI的$ page_uri。 switch语句的作用是定义$ page_id。 – Enkay 2011-04-05 17:10:19

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 
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); 
} 
+0

这个想法是给$ previous_page_id存储在会话中的$ page_id。由于将会话设置为当前$ page_id的代码在后,会话应该具有之前的'$ page_id。 – Enkay 2011-04-05 17:18:31

+0

@Enkay,试试我更新的代码。 – Shoe 2011-04-05 17:20:02

+0

看来你已经更新了你的答案来添加代码。你在哪里设置会话为$ page_id。这不会总是给我一个空的$ previous_page_id吗? – Enkay 2011-04-05 17:20:34