Sp33dy G0nz4l3s: OR funktioniert nicht

Hi, ich habe mir ein Formular erstellt mit Hilfe dem Dateien hochgeladen werden können. Nun prüfe ich so ob auch nur die erlaubten Formate hochgeladen wurden:

  
elseif ($_FILES['File']['type'] != "application/msword" || $_FILES['File']['type'] != "application/force-download" || $_FILES['File']['type'] != "application/" || $_FILES['File']['type'] != "plain/text") {  
  $fehler = true;  
  $red4 = true;  
  $fehlertext .= "Du kannst nur Dateien mit den Endungen .doc, .txt, .rar, und .zip hochladen.<br>\n";  
  }

Mein Problem ist, dass das OR (||) nicht funktioniert. Immer wenn ich eine eigentlich richtige Datei hochlade wird eine Fehlermeldung angezeigt. Wenn ich jedoch z.B. $_FILES['File']['type'] != "application/force-download" allein stehen lasse geht es.

Könnt ihr mir sagen warum das nicht geht?

  1. Hello,

    Könnt ihr mir sagen warum das nicht geht?

    ja, kleiner aber feiner Denkfehler in deiner Logik:
    typ ist nicht a
    ODER
    typ ist nicht b
    ...
    egal was du da tust, es wird immer anschlagen...

    MfG
    Rouven

    --
    -------------------
    Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
  2. hi,

    Hi, ich habe mir ein Formular erstellt mit Hilfe dem Dateien hochgeladen werden können. Nun prüfe ich so ob auch nur die erlaubten Formate hochgeladen wurden

    Abgesehen von der aktuellen Problematik:

    Diese Prüfung taugt wenig - denn der Wert, auf den du prüfst, wird dir ebenfalls vom Client übergeben, muss also nicht der Wahrheit entsprechen.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  3. elseif ($_FILES['File']['type'] != "application/msword" || $_FILES['File']['type'] != "application/force-download" || $_FILES['File']['type'] != "application/" || $_FILES['File']['type'] != "plain/text") {
      $fehler = true;
      $red4 = true;
      $fehlertext .= "Du kannst nur Dateien mit den Endungen .doc, .txt, .rar, und .zip hochladen.<br>\n";
      }

    
    >   
    > Mein Problem ist, dass das OR (||) nicht funktioniert. Immer wenn ich eine eigentlich richtige Datei hochlade wird eine Fehlermeldung angezeigt. Wenn ich jedoch z.B. $\_FILES['File']['type'] != "application/force-download" allein stehen lasse geht es.  
      
    Du hast einen Denkfehler drin. Die Fehlermeldung soll angezeigt werden, wenn ALLE Bedingungen erfüllt sind. Ergo: Ersetze dass oder durch und (&&), und es wird funktionieren.  
      
    Konkret gesehen passiert folgendes bei der Auswertung deines Ausdrucks. Zuerst werden die Vergleiche durchgeführt. Diese können entweder wahr (1) oder falsch (0) sein. Dann werden diese boolschen Werte durch den jeweiligen Operator verknüpft.  
      
    Beispiel: Jemand versucht eine Power-Point-Datei hochzuladen (PPT). Dann sind alle Vergleiche wahr (1).  
      
    Versucht jemand dagegen eine Word-Datei hochzuladen: Dann ist der erste Vergleich Falsch (0), die anderen wahr.  
      
    Die Wahrheitstabellen für das boolsche AND sieht wie folgt aus:  
      
    A B  
    0 0 0  
    0 1 0  
    1 0 0  
    1 1 0  
      
    Die Wahrheitstabelle für OR sieht wie folgt aus:  
      
    A B  
    0 0 0  
    0 1 1  
    1 0 1  
    1 1 0  
      
    Hoffe es ist jetzt klarer, warum du AND verwenden musst.  
      
    Gruß  
      
    Stareagle
    
    1. Hi,

      Konkret gesehen passiert folgendes bei der Auswertung deines Ausdrucks. Zuerst werden die Vergleiche durchgeführt. Diese können entweder wahr (1) oder falsch (0) sein. Dann werden diese boolschen Werte durch den jeweiligen Operator verknüpft.

      Nein, das geschieht so nicht.

      Der erste Vergleich wird durchgeführt.
      Liefert dieser True, wird der zweite Vergleich nicht mehr durchgeführt, da für das erste or bereits feststeht, daß es true ergibt.
      Da dann ebenfalls für das zweite or der erste Operand true ist, wird auch der dritte Vergleich nicht mehr durchgeführt usw.

      Liefert der erste Vergleich false, wird der zweite Vergleich durchgeführt und das or angewendet.
      Kommt true heraus, werden die weiteren Vergleiche nicht mehr durchgeführt (da ja jeweils für das or bereits das Ergebnis feststeht).
      Nur bei false wird der jeweils nächste Vergleich durchgeführt.

      Die Wahrheitstabellen für das boolsche AND sieht wie folgt aus:
      A B
      0 0 0
      0 1 0
      1 0 0
      1 1 0

      Ah ja, seltsame Logik, egal, was in A und B steht, es kommt immer 0 raus?

      Quatsch, die letzte Zeile muß natürlich

      1 1 1
      lauten.

      Die Wahrheitstabelle für OR sieht wie folgt aus:
      A B
      0 0 0
      0 1 1
      1 0 1
      1 1 0

      Und schon wieder falsch. Das wäre die Wahrheitstabelle für XOR.
      Für Or lautet die letzte Zeile

      1 1 1

      Hoffe es ist jetzt klarer, warum du AND verwenden musst.

      Anhand Deiner falschen Beschreibung? Nein.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  4. DANKE!!! Wenn man es verstanden hat ist es eigentlich ein dummer Fehler :)

    Ich habe noch eine Frage:

    So prüfe ich, wie groß die Datei ist:

      
    elseif ($_FILES['File']['size'] > 3145728) {  
      $fehler = true;  
      $red4 = true;  
      $fehlertext .= "Du kannst nur Dateien hochladen, die nicht größer als 3 MB sind.<br>\n";  
      }
    

    Wenn ich jetzt z.B. eine Datei mit 4 MB hochlade, zeigt er erwartungsgemäß, das die Datei zu groß ist. Versuche ich es jetzt jedoch mit einer 9 MB Datei zeigt er gar keine Fehlermeldung an.

    Es passiert gar nichts, außer das alle Eingaben gelöscht werden.

    Wisst ihr warum das so ist? Kann es sein, das man in einem Browser nicht Dateien von "unendlicher" Größe uploaden kann?

    Falls ja, gibt es eine Möglichkeit dennoch die Fehlermeldung anzeigen zu lassen?

    1. echo $begrüßung;

      Ich habe noch eine Frage:

      Beschäftige dich mit dem Kapitel Handling file uploads des Handbuchs. In ihm sind alle Fehlermeldungen (Inhalt des Array-Elements 'error') und die für Dateiuploads geltenden Einstellungen der php.ini angegeben (Kapitel Common Pitfalls).

      echo "$verabschiedung $name";

    2. Hallo,

      elseif ($_FILES['File']['size'] > 3145728) {

      $fehler = true;
        $red4 = true;
        $fehlertext .= "Du kannst nur Dateien hochladen, die nicht größer als 3 MB sind.<br>\n";
        }

        
      
      > Wenn ich jetzt z.B. eine Datei mit 4 MB hochlade, zeigt er erwartungsgemäß, ...  
        
      wer ist "er"?  
        
      
      > Versuche ich es jetzt jedoch mit einer 9 MB Datei zeigt er gar keine Fehlermeldung an.  
      > Es passiert gar nichts, außer das alle Eingaben gelöscht werden.  
        
      Dein Server (oder PHP) wird die Annahme des Uploads verweigern, nehme ich an. In der Konfiguration von PHP (php.ini) kann eine maximal zulässige Größe für Dateiuploads festgelegt sein, dieser Wert steht oft auf 8MB.  
        
      
      > Kann es sein, das man in einem Browser nicht Dateien von "unendlicher" Größe uploaden kann?  
        
      Der Browser würde das wahrscheinlich lustig tun. Bis der Server den Transfer abwürgt oder hinterher verwirft.  
        
      
      > Falls ja, gibt es eine Möglichkeit dennoch die Fehlermeldung anzeigen zu lassen?  
        
      I'm afraid no. Soweit ich weiß, wird das PHP-Script auf dem Server gar nicht erst gestartet, wenn die maximale Upload-Größe überschritten ist.  
        
      So long,  
       Martin  
      
      -- 
      Husten kann böse Folgen haben.  
      Besonders im Kleiderschrank.
      
    3. Hi!

      Wenn ich jetzt z.B. eine Datei mit 4 MB hochlade, zeigt er erwartungsgemäß, das die Datei zu groß ist. Versuche ich es jetzt jedoch mit einer 9 MB Datei zeigt er gar keine Fehlermeldung an.

      Die Dateigröße kann PHP erst bestimmen, wenn die Datei hochgeladen wird bzw. wurde.
      In $_FILES['File']['size'] ist die Größe also erst nach dem Upload enthalten.
      Ich weiß nicht, welche maximale Größe für Uploads in der php.ini angegeben ist.
      Eventuell ist deine Datei größer als dort vorgegeben.
      Dann wird deine Datei bereits von PHP abgelehnt, wenn soviel Daten wie in der php.ini zugelassen sind, hochgeladen wurden.
      Die Datei wird also abgelehnt, bevor deine Überprüfung greift und deswegen wird deine Fehlermeldung nicht gezeigt.
      Das vermute ich in diesem Fall jedenfalls.
      Du solltest deswegen prüfen, ob die Datei hochgeladen wurde, bevor du dann die Größe checkst.

      Zusätzlich würde ich außerdem noch eine clientseitige Prüfung einbauen.
      Du kannst die maximale Uploadgröße über ein Hidden-Formularfeld festlegen.
      Das ist prinzipiell zwar leicht zu umgehen (wenn man denn will), aber trotzdem hättest du dadurch eine zusätzliche Prüfung, so daß zu große Dateien gar nicht erst hochgeladen werden.
      Die serverseitge Prüfung ersetzt das in keinem Fall, da man die clientseitige Prüfung halt leicht faken könnte.
      In vielen Fällen kannst du dir damit aber sicherlich unnötige Uploads ersparen.

      Schöner Gruß,
      rob

      1. Okay danke! Werde ich auf jeden Fall noch einbauen.

        Nachdem ich nun alles auf meinem localhost gestestet habe und auch alles funktioniert hat habe ich es auf meinen Webspace hochgeladen.

        Nun funktioniert auf einmal der Dateiupload nicht. Jedes mal kommt die Meldung "Du musst noch die Datei deines Tutorials auswählen.".

        Ich verstehe das nicht. Habe nun alles nocheinmal überprüft jedoch habe ich keine Lösung gefunden, damit es wie auf dem localhost funktioniert.

        Ich habe hier einmal mein komplettes Script hochgeladen:
        http://www.cs-erweiterungen.de/files/script.txt

        Kann es sein, das mein Hoster da etwas ausgeschalten hat?

        1. Hi!

          Kann es sein, das mein Hoster da etwas ausgeschalten hat?

          Das kannst du dir doch ansehen: <?php php_info(); ?>
          "file_uploads" sollte auf "on" stehen.

          $_FILES['File']['type'] != "application/force-download"

          Hälst du diese Prüfung für sinnvoll?
          Was für eine Datei könnte man denn hochladen, die diesem MIME-Type hat?

          elseif ($_FILES['File']['type'] != "application/msword" && $_FILES['File']['type'] != "application/force-download" && $_FILES['File']['type'] != "application/" && $_FILES['File']['type'] != "plain/text") {
            $fehler = true;
            $red4 = true;
            $fehlertext .= "Du kannst nur Dateien mit den Endungen .doc, .txt, .rar, und .zip hochladen.<br>\n";
            }

          Sehr merkwürdige Prüfung.
          Man soll also nur Dateien mit den Endungen ".doc, .txt, .rar, und .zip" hochladen können.
          Warum prüfst du dann nicht, ob es sich um so eine Datei handelt und gibst eine Fehlermeldung aus, wenn es nicht so ist?
          php-, exe-, bla-, gurke-, banane-, ...-Dateien kann man bei dieser Prüfung alle hochladen, ohne daß es zu einer Fehlermeldung kommt.

          case 'application/':

          »»  $name .= ".zip";
          Und hälst du "application/" für den richtigen MIME-Type von Zip-Dateien?

          Schöner Gruß,
          rob

          1. Hi!

            Kann es sein, das mein Hoster da etwas ausgeschalten hat?
            Das kannst du dir doch ansehen: <?php php_info(); ?>
            "file_uploads" sollte auf "on" stehen.

            http://www.cs-erweiterungen.de/phpinfo.php/

            Es ist aus oder? Bin mir nicht ganz sicher, weil links off und rechts on steht.

            1. Hi!

              Es ist aus oder?

              Ja, File-Uploads sind dort deaktiviert.

              Bin mir nicht ganz sicher, weil links off und rechts on steht.

              Wenn du dir die Überschriften der Spalten angesehen hättest, hättest du das auch alleine rausfinden können.
              Die linke Spalte trägt die Überschrift "local Value" und die rechte "Master Value".
              "Master Value" heißt, daß dieser Wert so in der php.ini eingestellt ist.
              Unterscheidet sich dieser vom "Local Value", dann heißt das, daß eine Verzeichniseinstellung aktiv ist.
              Der Upload ist dann vermutlich über eine htaccess-Datei für diesen Ordner deaktiviert worden.

              http://www.php-faq.de/q/q-konfiguration-werte.html

              Schöner Gruß,
              rob