不确定我是否有一个独特的问题,或者只是无法在谷歌上找到正确的条款来找到它,但我的问题是处理未定义的变量而无法检查它。
在我的网站上我有一个包含所有菜单内容的php文件,然后根据需要回显各个部分。我的问题是其中一个菜单选项显示当前登录的用户。当然,如果未登录,则未设置,这会导致日志文件中出现未定义的错误。
这是结构:
static.php:
<?php
$menu='
<ul class="menu">
<li class="menu"><a href="#">Home</a></li>
<li class="menu"><a href="#">Option</a></li>
</ul>';
$usermenu='
<ul class="usermenu">
<li class="menu"><a href="#">'.$_SESSION['user_name'].'</a></li>
<li class="menu"><a href="#">Change Pass</a></li>
<li class="menu"><a href="#">Logout</a></li>
</ul>';
的index.php:
<?php include 'static.php';
echo "$menu";
if ($login->isUserLoggedIn() == 'true') {
echo "$usermenu";
}
if ($login->isUserAdmin() == 'true') {
echo "$usermenuadmin";
}
?>
如您所见,$_SESSION['user_name']
位于静态文件中,因此如果您未登录,则不会设置它并产生错误。
通常我只会使用if (!session_status() == PHP_SESSION_NONE) {}
,但由于它位于中间,我无法将其放在那里。
解决这个问题的一种方法是为这样的事情设置一个单独的静态文件,并且只有在设置会话时才包含它,但是我必须在许多页面上更改代码并且必须有一个单个条目的单独文件。
我在这里遗漏了什么,或者有一种简单的方法可以解决这个问题吗?从我在网上找到的内容来看,不可能回显出PHP代码,因此可以防止任何正常的修复方法。
编辑:解决了,请看下面的答案!
答案 0 :(得分:0)
请使用 isset($var) 检查变量是否已声明/设定。
if(isset($_SESSION) && isset($_SESSION['user_name']))
所以,你的static.php看起来如下,
$usermenu='';
if(isset($_SESSION) && isset($_SESSION['user_name']))
{
$usermenu='<ul class="usermenu">
<li class="menu"><a href="#">'.$_SESSION['user_name'].'</a></li>
<li class="menu"><a href="#">Change Pass</a></li>
<li class="menu"><a href="#">Logout</a></li>
</ul>';
}
如果未设置$ _SESSION和$ _SESSION ['user_name'],则在 $ usermenu 中将有一个空字符串。
作为替代方案,您可以调用 @isset 以避免PHP错误日志中出现警告
严肃的程序代码将使用更复杂的函数集来检查用户是否已登录。
答案 1 :(得分:0)
您没有在static.php文件中使用session_start();
并使用isset()
来检查变量或索引集:
修改后的代码:
<?php
session_start();
$menu='
<ul class="menu">
<li class="menu"><a href="#">Home</a></li>
<li class="menu"><a href="#">Option</a></li>
</ul>';
$usermenu='
<ul class="usermenu">
<li class="menu">
<a href="#">
'.(isset($_SESSION['user_name']) ? $_SESSION['user_name'] : "Guest") .'
</a></li>
<li class="menu">
<a href="#">Change Pass</a></li>
<li class="menu"><a href="#">Logout</a></li>
</ul>';
答案 2 :(得分:0)
朋友向我指出了我忽略的超级简单解决方案。
if (isset($_SESSION['user_name'])) {
$usermenu=' <ul class="usermenu">
}
在宣布$usermenu
之前,我没想过要这样做。星期一...
答案 3 :(得分:0)
您的代码构建方式并不好。
我认为它依赖于会话自动启动或包含session_start()的代码,但您没有向我们展示。
至少包含文件在包含时不会直接生成输出。我会将包含文件更改为...
<?php
function menu($authuser, $isadmin)
{
print '<ul class="menu">
<li class="menu"><a href="#">Home</a></li>
<li class="menu"><a href="#">Option</a></li>
</ul>';
if ($authuser) {
print '<ul class="usermenu">
<li class="menu"><a href="#">'.$authuser.'</a></li>
<li class="menu"><a href="#">Change Pass</a></li>
<li class="menu"><a href="#">Logout</a></li>
</ul>';
}
if ($isadmin) {
...
}
}