IF geht nicht - bin am verzweifeln

Hallo Leute,

Ich weiss nicht mehr weiter!

Programmcode:
print $servererg[0].’
‚;
print $serveralarm.‘
‚;
if($servererg[0] == „NOT RUNNING“) || $servererg[0] == „NO“
{ print "Alarm
"; $serveralarm++; }
print $serveralarm.‘
';

Ergebnis:
0
0
Alarm
1

Warum tut das Programm so etwas? Er darf doch die if-Abfrage nicht als wahr ansehen, wenn sie das nicht ist?

Oder bin ich da irgenwie blind und uebersehe was?

Christian

Sorry, da ist beim kopieren in der if Zeile hinten die Klammer floeten gegangen. Sie ist im Test aber drin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo

> print $servererg[0].'  
> ';  
> print $serveralarm.'  
> ';  
> if($servererg[0] == "NOT RUNNING" || $servererg[0] == "NO") {  
> print "Alarm  
> "; $serveralarm++; }  
> print $serveralarm.'  
> ';

Gruß
Phillip

die ist nicht flöten gegangen sondern sie steht zu weit vorne…

print $serveralarm.’
‚;
if($servererg[0] == „NOT RUNNING“ das hier nach hinten -> ) || $servererg[0] == „NO“
{ print "Alarm
"; $serveralarm++; }
print $serveralarm.‘
';

Ergebnis:
0
0
Alarm
1

Warum tut das Programm so etwas? Er darf doch die if-Abfrage
nicht als wahr ansehen, wenn sie das nicht ist?

Oder bin ich da irgenwie blind und uebersehe was?

Christian

Also daran lags nicht!
Ich hatte aus Verzweiflung die beiden Abfragen einzeln durchgefuehrt und nciht wieder korrekt zurueckgesetzt.
Aber ich habe das Problem jetzt umgangen.

Die Variable $servererg[0] hatte einen numerischen Wert - die Null!

Ich nehme an daran lag es. Aber verstehen tue ich dann trotzdem nicht weshalb die IF Bedingung wahr ist, wenn ein nummerischer Wert in der Variablen steht??? Es muesste doch dann erst Recht false sein. Oder?

Ich habe das Problem jetzt ganz anders geloest: Ich weise der Variablen jetzt immer numerische Werte zu und frage diese ab.

Christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi!

NULL ist nicht numerisch :wink: Du kannst aber statt == den === Operator verwenden, dann wird auch auf gleiche Datentypen geprüft.

Gruß
Jon Gilbert

Die Variable $servererg[0] hatte einen numerischen Wert - die
Null!

if($servererg[0] == „NOT RUNNING“ das hier nach hinten -> ) || $servererg[0] == „NO“

Hi

NULL ist nicht numerisch :wink: Du kannst aber statt == den ===
Operator verwenden, dann wird auch auf gleiche Datentypen
geprüft.

hab das vorhin auf meiner umgebung selbst nachgestellt und scheint ein bug zu sein.

wenn ich servererg = 0 lasse kommt ein alarm
wenn ich servererg = null mache kommt kein alarm

als workaround kann man aber if("{$servererg[0]}" == ‚NOT RUNNING‘) nutzen, das erzeugt zumindestens die korrekte prüfung in der if abfrage

Gruß
Phillip

Das ist kein Bug
Hallo,

auch wenn behauptet wird, dies sei ein Bug in PHP ist es ein
Verhalten, welches man von anderen Sprache (z.B. C) auch kennt.

Da PHP aber nur schwach typisiert ist tritt das Problem häufig auf.
Zur Erklärung :

Es wird versucht eine Integerzahl mit einem String zu vergleichen,
daher müssen beide Variablen auf den gleichen Typ gebracht werden.
PHP fängt also „links“ an und erkennt eine Integerzahl. Folgerichtig muß auch der String in eine Integerzahl überführt werden.
>http://de3.php.net/manual/de/language.types.string.p…
Erkärt wir das geht.
Da der String keine Zahlen enthält wird er zu 0 konvertiert.

Also steht im Programm nicht
if (0 == „Test“)… sondern if (0 == (int) „Test“)…
(int) „Test“ => 0
daraus folgt
if (0 == 0)

Die richtige (und einzig zuverlässige) Art und Weise dieses Problem zu umgehen ist das sog. TypeCasting womit PHP gezwungen wird, einen bestimmten Datentyp zu benutzen.

if ((string) 0 == „Test“ )…

Ich hoffe das hat die Problematik etwas verdeutlicht.
Auch wenn PHP den Vergleich von unterschiedlichen Typen anbietet sollte man immer genau bedenken was passiert.

Ciao
So9