在 PHP 的 if else 语句中使用 AND/OR

90

在一个if else的PHP语句中,如何使用'AND/OR'?是这样写吗:

1) AND

if ($status = 'clear' AND $pRent == 0) {
    mysql_query("UPDATE rent 
                    SET dNo = '$id', 
                        status = 'clear', 
                        colour = '#3C0' 
                  WHERE rent.id = $id");
} 

2) OR

:或者

if ($status = 'clear' OR $pRent == 0) {
    mysql_query("UPDATE rent 
                    SET dNo = '$id', 
                        status = 'clear', 
                        colour = '#3C0' 
                  WHERE rent.id = $id");
} 

这将如何工作?$items_list = array(2,177);$rules_list = array( '[(13 OR 3 OR 2 )]', '[(54 OR 77 ) AND 17 AND 59 AND 36 ] OR [(2 AND 36 )]', '[(2 OR 3 OR 13 ) AND 30 ]', '[(2 )] OR [(13 OR 4 ) AND (17 )]', '[(2 )] OR [(13 OR 3 ) AND 17 ]', '[(2 AND 30 ) OR (3 AND 30 )]', );//使用提供的项目数组计算每个规则的布尔结果 - Bhargav Patel
10个回答

155

是的。答案是肯定的。

http://www.php.net/manual/zh/language.operators.logical.php


不过需要注意两点:

  • 许多程序员更喜欢使用&&||代替andor,但它们的作用相同(除了优先级安全性)。
  • $status = 'clear' 可能应该是 $status == 'clear'。其中=是赋值运算符,== 是比较运算符。

35

这里的一些答案存在玩笑、误导性评论,甚至是部分不正确的信息。我想尝试改进它们:

首先,就像一些人指出的那样,你的代码存在与问题相关的错误:

if ($status = 'clear' AND $pRent == 0)

应为(请注意第一部分中的==而不是=):

if ($status == 'clear' AND $pRent == 0)

在这种情况下,功能上等同于

if ($status == 'clear' && $pRent == 0)

其次,请注意这些运算符(and or && ||)是短路运算符,这意味着如果第一个表达式可以确定答案,第二个表达式将不会被执行。虽然这对于你上面调试的行没有影响,但当你将这些运算符与赋值结合使用时,这一点非常重要,因为

第三and or&& ||之间的真正区别在于它们的运算符优先级。具体来说,重要的是&& ||比赋值运算符(= += -= *= **= /= .= %= &= |= ^= <<= >>=)拥有更高的优先级,而and or比赋值运算符拥有更低的优先级。因此,在一个同时使用赋值和逻辑运算的语句中,选择哪一个运算符是很重要的。

修改自PHP逻辑运算符页面的示例

$e = false || true;

由于 || 的优先级高于 =,因此将评估为true并将该值分配给$e,因此它基本上像这样评估:

$e = (false || true);

然而

$e = false or true;

由于 = 运算符的优先级高于 or 运算符,所以将会把 false 赋值给 $e(然后执行 or 运算并计算出 true), 实际上的运算过程如下:

($e = false) or true;

这种歧义的存在使得很多程序员只使用&& ||,这样一切都会清晰地按照像C语言那样逻辑操作优先,然后才是赋值。

有些语言,如Perl,经常使用类似以下格式的结构:

$connection = database_connect($parameters) or die("Unable to connect to DB.");

理论上,这将会把数据库连接分配给$connection,或者如果失败了(假设函数会在这种情况下返回一个等价于false的值),它将用错误消息结束脚本。由于短路计算,如果数据库连接成功,die()就不会被执行。

有些语言直接禁止在条件/逻辑语句中进行赋值(例如Python),以消除另一种方式的歧义。

PHP允许两种方式,因此你只需要学习两个选项,然后编写你想要的代码,但希望你能始终保持一致。

如果有疑问,可以加上额外的括号,这样就能消除所有的歧义。这些括号总是相同的:

$e = (false || true);
$e = (false or true);

拥有所有这些知识后,我更喜欢使用and or,因为我认为它让代码更易读。我只有一个规则,不要将赋值和逻辑评估结合在一起。但到那个时候,这只是一种偏好,一致性比你选择哪一边更重要。


21
有点晚了,但没关系... 问题是“你如何使用...?”简短的答案是你做得正确。

I use `&&` instead of `AND` and `||` instead of `OR`.
$a = 1
$b = 3

Now,

if ($a == 1 && $b == 1) { TRUE } else { FALSE }

in this case the result is "FALSE" because B is not 1, now what if

if ($a == 1 || $b == 1) { TRUE } else { FALSE }

This will return "TRUE" even if B still not the value we asking for, there is another way to return TRUE without the use of OR / || and that would be XOR

if ($a == 1 xor $b == 1) { TRUE } else { FALSE }

in this case we need only one of our variables to be true BUT NOT BOTH if both are TRUE the result would be FALSE.

more in:
http://www.php.net/manual/en/language.operators.logical.php



11

AND 是 &&,OR 是 ||,就像在 C 语言中一样。


10

这里有两个问题。

  1. 使用==进行比较。你使用了=,这是用于赋值的。

  2. 使用&&表示“和”,||表示“或”。andor也可以工作,但它们不是常规用法。


很少见,但也许他们想在那个条件下分配:P 虽然我打赌他们没有这样做。 - alex
1
@alex:当然不是在 if ($status = 'clear' OR $pRent == 0) { 的情况下。在这种情况下,第二个条件是无法到达的。这一定是一个错误。 - Asaph
肯定不是用OR - alex

5

3

对于“AND”,你需要使用

if ($status = 'clear' && $pRent == 0) {
    mysql_query("UPDATE rent SET dNo = '$id', status = 'clear', colour = '#3C0' WHERE rent.id = $id");
} 

对于OR,您可以使用

if ($status = 'clear' || $pRent == 0) {
    mysql_query("UPDATE rent SET dNo = '$id', status = 'clear', colour = '#3C0' WHERE rent.id = $id");
} 

0
<?php
$val1 = rand(1,4); 
$val2=rand(1,4); 

if ($pars[$last0] == "reviews" && $pars[$last] > 0) { 
    echo widget("Bootstrap Theme - Member Profile - Read Review",'',$w[website_id],$w);
} else { ?>
    <div class="w100">
        <div style="background:transparent!important;" class="w100 well" id="postreview">
            <?php 
            $_GET[user_id] = $user[user_id];
            $_GET[member_id] = $_COOKIE[userid];
            $_GET[subaction] = "savereview"; 
            $_GET[ip] = $_SERVER[REMOTE_ADDR]; 
            $_GET[httpr] = $_ENV[requesturl]; 
            echo form("member_review","",$w[website_id],$w);?>
        </div></div>

我已经用“&&”替换了“else”,这样两者都被放置了... 哎呀


0

我觉得我有点困惑。:) 但似乎没有人有同样的问题..

你是在问在这种情况下要使用哪一个吗?如果是的话,那么And是正确的答案

如果您正在询问操作符的工作方式,则

在php中,AND, &&OR, ||将以相同的方式工作。如果您是编程新手,并且PHP是您的第一种语言之一,那么建议使用AND和OR,因为它可以增加可读性并减少回头时的混淆。但是,如果您已熟悉其他任何语言,则可能已经熟悉了&&和||运算符。


这是完全不正确的。AND/OR比赋值运算符具有更低的优先级,而&&/||则具有更高的优先级。经典的例子:$e = false || true;$e = false or true;。第一个求值为true,第二个求值为false。 - redreinard

-1

我的 PHP 代码中,“AND” 不起作用。

可能是服务器版本的问题吗?

“&&” 可以正常工作。


AND不是PHP关键字,其语法为&&表示AND。 - php_coder_3809625
@php_coder_3809625,以下是您参考的内容:http://php.net/manual/en/reserved.keywords.php - Nana Partykar
@php_coder_3809625 请查看/阅读以下内容:https://www.w3schools.com/php/php_operators.asp - Noob Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接