PHP If Anweisung läuft nicht richtig

PEASANT KING

Commander
Registriert
Okt. 2008
Beiträge
2.412
Hallo Leute,

ganz banale Sache, es geht um eine If Anweisung siehe hier:
PHP:
<?php 

$_SESSION['username'] = "";

if (isset ($_SESSION['username']))
    { 
    echo "Angemeldet als: " .$_SESSION['username'];
    }
    echo "Nicht angemeldet";

?>

Stell ich mir die Frage wieso das nicht funktioniert. Was konkret nicht funktioniert ist, dass wenn keine Sessionvariable in meinem Fall username gesetzt ist gibt er mir trotzdem Angemeldet als: Nicht Angemeldet aus. Warum ? Eigentlich sollte er doch nur Nicht Angemeldet ausgeben...
 
Die Zeile mit "Nicht angemeldet" gehört in einen Else-Zweig, dann sollte es passen.
 
Ich bin kein Php-Kenner ABER das 2. echo steht nicht mit in dem If-Block und somit wird das wohl immer mit laufen, egal welches Ergebnis das If liefert.
 
Ganz einfach...
Du hast das else unten vergessen...
 
Ist ja auch logisch, denn dir fehlt die ELSE Bedingung.
PHP:
echo "Nicht angemeldet";

wird also in jedem Fall ausgeführt, egal ob er angemeldet ist oder nicht. Warum du Session eine leere Zuweisung übergibst verstehe ich jetzt nicht ganz (oder war das nur zu Demo Zwecken?)

PHP:
<?php 

$_SESSION['username'] = '';

if (isset($_SESSION['username']) && !empty($_SESSION['username']) { 
   echo 'Angemeldet als: ', $_SESSION['username'];
} else {
    echo 'Nicht angemeldet';
}

?>
 
War nur zu Demo Zwecken, die Session wird durch einen Login gestartet, bin dabei für mich ein Serverinterface zu basteln.
 
@renegade: an deiner stelle würde ich bei der verwendung von empty() aufpassen. diese funktion tut nicht automatisch das, was man als coder erwarten würde. z.b. gilt empty("0")===true !!

@DJ_West: mit isset() kommst du hier nicht weit. das sagt nur aus, ob im array $_SESSION ein key "username" existiert, und das tut er ja. isset() prüft NICHT ob da ein wert enthalten ist!
 
Ja naja, is ja auch logisch, steht ja so in der Referenz :D

Wenn ich danach gehe das ich die Funktionen die ich einsetze nicht genau kenne, müsste ich wohl auf so einige Funktionen verzichten. Immerhin liefert strcmp bei Success auch 0 zurück was von PHP als false interpretiert wird, um nur ein Beispiel von vielen zu nennen :)
 
Sobald bei einer PHP-Funktion in der Doku als Rückgabewert nicht bool, sondern int angegeben ist, muss man immer aufpassen und vergisst true und false hier am besten gänzlich.
 
strcmp issn standard. das gibt immer eine zahl zurück, weil es im eigentlichen sinne kein test auf gleichheit ist. bei impliziten typenkonvertierungen (auch bei int->bool) ist immer vorsicht geboten. da kommen gelegentlich unerwartete ergebnisse bei raus.

korrekt ist die anwendung von strcmp mit if (strcmp($arg1, $arg2) == 0)
 
Zuletzt bearbeitet:
Eigentlich sollte es nur ein Beispiel sein, denn ein unbedarfter Programmierer könnte davon ausgehen, dass strcmp einen String vergleicht und 1 bei true und 0 bei false zurück gibt. Und davon gehen wir ja aus, ein fortgeschrittener Anwender wird weder bei empty noch strcmp Probleme haben.

Ich wollte damit rein sagen, dass es generell wichtig ist, die Befehle mit ihren Funktionen und ihre Rückgabewerte zu kennen, denn empty ist sicher nicht der einzige Befehl der böse ist :)

Außerdem ist empty ein Language Construct, daher würd ich es eher als Standard ansehen als strcmp, das eine Funktion ist ;)

Und da du, wie du richtig gesagt hast, Typkonvertierungen böse und "langsam" sind, sollte die richtige Verwendung auch gleich if (strcmp($arg1, $arg2) === 0) sein :)



so long
Renegade
 
@DJ_West: mit isset() kommst du hier nicht weit. das sagt nur aus, ob im array $_SESSION ein key "username" existiert, und das tut er ja. isset() prüft NICHT ob da ein wert enthalten ist!

Das ist richtig, nur denke ich ist das egal, denn wenn ich mich nicht korrekt einlogge,(Zugangsdaten liegen in der Datenbank) dann spielt es doch keine Rolle denn die Sessionvariablen werden erst gesetzt bei erfolgreichem Abgleich mit den Daten in der Datenbank oder sehe ich das falsch ?
 
@DJ_We$t

Nein, das siehst du richtig. Solange du das konsequent so umsetzt, kann ruhig isset verwendet werden.
 
@IceMatrix
Wenn du auf die Logic aufpassen würdest, hättest du deinen Fehler sofort erkennen können. "0" wird niemals (nicht als Int und String) als leer erkannt. Wenn du empty("") => true, das ist richtig aber nicht mit eine Zeichenkette.
isset überprüft nicht nur ob der Wert gesetzt ist... du kannst schreiben

$bla;
if(isset($bla) == false)
{
echo "ist nicht gesetzt";
}

$bla ist definiert aber der Wert nicht.... $bla kann auch nicht definiert werden, das wäre für PHP auch kein Problem, dann würde der trotzdem ins echo reinrutschen. isset ist für beides... Wert und Definition der Variable, genau so wie Empty. Wenn es keine Var definiert wurde, dann wird das als "leer" erkannt.

als OOP Programmierer enttäuscht mich PHP. Es gibt bei PHP Objekte die man selbst basteln kann, aber es ist eigentlich egal... denn es gibt keine feste Objekttypen.

Naja habs ja auch mit PHP angefangen, dann mit OOPHP und endlich auf echte OO Programmierung umgestiegen.
 
Zurück
Oben