start_session()应该始终放在页面的开头而不是if / else子句吗?

时间:2013-11-25 11:14:26

标签: php

这是我网站的index.php文件。

<?php
$jump=false;
if (isset($_GET['pg']))
    if ($_GET['pg']=="signup") {
        include 'signup.php';
        $jump=true;
    }
if (!$jump)
{
    session_start(); 
    //Has the session been started? If not, 
    if ( isset($_SESSION['myusername']) ) {
        include 'main.php'; 
    }
    else {
        include 'login.php';
    }
}
?>

首次进入网站时,会执行include 'login.php;,然后转到 login.php 。在那里,如果您成功登录,则设置$_SESSION['myusername']="foo"并将您重定向到 index.php ,其中如果将if ( $_SESSION['myusername']) )评估为 true 并包含 main.php 即可。 好吧,代码在远程服务器中的本地服务器中工作正常,if ( $_SESSION['myusername']) )评估错误,它从不包含 main.php

过了一段时间,我稍微更改了代码,推进了session_start()的执行:

<?php
session_start(); 
if (isset($_SESSION['myusername']))
    $session = true;
else
    $session=false;

$jump=false;
if (isset($_GET['pg']))
    if ($_GET['pg']=="signup") {
        include 'signup.php';
        $jump=true;
    }

if (!$jump)
{
    //Has the session been started? If not, 
    if ( $session ) {
        include 'main.php'; 
    }
    else {
        include 'login.php';
    }
}
?>

所以问题是:我是否应该始终在代码的开头执行session_start()并避免在if(else / while / while子句)中执行它(嵌套)?为什么它在本地服务器上工作但在远程服务器上无法继续?

4 个答案:

答案 0 :(得分:0)

首先在页面顶部开始会话,检查session_start()

之前是否没有空格

或者您也可以这样做

session_start()写入ob_start();之前开始,在页面末尾写ob_flush(); 使用ob_start缓冲输出。这可以防止session_start()立即发送标头,并使其等到请求结束。

这将有助于

答案 1 :(得分:0)

是会话,session_start();应始终从您实现会话相关活动的每个页面的顶部开始。而不是在条件中执行它(if,while,...) 要检查特定页面中是否存在会话,您可以使用isset($ _ SESSION)

答案 2 :(得分:0)

是的,它应该在每个页面上,否则它将丢失,这可能取决于服务器的会话实现。

请考虑合理缩短代码的数量:

<?php
session_start(); 
$session = isset($_SESSION['myusername']));

$jump=isset($_GET['pg']));

if (!$jump)
{
    include ($session ? 'main.php' : 'login.php'); 
}
?>

答案 3 :(得分:0)

if ( $_SESSION['myusername'] ) //will return false if $_SESSION is falsey (empty string, null, 0 etc)

if ( isset($_SESSION['myusername']) ) //will return true as long as the key is set

请在var_dump$_SESSION查看其中包含的内容。我相信错误在于逻辑。

session_start()通常在页面开头调用,以确保没有输出。这会引发错误。我不认为这是你的问题。

编辑一个 但是,您应该始终尝试在最顶层调用session_start,因为这是接受/良好做法。这还可以确保包含任何需要$_SESSION的脚本,而无需明确检查会话。

编辑两个 要真正回答问题的标题,只要您在访问session_start之前致电$_SESSION,无论您在何处调用它都无关紧要。但是,请参阅我的第一次编辑。