这是我网站的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子句)中执行它(嵌套)?为什么它在本地服务器上工作但在远程服务器上无法继续?
答案 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
,无论您在何处调用它都无关紧要。但是,请参阅我的第一次编辑。