2012-06-15 35 views
0

代碼頁:

<?php 
//initializing script, do not modify 
session_start(); 
define('IN_SCRIPT', true); //so that global.php cannot be accessed directly 
$_SCRIPTNAME = 'default.php'; 
include 'global.php'; 
$db = new MyDB(); //mysql class 
if(isset($_GET['action'])) { 
    $action = $_GET['action']; 
} elseif(isset($_SESSION['user']) && $action == "login") { 
    header("Location: {$_SCRIPTNAME}?action=overview"); 
    exit; 
} elseif($action == 'logout') { 
    session_unset(); 
    header("Location: {$_SCRIPTNAME}?action=login"); 
    exit; 
} else { 
    header("Location: {$_SCRIPTNAME}?action=login"); 
    exit; 
} 

//display proper template for the action defined (if none found, 404) 
$template = $db->selectFrom("template", null, array("name" => mysql_real_escape_string($action))); 
if(!empty($template['result']['0'])) { 
    $template = $template['result']['0']; 
    eval("echo \"".$template['html']."\";"); 
} else { 
    $template = $db->selectFrom("template", null, array("name" => "404")); 
    $template = $template['result']['0']; 
    eval("echo \"".$template['html']."\";"); 
} 
?> 

在數據庫中,我有一個表templates與格式name/html一對夫婦行,其中name是模板的名稱和html是模板本身。評估是必需的AFAIK和模板中沒有用戶輸入,所以它應該是安全的。

樣本網址是:http://localhost/default.php?action=login

我的問題是:爲什麼會

if(isset($_GET['action'])) { 
    $action = $_GET['action']; 
} elseif(isset($_SESSION['user']) && $action == "login") { 
    header("Location: {$_SCRIPTNAME}?action=overview"); 
    exit; 
} elseif($action == 'logout') { 
    session_unset(); 
    header("Location: {$_SCRIPTNAME}?action=login"); 
    exit; 
} else { 
    header("Location: {$_SCRIPTNAME}?action=login"); 
    exit; 
} 

不是重定向到如default.php行動=登錄,如果「用戶」會議沒有設定和動作?是不是註銷?我試圖做到這一點,因此用戶未登錄無法訪問「概述」頁面。

謝謝。

+0

一開始我認爲這是錯誤的:$行動==「登錄」){ 它不應該是$ _GET [「行動」] ==「登錄」? $ action被初始化,但第一個'elseif'還不知道它。 – 2012-06-15 22:05:50

回答

1

問題是與你如果/ ELSEIF塊。

您需要將$action定義與塊分開:

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

if(isset($_SESSION['user']) && $action == "login") { 
    header("Location: {$_SCRIPTNAME}?action=overview"); 
    exit; 
} elseif($action == 'logout') { 
    session_unset(); 
    header("Location: {$_SCRIPTNAME}?action=login"); 
    exit; 
} else { 
    header("Location: {$_SCRIPTNAME}?action=login"); 
    exit; 
} 

的方式你的代碼是現在,它將執行if(isset($_GET['action']))塊,然後忽略,因爲這些塊的其餘全部elseif秒。

+0

現在,它有一個重定向循環:)讓我來研究它,它比我更進一步。 +10,對於2k只需要幾個! – Steve

+0

得到它的工作,最後'else'需要'elseif($ action!=「login」){'。謝謝你,在15分鐘的時間內接受答案! – Steve

+0

@dynamic只要確保處理了'action = overview'情況。 – gcochard