我注意到当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.";
}
答案 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');
}
?>