当条件之一不成立时,如何避免在 php 中发出通知
我注意到,当 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 语句之一不为 true。如果不正确,则会通知您它未定义。 就我而言,它表示会话“登录”未定义。如果使用会话“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.";
}
I've notice that when one of the two conditions in a php if statement is not true. You get an undefined index notice for the statement that is not true. And the result in my case is a distorted web page.
For example, this code:
<?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 one of the if statements is not true. The one that is not true will give you a notice that it is undefined.
In my case it says that the session 'login' is not defined. If session 'LoginAdmin' is used. What can you recommend that I would do in order to avoid these undefined index notice.
EDIT
This is where I check if the entered information is correct, for those who are asking. It always redirects to the login page even if the login information is correct:
$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.";
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
你的条件是错误的,应该是:
And:
用
||
替换&&
,用==< 替换
!=
/代码>情况并非如此,当某些变量未定义时,您会收到通知消息。您可以使用抑制运算符
@
来避免这种情况,但使用它不是一个好主意,因为它会降低性能。您还可以通过将其放在脚本顶部来隐藏通知消息:
但是在开发过程中,您必须了解所有错误和通知,因此这不是一个好主意,除非您确定自己在做什么。
Your condition is wrong, it should be:
And:
replaced
&&
with||
and!=
with==
That's not the case, you get notice messages when you have some variables undefined. You can avoid this be using suppression operator
@
but it is not a good idea to use that because it slows down performance.Also you can hide notice messages by putting this on top of your script:
But again while on development, you must be aware of all errors and notices so this is not a good idea again unless you are sure what you are doing.
我想你的意思是这样的:
I think you meant this:
你的条件很奇怪。
例如:
!isset($_SESSION['login']) && ($_SESSION['登录'] != '')
首先,检查会话变量中是否未设置“login”
!isset($_SESSION['login'])
因此,如果未设置,您还将检查第二个条件,其中您尝试访问“登录”索引,未设置。
也许你指的是这个条件?
if (!isset($_SESSION['login']) || ($_SESSION['login'] == ''))
如果登录名未设置,或者为空,则重定向到登录名
否则重定向到 head 3。
Your conditions are weird.
for example:
!isset($_SESSION['login']) && ($_SESSION['login'] != '')
First, you check wether 'login' is NOT set in the session variable
!isset($_SESSION['login'])
So if it is not set you will also check the second condition, in which you try to access the 'login' index, which isn't set.
Maybe you mean this condition?
if (!isset($_SESSION['login']) || ($_SESSION['login'] == ''))
If login is not set, OR it is empty, redirect to login
otherwise redirect to head 3.
1)使用|| (OR) 代替 && (并且)。
2)将 != 改为 ==
1) Use || (OR)instead of && (AND).
2) change != to ==
您不想使用
isset($_SESSION['login'])
(不带“!”)吗?如果您已经知道
$_SESSION['login']
尚未设置,那么测试它是否没有多大意义。如果删除“!”,则会消除该通知,因为isset
会使其静音,并且在未设置索引时永远不会评估第二个条件。Don't you want
isset($_SESSION['login'])
instead (without "!")?It doesn't make much sense to test if
$_SESSION['login']
if you already know it's not set. If you remove the "!", it eliminates the notice becauseisset
silences it and the second condition will never be evaluated when the index is not set.如果未设置会话 (
!isset($_SESSION['loginAdmin'])
),则 if 语句中的第二个条件实际上是不必要的,因为它们永远不会为真。未定义的变量(第一个条件)不能带有值(第二个条件)。发生错误的原因是您在第二个条件(
&&
之后)中测试的变量不存在。试试这个:
我在标头调用后包含了
exit
,否则代码将继续运行,可能会导致未定义的行为。If the session is not set (
!isset($_SESSION['loginAdmin'])
) then the second condition in the if statements are really unnecessary, because they will never be true. You cannot have an undefined variable (the first condition) with a value (the second condition).The error occurs because the variable you're testing in the second condition (after the
&&
) does not exist.Try this:
I included
exit
after your header calls because otherwise the code will continue running, probably causing undefined behavior.如果未设置会话变量loginAdmin,那么您不想评估检查它是否为空字符串的第二个条件。您可以使用短路评估来帮助您。将您的代码更改为
if the sesion variable loginAdmin is not set then you don't want to evaluate the second condition where you check if it is an empty string. You can use short-circuit evaluation to help you here. Change your code to
运算符求值的一个简单示例:
此实验演示了
&&
运算符仅在第一个操作数为 false 时才能短路。让我们检查一下代码哪里失败了。简而言之,条件是:如果
$_SESSION['login']
不存在,并且$_SESSION['login']
不是空字符串。我们永远不会想要访问$_SESSION
数组中不存在的键,并且我们知道&&
运算符只会在以下情况下短路:左操作数为假。左操作数
$_SESSION['login']
不存在。如果$_SESSION['login']
不存在,则为 true,这意味着&&
运算符必须查找右侧操作数以查看它是否也为 true。现在&&
查看条件$_SESSION['login']
不是空字符串。哎呀!此条件访问我们已经确定的$_SESSION['login']
,此时它不存在!A quick example of operator evaluation:
This experiment demonstrates that the
&&
operator can only short-circuit if the first operand is false. Let's examine where the code fails.The condition, in words, is this: if
$_SESSION['login']
does not exist, and$_SESSION['login']
is not an empty string. We can never, ever want to access a key that does not exist in the$_SESSION
array, and we know the&&
operator will only short-circuit if its left operand is false.The left operand is
$_SESSION['login']
does not exist. This is true if$_SESSION['login']
does not exist, meaning the&&
operator must look to the right operand to see if it is also true. Now&&
looks at the condition$_SESSION['login']
is not an empty string. Whoops! This condition accesses$_SESSION['login']
which we have already, at this point, determined doesn't exist!