+ Antworten
Ergebnis 1 bis 7 von 7

Thema: If-Anweisung funktioniert nicht, wie sie soll!

  1. #1
    TP-Veteran Dome bringt sich richtig ein Dome bringt sich richtig ein Avatar von Dome
    Registriert seit
    Feb 2004
    Ort
    Stuttgart
    Beiträge
    1.289

    If-Anweisung funktioniert nicht, wie sie soll!

    Hi, ich habe folgenden Code:

    PHP-Code:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>ShoutBox</title>
    </head>

    <body>
    <?php
    $mode 
    $_GET["mode"];


    if(
    $mode != "true" || $mode != "false"){
    $mode "false";
    }
    elseif(
    $mode == "true"){
    $mode "true";
    }

    if(
    $mode){
    echo 
    "Das Fenster wird immer im Vordergrund angezeigt!<br>";
    echo 
    "<br><a href=\"?mode=false\">PopUp normal behandeln</a>";
    echo 
    "<br><a href=\"javascript:window.close\">PopUp schließen (vom Vordergrund aus!)</a>";
    }
    elseif(
    $mode == "false"){
    echo 
    "Das Fenster wird Normal angezeigt!<br>";
    echo 
    "<br><a href=\"?mode=true\">PopUp immer im Vordergrund halten</a>";
    echo 
    "<br><a href=\"javascript:window.close()\">PopUp schließen (vom Normalen aus!)</a>";
    }

    ?>


    </body>
    </html>
    Es wird immer ein Fehler angezeigt:
    Code:
    Notice: Undefined index: mode in c:\programme\e-novative\WAMP\www\sonstiges\Shoutbox\shoutbox.php on line 10
    Das ist es aber nicht, denn "$mode" wird automatisch true und nicht false! Dann kommt der link "PopUp normal behandeln" und wenn ich drauf klicke, dann wird zwar oben in der Adressleiste das hier angezeigt: "shoutbox.php?mode=false" aber es wird immer noch das hier angezeigt:
    Code:
    Das Fenster wird immer im Vordergrund angezeigt!
    
    PopUp normal behandeln
    PopUp schließen (vom Vordergrund aus!)
    und nicht, dass es normal behandelt wird!

    Was hab ich falsch gemacht?

    P.S. ich weiß ja, woher die fehlermeldung kommt, denn ich hab das get ja nicht angegeben, und ich weiß auch, wie ich die fehlermeldung abschalten kann, aber ich wollte es doch erwähnen.
    Gruß
    Dome
    __________________
    Um mal auf das Renomee-System aufmerksam zu machen: Klick
    TP Battlebay: www.tp-battlebay.de.ki (endlich wieder Online!)

  2. #2
    TP-Specialist Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Avatar von Stuck Mojo
    Registriert seit
    Feb 2001
    Ort
    Helmstedt/Wolfsburg
    Beiträge
    4.108
    false und true sind boolsche Werte. Du nutzt Sie aber in Form von Strings. Ein String mit der Länge > 0 wird als boolscher Wert IMMER als TRUE angesehen...
    Desweiteren wird diese IF-Abfrage:
    PHP-Code:
    if ($mode != true || $mode != false){ // korrigiert
        
    $mode false

    IMMER ausgeführt! Nämlich dann wenn $mode nicht wahr ist oder wenn mode nicht falsch ist... also IMMER!

    Gruss
    Jan

  3. #3
    TP-Veteran Dome bringt sich richtig ein Dome bringt sich richtig ein Avatar von Dome
    Registriert seit
    Feb 2004
    Ort
    Stuttgart
    Beiträge
    1.289
    Bin leider noch Anfänger! deshalb meine frage: mit was muss ich das ersetzten, dass es heißt: Wenn $mode IST NICHT..., dann...?
    Gruß
    Dome
    __________________
    Um mal auf das Renomee-System aufmerksam zu machen: Klick
    TP Battlebay: www.tp-battlebay.de.ki (endlich wieder Online!)

  4. #4
    TP-Specialist rewboss ist ein richtiges Arbeitstier - DANKE rewboss ist ein richtiges Arbeitstier - DANKE rewboss ist ein richtiges Arbeitstier - DANKE rewboss ist ein richtiges Arbeitstier - DANKE rewboss ist ein richtiges Arbeitstier - DANKE rewboss ist ein richtiges Arbeitstier - DANKE Avatar von rewboss
    Registriert seit
    Mar 2005
    Ort
    Unterfranken
    Beiträge
    2.639
    Also, wenn ich dich richtig verstanden habe, willst du die Variable $mode prüfen. Wenn sie nicht definiert ist oder wenn sie einen anderen Wert als true oder false enthält, soll er den Wert false erhalten.

    Es gibt einiges hier zu berücksichtigen. Eine Sache ist die automatische Konvertierung von Datentypen. Nehmen wir dieses Beispiel:

    PHP-Code:
    $variable 0;
    if(
    $variable == false) echo "0 ist falsch"
    Die Variable $variable wird automatisch konvertiert: sie erhält einen boolschen Wert, damit die Bedingung if($variable == false) ausgeführt werden kann. Eine Zahl, die nicht gleich 0 ist, wird zu false: 0 aber wird zu false. So ist die Bedingung $variable==false wahr, und der echo-Befehl wird ausgeführt. Dasselbe passiert, wenn wir $variable zwar deklarieren, aber ihr wird kein Wert zugewiesen.

    Das kann man unterbinden, indem man === nimmt, statt ==. Dieser Operator konvertiert keine Datentypen -- sind die Daten unterschiedlicher Typen, ist das Ergebnis automatisch false:

    PHP-Code:
    $variable 0;
    if(
    $variable === false) echo "0 ist falsch"
    $variable hat einen Wert des Typs integer, false ist ein Wert des Typs boolean, also ist die Bedingung falsch und der echo-Befehl wird nicht ausgeführt.

    Für "ist nicht" nehmen wir statt != nun !== damit keine Konvertierung stattfindet.

    Zweitens: PHP ist keine natürliche Sprache. Nehmen wir den Satz "Falls $variable nicht 1 oder 2 ist...". Das können wir nicht wörtlich in PHP "übersetzen":

    PHP-Code:
    if($variable !=|| $variable !=2) echo "Hallo Welt"
    Der echo-Befehl wird immer ausgeführt. Warum? Weil || bedeutet: Wenn links wahr ist, oder rechts wahr ist, oder beides, dann ist das Ergebnis wahr. Gleicht $variable 1, ist links falsch und rechts wahr; gleicht $variable 2, ist links wahr und rechts falsch. Gleicht $variable etwas anders, sind beide Seiten wahr. In allen drei Fällen ist das Ergebnis wahr.

    Statt || brauchen wir && -- das bedeutet: Das Ergebnis ist nur dann wahr, wenn links und rechts wahr ist:

    PHP-Code:
    if($variable !=&& $variable !=2) echo "Hallo Welt"
    Zu Deutsch: Falls $variable nicht 1 ist und $variable auch nicht 2 ist...

    Nun zurück zum eigentlichen Problem. Wenn $mode keinen boolschen Wert hat, soll sie den Wert false erhalten. Wenn sie gar nicht vorhanden ist, soll sie den Wert false erhalten. Nur, wenn sie true ist, soll sie so bleiben, wie sie ist.

    Die Funktion isset() prüft ob eine Variable überhaupt existiert. Amsonsten brauchen wir nur noch zu prüfen, ob $mode den boolschen Wert true hat; dabei verwenden wir === bzw. !==, damit der Wert nicht konvertiert wird. Und so sieht's aus:

    PHP-Code:
    if(!isset($mode) || $mode!==true$mode=false
    Zu Deutsch: Falls $mode nicht existiert, oder $mode einen anderen Wert als den boolschen Wert true hat, dann...

  5. #5
    TP-Veteran Dome bringt sich richtig ein Dome bringt sich richtig ein Avatar von Dome
    Registriert seit
    Feb 2004
    Ort
    Stuttgart
    Beiträge
    1.289

    wenn ich dich jetzt richtig verstanden habe, dann

    ... müsste es ja so funktionieren:

    PHP-Code:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>ShoutBox</title>
    </head>

    <body>
    <?php
    $mode 
    $_GET["mode"];

    if(!isset(
    $mode) || $mode!==true){
    $mode false
    }

    if(
    $mode){
    echo 
    "Das Fenster wird immer im Vordergrund angezeigt!<br>";
    echo 
    "<br><a href=\"?mode=false\">PopUp normal behandeln</a>";
    echo 
    "<br><a href=\"javascript:window.close\">PopUp schließen (vom Vordergrund aus!)</a>";
    }
    elseif(!
    $mode){
    echo 
    "Das Fenster wird Normal angezeigt!<br>";
    echo 
    "<br><a href=\"?mode=true\">PopUp immer im Vordergrund halten</a>";
    echo 
    "<br><a href=\"javascript:window.close()\">PopUp schließen (vom Normalen aus!)</a>";
    }

    ?>


    </body>
    </html>
    Das tut es aber nicht! Es wird immer als False behandelt, obwohl $mode eigentlich True sein müsste! Oder was hab ich falsch gemacht?
    Gruß
    Dome
    __________________
    Um mal auf das Renomee-System aufmerksam zu machen: Klick
    TP Battlebay: www.tp-battlebay.de.ki (endlich wieder Online!)

  6. #6
    TP-Specialist rewboss ist ein richtiges Arbeitstier - DANKE rewboss ist ein richtiges Arbeitstier - DANKE rewboss ist ein richtiges Arbeitstier - DANKE rewboss ist ein richtiges Arbeitstier - DANKE rewboss ist ein richtiges Arbeitstier - DANKE rewboss ist ein richtiges Arbeitstier - DANKE Avatar von rewboss
    Registriert seit
    Mar 2005
    Ort
    Unterfranken
    Beiträge
    2.639
    Ach! -- ich Depp!

    OK, du machst das mit einem Query-String, etwa so:

    domain/datei.php?mode=true;

    In dem Fall ist die Variable $_GET['mode'] ein String. Das heißt, auch wenn im Query mode=true steht, ist die Bedingung $_GET['mode']===true immer falsch. Wobei $_GET['mode']==="true" ist dann wahr.

    Das Problem ist, auch wenn mode=false steht, ist die Bedingen $_GET['mode']==false auch noch falsch. Warum? Auch wenn wir == nehmen, wird der String "false" in den boolschen Wert true umgewandelt. Nur der String "" (also, ein leerer String) wird in false konvertiert.

    Eine Möglichkeit bestünde darin, den String als String zu prüfen. In dem Fall, müssen wir prüfen, ob der String den Wert "true" hat, wenn nicht, soll der den Wert "false" haben, etwa so:

    PHP-Code:
    if(!isset($mode) || $mode!=="true"$mode="false"
    Merke -- das sind keine boolschen Werte, sondern Strings. Also if($mode) muss in if($mode=="true") umgewandelt.

    Eine zweite Möglichkeit wäre, den String in einen boolschen Wert umzuwandeln. Das ginge dann so:

    PHP-Code:
    $mode = ($mode=="true") ? true false
    Wenn du den Operator ?: nicht kennst, dann funktioniert es so:

    Bedingung ? A : B

    bedeutet: Wenn die Bedingung wahr ist, nimm A; wenn die Bedingung falsch ist, nimm B. In unserem Fall also: Wenn die Variable $mode den Wert "true" hat, dann soll sie den boolschen Wert true erhalten: in allen anderen Fällen kriegt sie den Wert false. Dann funktioniert später die Bedingung if($mode).

    Eine dritte Möglichkeit wäre, nicht mode=true oder mode=false zu nehmen, sondern mode=1 bzw mode=0. In diesem Fall wird in der if-Bedingung if($mode) der Wert 1 in true konvertiert und der Wert 0 in false. Vorsichtshalber könntest du noch prüfen, ob $_GET['mode'] vorhanden ist. Also:

    PHP-Code:
    $mode = (isset($_GET['mode'])) ? $_GET['mode'] : 0;

    if(
    $mode){
      
    // Fenster wird im Vordergrund gezeigt
    }
    else{
      
    // Fenster wird normal gezeigt

    Geändert von rewboss (03.07.2005 um 16:39 Uhr)

  7. #7
    TP-Veteran Dome bringt sich richtig ein Dome bringt sich richtig ein Avatar von Dome
    Registriert seit
    Feb 2004
    Ort
    Stuttgart
    Beiträge
    1.289
    Danke für die Hilfe!
    so hab ichs gemacht und so funktionierts!
    PHP-Code:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>ShoutBox</title>
    </head>

    <body>
    <?php
    $mode 
    = (isset($_GET['mode'])) ? $_GET['mode'] : 0

    if(
    $mode){ 
    echo 
    "Das Fenster wird immer im Vordergrund angezeigt!<br>";
    echo 
    "<br><a href=\"?mode=0\">PopUp normal behandeln</a>";
    echo 
    "<br><a href=\"javascript:window.close\">PopUp schließen (vom Vordergrund aus!)</a>";
    }
    else{
    echo 
    "Das Fenster wird Normal angezeigt!<br>";
    echo 
    "<br><a href=\"?mode=true\">PopUp immer im Vordergrund halten</a>";
    echo 
    "<br><a href=\"javascript:window.close()\">PopUp schließen (vom Normalen aus!)</a>";




    ?>


    </body>
    </html>
    THX!!!!!!
    Gruß
    Dome
    __________________
    Um mal auf das Renomee-System aufmerksam zu machen: Klick
    TP Battlebay: www.tp-battlebay.de.ki (endlich wieder Online!)

+ Antworten

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51