2010-05-25 80 views
2

我注意到,当一个php if语句中的两个条件不成立时。你得到一个未定义的索引通知,对于不正确的陈述。我的结果是一个扭曲的网页。 例如,下面的代码:如何避免通知在PHP中当其中一个条件不成立时

<?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."; 
     } 
+0

为什么要测试变量的值(如果未设置)?未设置变量如何具有一个值? – 2010-05-25 10:49:14

+0

你可以使用'if(empty($ _ SESSION ['loginAdmin'])){...'来代替,它会使代码更加清晰可读 – 2010-05-25 10:54:25

回答

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); 

但是又同时在发展,你必须了解所有错误和通知的所以这一次,除非是不是一个好主意你确定你在做什么。

0

1)使用|| (OR)而不是& &(AND)。
2)改变!=到==

0

你不想isset($_SESSION['login'])代替(无 “!”)?

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

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"); 
} 
+0

另外,我会使用'if(!empty($ _ SESSION [ 'loginAdmin'])){...',为了更好的可读性 – 2010-05-25 11:13:20

+0

好点。我会留下我的回答,以便OP能够看到他们出错的地方。但是,是的,这绝对更具可读性。 – Eric 2010-05-25 11:19:07

+0

当我这样做时,即使我输入了正确的用户名和密码,它也会将我重定向到登录页面 – user225269 2010-05-25 11:19:34

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你的头调用之后,因为否则代码将继续运行,可能导致未定义的行为。

+0

看来这个代码与另一个相矛盾。即使输入的用户名和密码正确,也会导致我的页面始终重定向到登录页面。 – user225269 2010-05-25 11:24:17

1

你的情况很奇怪。
例如:!isset($_SESSION['login']) && ($_SESSION['login'] != '')
首先,请检查是否“登录”没有在会话变量!isset($_SESSION['login'])
所以设置,如果没有设置也将检查第二个条件,在您尝试访问“登录”索引号,,未设置

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

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阵列中不存在的密钥,并且我们知道,如果操作符的左操作数为假,操作员只会短路。

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

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'); 
} 
?> 
相关问题