仅包含$ _SESSION和$ _GET的会员页面

时间:2012-06-15 21:59:15

标签: php if-statement

代码:

<?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是模板本身。 Eval是必需的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?action = login?我正在尝试这样做,以便未登录的用户无法访问“概述”页面。

谢谢。

1 个答案:

答案 0 :(得分:1)

问题在于你的if / 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