Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php start_session()应该始终放在页面的开头,而不是放在if/else子句中吗?_Php - Fatal编程技术网

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

Php start_session()应该始终放在页面的开头,而不是放在if/else子句中吗?,php,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($

这是我网站的
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';
    }
}
?>

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

首先在页面顶部启动会话,并检查在
session\u start()之前是否没有任何空间。

或者你也可以这样做

session_start()之前启动时
write
ob_start()并在页面末尾写入
ob_flush()
使用
ob_start
缓冲输出。这将阻止
会话\u start()
立即发送头,并使其等待到请求结束


这将有助于

是会话,会话启动();应该始终从您正在实施会话相关活动的每一页的顶部开始。而不是在条件下(如果、同时,…)
要检查会话是否存在于特定页面中,您可以使用isset($\u session)

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

请考虑您的代码应该合理缩短多少:

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

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

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

请在
$\u会话
上执行
var\u转储
,查看它包含的内容。我认为错误在于逻辑

session\u start()
通常在页面开头调用,以确保尚未发送任何输出。这将抛出一个错误。我不认为这是你的问题

编辑一个 但是,您应该始终尝试在最顶端调用
会话\u start
,因为这是公认的/良好的做法。这还可以确保所包含的任何需要
$\u SESSION
的脚本都可以工作,而不必显式检查会话

编辑两个
要真正回答问题的标题,只要您在访问
$\u session
之前调用
session\u start
,在哪里调用它并不重要。但是,请参阅我的第一次编辑。

您应该在页面顶部启动会话,我不明白为什么您需要条件来初始化该会话,如果需要,只需创建一个会话变量,其值为
true
false
,然后基于这些条件,你可以简单地执行相关的代码。嗨,外星人先生,有一部分代码被遗漏了,我在两个版本中都添加了它。无论如何,你是对的,最好在页面顶部用start_session()开始,谢谢。@tas9注册不需要会话吗?添加这个。。。if(!$jump){session_start();var_dump($_session);if(…为了检查块是否正在运行,以及$u SESSIONHi@frostymarvelous的内容,在我的网站signup.php中-新用户表单-在新用户成功完成并发送表单之前不需要会话,在另一个.php文件中检查,这是一个转录错误,我添加了isset()函数对代码的作用
<?php
session_start(); 
$session = isset($_SESSION['myusername']));

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

if (!$jump)
{
    include ($session ? 'main.php' : 'login.php'); 
}
?>
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