2

我注意到当 php if 语句中的两个条件之一不正确时。对于不正确的语句,您会收到未定义的索引通知。在我的情况下,结果是一个扭曲的网页。例如,这段代码:

<?php
session_start();

if (!isset($_SESSION['loginAdmin']) && ($_SESSION['loginAdmin'] != '')) {
    header ("Location: loginam.php");
} else {
    include('head2.php');
}



if (!isset($_SESSION['login']) && ($_SESSION['login'] != '')) {
    header ("Location: login.php");
} else {
    include('head3.php'); 
}
?>    

如果其中一个 if 语句不正确。不正确的会通知您它是未定义的。在我的情况下,它说没有定义会话“登录”。如果使用会话“LoginAdmin”。为了避免这些未定义的索引通知,您可以建议我做什么。

编辑 这是我检查输入信息是否正确的地方,对于那些询问的人。即使登录信息正确,它也会始终重定向到登录页面:

$uname = mysql_real_escape_string($_POST['ausername']);
        $pword = mysql_real_escape_string($_POST['apassword']);
        $idnam= mysql_real_escape_string($_POST['aydi']);

        $SQL = "SELECT * FROM admin WHERE  ID= '$idnam' AND admin = '$uname' AND admin_password = '$pword'";
        $result = mysql_query($SQL);
        $num_rows = mysql_num_rows($result);



        if ($result) {
            if ($num_rows > 0) {
                session_start();
                $_SESSION['loginAdmin'] = "1";
                header ("Location: ampage.php");
            }
            else {
                session_start();
                $_SESSION['loginAdmin'] = "";
                header ("Location: loginam.php");
            }   
        }
        else {
            $errorMessage = "Error logging on, please try again.";
        }
4

8 回答 8

4

你的情况不对,应该是:

if (!isset($_SESSION['loginAdmin']) || ($_SESSION['loginAdmin'] == '')) {
    header ("Location: loginam.php");
} else {
    include('head2.php');
}

和:

if (!isset($_SESSION['login']) || ($_SESSION['login'] == '')) {
    header ("Location: login.php");
} else {
    include('head3.php'); 
}

替换&&||!=替换为==

对于不正确的语句,您会收到未定义的索引通知。

情况并非如此,当您有一些未定义的变量时,您会收到通知消息。您可以使用抑制运算符来避免这种情况,@但使用它不是一个好主意,因为它会降低性能。

您还可以通过将其放在脚本顶部来隐藏通知消息:

error_reporting(E_ALL ^ E_NOTICE);

但是在开发过程中,您必须注意所有错误和注意事项,因此除非您确定自己在做什么,否则这又不是一个好主意。

于 2010-05-25T10:44:32.190 回答
3

我想你的意思是:

if (isset($_SESSION['loginAdmin']) && $_SESSION['loginAdmin'] != '') {
    //variable exists and is not empty
    include('head2.php');
} else {
    //variable does not exist or is empty
    header ("Location: loginam.php");
}
于 2010-05-25T10:48:28.283 回答
1

你的条件很奇怪。
例如:!isset($_SESSION['login']) && ($_SESSION['login'] != '')
首先,您检查会话变量中是否未设置“登录”!isset($_SESSION['login'])
因此,如果未设置,您还将检查第二个条件,即您尝试访问未设置的“登录”索引。

也许你的意思是这种情况?
if (!isset($_SESSION['login']) || ($_SESSION['login'] == ''))
如果未设置登录名,或者它为空,则重定向到登录名,
否则重定向到头 3。

于 2010-05-25T10:49:57.060 回答
0

1) 使用 || (OR) 而不是 && (AND)。
2) 将 != 更改为 ==

于 2010-05-25T10:45:36.743 回答
0

你不想要isset($_SESSION['login'])(没有“!”)吗?

if (!isset($_SESSION['login']) && ($_SESSION['login'] != '')) {

$_SESSION['login']如果您已经知道它没有设置,那么测试它没有多大意义。如果您删除“!”,它会消除通知,因为isset它会静音,并且在未设置索引时永远不会评估第二个条件。

于 2010-05-25T10:48:20.213 回答
0

如果会话未设置 ( !isset($_SESSION['loginAdmin'])),则 if 语句中的第二个条件实际上是不必要的,因为它们永远不会为真。您不能有一个未定义的变量(第一个条件)和一个值(第二个条件)。

发生错误是因为您在第二个条件(在 之后&&)中测试的变量不存在。

试试这个:

<?php
session_start();

if (!isset($_SESSION['loginAdmin'])) {
    header ("Location: loginam.php");
    exit;
} else {
    include('head2.php');
}



if (!isset($_SESSION['login'])) {
    header ("Location: login.php");
    exit;
} else {
    include('head3.php'); 
}
?>

我包括exit在您的标头调用之后,否则代码将继续运行,可能会导致未定义的行为。

于 2010-05-25T10:48:52.740 回答
0

操作员评估的快速示例:

function returnFalse() { echo "returning false\n"; return false; }
function returnTrue() { echo "returning true\n"; return true; }

echo "false && true\n";
if (returnFalse() && returnTrue()) {
    echo "True!\n";
} else {
    echo "False!\n";
}

echo "\ntrue && false\n";
if (returnTrue() && returnFalse()) {
    echo "True!\n";
} else {
    echo "False!\n";
}

echo "\ntrue && true\n";
if (returnTrue() && returnTrue()) {
    echo "True!\n";
} else {
    echo "False!\n";
}

该实验表明,&&如果第一个操作数为假,则运算符只能短路。让我们检查一下代码失败的地方。

if (!isset($_SESSION['login']) && ($_SESSION['login'] != '')) {
    header ("Location: login.php");
} else {
    include('head3.php'); 
}

用文字来说,条件是:如果$_SESSION['login']不存在,并且$_SESSION['login']不是空字符串。我们永远不会想要访问$_SESSION数组中不存在的键,并且我们知道&&运算符只有在其左操作数为假时才会短路。

左操作数 is$_SESSION['login']不存在。如果$_SESSION['login']不存在,则为真,这意味着&&运算符必须查看正确的操作数以查看它是否也为真。现在&&看条件$_SESSION['login']不是空字符串。哎呀!在这一点上,我们已经确定的这种条件访问$_SESSION['login']不存在!

于 2010-05-25T10:56:38.487 回答
0

如果未设置会话变量 loginAdmin,那么您不想评估检查它是否为空字符串的第二个条件。您可以在这里使用短路评估来帮助您。将您的代码更改为

<?php
session_start();

if (!isset($_SESSION['loginAdmin']) || ($_SESSION['loginAdmin'] == '')) {
    header ("Location: loginam.php");
} else {
    include('head2.php');
}



if (!isset($_SESSION['login']) || ($_SESSION['login'] == '')) {
    header ("Location: login.php");
} else {
    include('head3.php'); 
}
?>
于 2010-05-25T10:56:46.970 回答