Php 为什么这个测试不起作用?
“我的网站”需要一个基于用户建立权限的登录名。在站点的照片列表中,我必须确定如果用户只有访客访问权限,是否会显示特定的照片。所以我认为这个if-else语句会起作用:Php 为什么这个测试不起作用?,php,mysql,Php,Mysql,“我的网站”需要一个基于用户建立权限的登录名。在站点的照片列表中,我必须确定如果用户只有访客访问权限,是否会显示特定的照片。所以我认为这个if-else语句会起作用: if (!($mysql_row['guest_access'] == 'NO') AND ($_SESSION['user_level'] == 'GUEST')) { // show the photo if it isn't private and the user isn't a guest 但事实并非如此 然而,
if (!($mysql_row['guest_access'] == 'NO') AND ($_SESSION['user_level'] == 'GUEST')) {
// show the photo if it isn't private and the user isn't a guest
但事实并非如此
然而,如果我把这个测试分成三行,那么它就可以正常工作了
$is_private_photo = $mysql_row['guest_access'] == 'NO';
$is_guest = $_SESSION['user_level'] == 'GUEST';
$both_private_and_guest = ($is_private_photo AND $is_guest);
if (!$both_private_and_guest) {
// show the photo if it isn't private and the user isn't a guest
第一个版本有什么问题?逻辑not操作需要应用于AND结果,但在您的代码示例中,它仅应用于第一个子句not,其优先级高于AND。您可以通过将两个条件分组来解决此问题:
if (!(($mysql_row['guest_access'] == 'NO' AND ($_SESSION['user_level'] == 'GUEST'))) {
这是因为你在第一个版本中把括号放错了地方。第二个版本的等效形式为
if (!$is_private_photo AND $is_guest)
这显然不是你想要的。你的第一个if是
if (!($mysql_row['guest_access'] == 'NO') AND ($_SESSION['user_level'] == 'GUEST'))
实际上是这样理解的:
if (
(!($mysql_row['guest_access'] == 'NO'))
AND ($_SESSION['user_level'] == 'GUEST')
)
这个!仅应用于第一个条件,而不是两个条件,因为它的优先级高于和,请参见
您的条件可能应该用一些附加括号重新编写:
if (!(($mysql_row['guest_access'] == 'NO') AND ($_SESSION['user_level'] == 'GUEST')))
所以,这是我的梦想!应用于整个条件。您的“!”未应用于'AND'语句…它仅应用于$mysql\u行['guest\u access']='NO'语句。not运算符!仅涵盖第一个条件,因此请添加另一个括号,或执行此操作
if ( $mysql_row['guest_access'] != 'NO' AND...
你只是在否定第一个条件。试试这个:
if (!($mysql_row['guest_access'] == 'NO' AND $_SESSION['user_level'] == 'GUEST')) {
您的否定运算符未按预期应用。您应该使用以下内容:
if ( ! (($mysql_row['guest_access'] == 'NO') AND ($_SESSION['user_level'] == 'GUEST')) )
if ( ! ($mysql_row['guest_access'] == 'NO') OR ! ($_SESSION['user_level'] == 'GUEST') )
这样做:
if (($mysql_row['guest_access'] != 'NO') AND ($_SESSION['user_level'] != 'GUEST')) {
哇,5个人打败了我,得到了完全相同的答案:谢谢大家的快速反应。我想我没有想清楚。