Php 为什么这个测试不起作用?

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-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
但事实并非如此

然而,如果我把这个测试分成三行,那么它就可以正常工作了

$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个人打败了我,得到了完全相同的答案:谢谢大家的快速反应。我想我没有想清楚。