Marc2: Kann mir jemand den Unterschied erklären

Hi,
ich bin gerade dabei ein Shopsystem zu erweitern. Bei der erweiterten Suche in dem Shop wird so geprüft ob mindestens ein Feld ausgefüllt ist:

  
if ((isset ($_GET['keywords']) && empty ($_GET['keywords'])) && (isset ($_GET['pfrom']) && empty ($_GET['pfrom'])) && (isset ($_GET['pto']) && empty ($_GET['pto']))) {  
 $errorno += 1;  
 $error = 1;  
}  
elseif (isset ($_GET['keywords']) && empty ($_GET['keywords']) && !(isset ($_GET['pfrom'])) && !(isset ($_GET['pto']))) {  
 $errorno += 1;  
 $error = 1;  
}  

1. Ich versteh leider beim besten Willen nicht was der Unterschied zwischen dem ersten if und dem zweiten elseif ist.

2. Warum hat der Coder bei der zweiten elseif die ! vor die Klammer gemacht?

3. Warum schreibt er immer zuerst isset() um danach zu fragen ob es empty() ist?

Hoffe sehr das mir einer von euch weiterhelfen kann.

Schöne Grüße

  1. Hallo,

    1. Warum hat der Coder bei der zweiten elseif die ! vor die Klammer gemacht?

    Das "!" ist ein Negationsoperator. isset() gibt, wenn die Variable darin existiert, true zurück. Durch das ! wird jetzt praktisch geprüft, ob die Variable leer ist.

      
    if(!isset($beispiel)) {  
      //Hier passiert irgendwas  
    }  
    
    

    würde z.B. ausgeführt wenn die Variable $beispiel *nicht* existiert.

    1. Warum schreibt er immer zuerst isset() um danach zu fragen ob es empty() ist?

    isset() überprüft nur, ob die Variable angelegt wurde. Sie kann aber trotzdem leer sein. Das wird mit empty() geprüft.

      
    $str = ""; //Hier wird die Variable angelegt. Sie ist jedoch leer  
      
    if(isset($str)) {  
      echo "Die Variable str existiert"; //Würde hier ausgeführt.  
    }  
      
    if(empty($str)) {  
      echo "Ist aber leer..."; //Würde ebenfalls auftauchen, da sie leer ist  
    }  
    
    

    Und eine andere Variante:

      
    $str = "foo"; //Jetzt ist $foo nicht mehr leer  
      
    if(isset($str)) {  
      echo "Die Variable str existiert"; //Da wird weiterhin ausgeführt.  
    }  
      
    if(empty($str)) {  
      echo "Ist aber leer...";  
      //Das hier aber nicht leer, da $str nicht mehr ist...  
    }  
    
    

    Um noch mal auf deine erste Frage zurückzukommen:

      
      if(!empty($str)) {  
      echo "Ist nicht leer...";  
      //Wird jetzt ausgeführt, da jetzt geprüft, ob str *nicht* leer ist...  
    }  
    
    

    Gruß

    Stareagle

  2. echo $begrüßung;

    if ((isset ($_GET['keywords']) && empty ($_GET['keywords'])) && (isset ($_GET['pfrom']) && empty ($_GET['pfrom'])) && (isset ($_GET['pto']) && empty ($_GET['pto']))) {
    $errorno += 1;
    $error = 1;
    }
    elseif (isset ($_GET['keywords']) && empty ($_GET['keywords']) && !(isset ($_GET['pfrom'])) && !(isset ($_GET['pto']))) {
    $errorno += 1;
    $error = 1;
    }

    
    >   
    > 1. Ich versteh leider beim besten Willen nicht was der Unterschied zwischen dem ersten if und dem zweiten elseif ist.  
      
    Die erste Bedingung wird nur wahr bei ?keywords=0&pfrom=0&pto=0. Wobei die 0 auch wegbleiben kann. Sobald einer der Parameter fehlt, kommt die nächste zum Zug. Dann darf der Querystring nur ein leeres (oder 0) keywords enthalten, aber weder pfrom noch pto vorhanden sein, damit die Bedingung wahr wird.  
      
    
    > 2. Warum hat der Coder bei der zweiten elseif die ! vor die Klammer gemacht?  
      
    Das ist ein Negationsoperator. Der dreht die Logik um, von "wenn a ist" zu "wenn a nicht ist"  
      
    
    > 3. Warum schreibt er immer zuerst isset() um danach zu fragen ob es empty() ist?  
      
    Das Glas ist da aber leer, ist sicher oftmals gleichbedeutend mit einem nicht vorhandenen Glas. In beiden Fällen hat man nichts zu trinken. Im ersten aber immerhin ein Glas.  
      
      
    echo "$verabschiedung $name";
    
    1. Hi,

      Die erste Bedingung wird nur wahr bei ?keywords=0&pfrom=0&pto=0. Wobei die 0 auch wegbleiben kann. Sobald einer der Parameter fehlt, kommt die nächste zum Zug. Dann darf der Querystring nur ein leeres (oder 0) keywords enthalten, aber weder pfrom noch pto vorhanden sein, damit die Bedingung wahr wird.

      Nur, um's klarzustellen: Der Querystring darf beliebiges enthalten, denn der Querystring wird hier nicht ueberprueft.
      Nur, ob in diesem bestimmte Parameter (und zugehoerige Werte) vorhanden sind oder nicht, wird hier (implizit) ueberprueft.

      MfG ChrisB

  3. Hi,

    if ((isset ($_GET['keywords']) && empty ($_GET['keywords'])) && (isset ($_GET['pfrom']) && empty ($_GET['pfrom'])) && (isset ($_GET['pto']) && empty ($_GET['pto']))) {
    $errorno += 1;
    $error = 1;
    }
    elseif (isset ($_GET['keywords']) && empty ($_GET['keywords']) && !(isset ($_GET['pfrom'])) && !(isset ($_GET['pto']))) {
    $errorno += 1;
    $error = 1;
    }

    
    >   
    > 1. Ich versteh leider beim besten Willen nicht was der Unterschied zwischen dem ersten if und dem zweiten elseif ist.  
    
    Der wurde Dir ja schon genannt.  
      
    
    > 3. Warum schreibt er immer zuerst isset() um danach zu fragen ob es empty() ist?  
    
    weil er keine wirkliche Ahnung von PHP hat - allerdings im Gegensatz zu vielen Script-Kiddies nicht auf die serverseitige Deaktivierung von Fehler-Notices setzt und das Vorhandensein der Variablen prüfen will.  
      
    Würde er if($\_GET['keywords']) prpfen, gäbe es ggfls. eine solche Notice, wenn in der URL kein ?keywords enthalten ist.  
    if(empty($\_GET['keywords'])) prüft, ob die Variable vorhanden \*und\* nicht leer ist.  
    if(isset($\_GET['keywords'])) ist daher überflüssig.  
      
    Aber genauer betrachtet ist der ganze Code Murks.  
    $errorno += 1; $error = 1; soll gesetzt werden, wenn ?keywords in der URL steht, aber leer ist (also nicht ?keywords=xxx), und die weiteren Parameter 'pfrom' und 'pto' nicht vorhanden oder leer sind. Das geht viel einfacher mit:  
    ~~~php
      
    if( isset($_GET['keywords']) && empty($_GET['keywords']) && empty($_GET['pfrom']) && empty($_GET['pto']) ) {  
      $errorno += 1; $error = 1;  
    }  
    
    

    Wobei mir der Sinn dieser Abfrage überaus nerkwürdig vorkommt. Ich fürchte, dass Du es da mit einem ziemlich unausgereiften Schgript zu tun hast...

    freundliche Grüße
    Ingo

    1. Hyvää päivää!

      Wobei mir der Sinn dieser Abfrage überaus nerkwürdig vorkommt. Ich fürchte, dass Du es da mit einem ziemlich unausgereiften Schgript zu tun hast...

      Also das Gegenteil von "nerdwürdig"!
      *scnr*

      Viele Grüße vom Længlich