2009-07-24 12 views
4
if($country == 224 || $country == 223 || $country == 39 && $zip == ''){ 
    $_SESSION['sess_msg'] = "Please enter a Valid zipcode"; 
    header("location: $SITE_PATH?p=account.profile.name"); 
    exit; 
} 
 
variable value 
-------- ----- 
$country  224 
$zip  11111 

Ich weiß, dass $zip nicht leer ist, aber der Code ausgeführt wird, als ob es ist. Ich drucke es sogar in einer Debugging-Anweisung an den Browser aus, um zu verifizieren, dass es einen Wert hat.Seltsam php if-Anweisung Problem

Was bewirkt, dass mein Programm so funktioniert, als hätte $zip keinen Wert?

Antwort

26

Der Operator && hat einen höheren precedence als der Operator ||. Also Ihr Ausdruck ist gleich:

$country == 224 || $country == 223 || ($country == 39 && $zip == '') 

Die Lösung:

($country == 224 || $country == 223 || $country == 39) && $zip == '' 
+9

Ich füge hinzu: Wenn der Compiler oder die Interpreter, erinnern Sie sich an die Vorrangstellung des Operators, der Programmierer sollte sich nicht darauf beziehen. Wenn ein Mitspieler die Rangfolge falsch interpretiert, können Fehler auftreten, die schwer zu pflegen sind. Mein Rat ist, die Parentesie zu benutzen, um jede Zweideutigkeit zu lösen, um Ihren Kollegen auf dem ersten Blick zuversichtlich zu machen, was Sie schreiben. – Eineki

0

Was macht es, wenn Sie es zu diesem ändern?

if($country === 224 || $country === 223 || $country === 39 && $zip === ''){ 
    $_SESSION['sess_msg'] = "Please enter a Valid zipcode"; 
    header("location: $SITE_PATH?p=account.profile.name"); 
    exit; 
} 

Ich bin gespannt, ob die Typen der Variablen verursachen hier ein Problem, wird === beide vergleichen den Wert und der Typ der Variablen.

15

Haben Sie versucht, mit Klammern Ihre Operationen zu ordnen?

($country == 22 || $country == 223 || $country == 39) && ($zip == '') 
0

Ja ... aber sind sie auf einen der richtigen Werte eingestellt? Land ist 224 oder 223 oder 39 und zip ist eine leere Zeichenfolge? Ich möchte betonen, zip ist eine "leere" Zeichenfolge == ''.

5

& & hat einen höheren Operator precendence als || , So sind Sie effektiv zu sagen:

if($country == 224 || $country == 223 || ($country == 39 && $zip == '')) 
9

Das Problem ist die order in which PHP checks your boolean operators. Zuerst sieht es eine Bedingung, dann eine ODER, und es denkt: Heck, ja! Die Bedingung ist erfüllt. Warum sollte ich den Rest dieses Krams lesen und ausführen?

Eigentlich ist dies eine Funktion. Denken Sie an dieser Konstellation:

if (something_probable() OR something_very_expensive_to_compute()) 

Dann ist es nett von PHP ist die zweite nicht zu bewerten, wenn die erste bereits den Test besteht.

Versuchen Sie es mit Klammern:

if (($country == 224 || $country == 223 || $country == 39) && $zip == ''){ 

Cheers,

+0

danke ich wusste das nie und das scheint etwas sehr gutes zu wissen! BTW, die für mein Problem funktionierte – JasonDavis

+0

Gern geschehen!Vergessen Sie nicht, irgendeine der Antworten zu akzeptieren (Gumbo und Gortok geben im Prinzip die gleiche Antwort. Ich weiß nicht, wer der Erste war). – Boldewyn

+0

Lieber Drive-by-Downvoter, würden Sie Ihre Entscheidung kommentieren? – Boldewyn

5

ich die erste Antwort mögen, aber trotzdem würde nicht mehr lesbar:

<?php 

$need_zip_code = array(224, 222, 332, 222/* etc....*/); 

if (in_array($country, $need_zip_code) && $zip === '') { 
// do your stuff.... 
} 


?>