web-dev-qa-db-fra.com

Utilisation de AND / OR dans l'instruction if PHP

Comment utilisez-vous 'AND/OR' dans une instruction if else PHP? Serait-ce:

1) ET

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

2) OU

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

Oui. La réponse est oui.
http://www.php.net/manual/en/language.operators.logical.php


Deux choses cependant:

  • De nombreux programmeurs préfèrent && et || à la place de and et or, mais ils fonctionnent de la même manière (sauf pour la priorité).
  • $status = 'clear' devrait probablement être $status == 'clear'. = est une assignation, == est une comparaison.
112
deceze

Il y a des plaisanteries et des commentaires trompeurs, voire des informations partiellement incorrectes dans les réponses fournies ici. J'aimerais essayer de les améliorer:

Tout d'abord , comme certains l'ont souligné, votre code contient un bogue lié à la question suivante:

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

devrait être (notez le == au lieu de = dans la première partie):

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

qui dans ce cas est fonctionnellement équivalent à

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

Second , notez que ces opérateurs (and or && ||) sont des opérateurs de court-circuit. Cela signifie que si la réponse peut être déterminée avec certitude à partir de la première expression, la seconde n’est jamais évaluée. Encore une fois, cela n'a pas d'importance pour votre ligne de débogage ci-dessus, mais c'est extrêmement important lorsque vous combinez ces opérateurs avec des affectations, car

Troisièmement , la différence réelle entre and or et && || est leur priorité des opérateurs . Plus précisément, il est important que && || ait une priorité supérieure à celle des opérateurs d'assignation (= += -= *= **= /= .= %= &= |= ^= <<= >>=), tandis que and or a une priorité inférieure à celle des opérateurs d'affectation. Ainsi, dans une déclaration qui combine l’utilisation de l’affectation et de l’évaluation logique, le choix de votre choix compte.

Exemples modifiés de page de PHP sur les opérateurs logiques :

$e = false || true;

va évaluer true et attribuer cette valeur à $e, car || a une priorité supérieure à celle de =, et est donc essentiellement évalué comme suit:

$e = (false || true);

pourtant

$e = false or true;

assignera false à $e (puis effectuera l'opération or et évaluera true) car = a une priorité supérieure à celle de or, essentiellement évaluer comme ceci:

($e = false) or true;

Le fait que cette ambiguïté existe même fait que beaucoup de programmeurs utilisent toujours toujours && || et ensuite tout fonctionne clairement comme on pourrait s'y attendre dans un langage comme C, c'est-à-dire. opérations logiques d'abord, puis affectation.

Certaines langues comme Perl utilisent ce type de construction fréquemment dans un format similaire à celui-ci:

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

Ceci assignerait théoriquement la connexion de base de données à $connection, ou si cela échouait (et nous supposons ici que la fonction renverrait quelque chose qui vaut false dans ce cas), le script se terminera par un Message d'erreur. En raison d'un court-circuit, si la connexion à la base de données aboutit, la die() n'est jamais évaluée.

Certaines langues qui autorisent directement cette construction interdisent les affectations dans des instructions conditionnelles/logiques (comme Python) afin de supprimer l’ambiguïté dans l’inverse.

PHP a permis d'autoriser les deux, vous devez donc vous familiariser une seule fois avec les deux options, puis coder comme vous le souhaitez, mais j'espère que vous serez cohérent d'une manière ou d'une autre.

En cas de doute, ajoutez simplement une parenthèse supplémentaire, qui supprime toute ambiguïté. Ce seront toujours les mêmes:

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

Armé de toutes ces connaissances, je préfère utiliser and or parce que j'estime que cela rend le code plus lisible. J'ai juste une règle pour ne pas combiner des tâches avec des évaluations logiques. Mais à ce stade, il ne s'agit que d'une préférence, et la cohérence compte beaucoup plus ici que le camp choisi.

11
redreinard

Vous avez 2 problèmes ici.

  1. utilisez == pour la comparaison. Vous avez utilisé = qui est destiné à l’affectation.

  2. utilisez && pour "et" et || pour "ou". and et or fonctionneront, mais ils ne sont pas conventionnels.

9
Asaph

AND est && et OR est || comme en C.

7
Dan D.

AND et OR ne sont que des sucres syntaxiques pour && et ||, comme en JavaScript, ou dans d'autres langages à syntaxe C.

Il apparaît AND et OR ont une priorité inférieure que leurs équivalents de style C.

4
alex

pour ET vous utilisez

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

pour OR vous utilisez

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

je pense avoir un peu de confusion ici. :) Mais semble personne d'autre ont ..

Voulez-vous savoir lequel utiliser dans ce scénario? Si oui, alors et quelle est la bonne réponse.

Si vous demandez comment fonctionnent les opérateurs, alors

En php, AND, && et OR, fonctionneront de la même manière. Si vous êtes nouveau dans la programmation et que php est l'une de vos langues premières, je suggère d'utiliser AND et OR, car cela augmente la lisibilité et réduit la confusion lorsque vous vérifiez. Mais si vous connaissez déjà d’autres langues, vous avez peut-être déjà familiarisé les && et || les opérateurs.

0
Anush Prem
<?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>

ive a remplacé le 'else' par '&&' afin que les deux soient placés ... argh