如果其中一个条件不正确,如何避免在php中通知

时间:2010-05-25 10:41:53

标签: php boolean-operations

我注意到当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.";
        }

8 个答案:

答案 0 :(得分: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);

但是在开发过程中,你必须意识到所有的错误和通知,所以除非你确定你在做什么,否则这不是一个好主意。

答案 1 :(得分: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");
}

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

1)使用|| (或)代替&amp;&amp; (AND)。
2)改变!=到==

答案 4 :(得分:0)

您不想要isset($_SESSION['login'])而不是“!”吗?

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

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

答案 5 :(得分: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,否则代码将继续运行,可能导致未定义的行为。

答案 6 :(得分: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";
}

此实验表明&&运算符只能在第一个操作数为false时短路。我们来看看代码失败的地方。

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

条件就是这样:如果$_SESSION['login']不存在,$_SESSION['login']不是空字符串。我们永远不会想要访问$_SESSION数组中不存在的密钥,并且我们知道&&运算符只会在其左操作数为假的情况下短路。

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

答案 7 :(得分:0)

如果未设置sesion变量loginAdmin,那么您不想评估第二个条件,即检查它是否为空字符串。您可以使用short-circuit evaluation在此处为您提供帮助。将您的代码更改为

<?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'); 
}
?>