Switch / Case

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Switch / Case

    Hallo Community!

    Leider konnte mir die Suchfunktion nicht weiterhelfen, deswegen bin ich mal so frei und mache einen neuen Faden auf!

    Folgendes Problem:
    Ich habe ein Datei-Upload-Feld, der User wählt eine Bild-Datei aus, die anschließend auf den Server geladen wird. Das funktioniert auch soweit einwandfrei!
    PHP-Code:
    <form name="upload" enctype="multipart/form-data" action="<? echo $_SERVER["PHP_SELF"]; ?>" method="post">
    <input name="datei" type="file">
    <input type="image" src="images/button_upload.jpg" name="upload" value="Upload">
    </form>
    Jetzt möchte ich aber BEVOR das Bild hochgeladen wird, eine Eingabeüberprüfung einbauen, die prüft, ob das Bild, welches der User ausgewählt hat, zu groß ist, ob es überhaupt ein Bild ist bzw. ob der User überhaupt eine Eingabe gemacht hat...
    Meine Idee war, das mit einem SWITCH/CASE zu machen...

    PHP-Code:
         if (substr($_FILES["datei"]["type"], 05) != 'image')
            {
            
    header("Location: ".$_SERVER["PHP_SELF"]."?fehler=format");
            }
         
         switch (
    $_FILES["datei"]["error"])
                {
                case 
    0: break; // kein fehler
                
    case 1header("Location: ".$_SERVER["PHP_SELF"]."?fehler=size1");
                case 
    2: die();
                case 
    3header("Location: ".$_SERVER["PHP_SELF"]."?fehler=transfer");
               case 
    4header("Location: ".$_SERVER["PHP_SELF"]."?fehler=leer");
                } 
    Mit diesem Codeschnipsel funktioniert das auch, zumindest zeigt er mir immer die korrekte Fehlermeldung an. Ist das File zu groß, wechselt PHP in den CASE 1, macht der USER keine Eingabe, wechselt das Skript in CASE 4 und wenn das File kein Bild ist, dann springt PHP in die vorgeschaltete IF-Schleife... also alles perfekt.

    Wenn ich aber jetzt auch den CASE 2 einen Header verpasse, also:
    PHP-Code:
    case 2header("Location: ".$_SERVER["PHP_SELF"]."?fehler=size2"); 
    ...dann funktioniert das Ganze schon nicht mehr? Wenn die Datei zu groß ist, sagt mir PHP, der User hätte keine Datei ausgewählt, d.h. PHP wechselt eindeutig in die falsche Schleife, nämlich in CASE 4 statt in den korrekten CASE 1 - doch blieb der Code dieser beiden CASES unangetastet.

    Warum passiert das und wie bekomme ich das "die()" mit einem "header()" ersetzt, ohne das dieser Fehler auftritt? Ich bin wirklich am Ende, weil ich keinen Fehler im Quelltext sehen kann und mir der Fehler auch unlogisch erscheint... Ist es vielelicht sogar ein Bug? Oder bin ich nur zu dumm?

    Danke für eure Antworten,
    Gruß,
    Stefan

  • #2
    Reicht es wenn dir jemand

    switch = case + break

    sagt? Oder soll ich dir die Manpage von switch vorkauen
    gruss Chris

    [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

    Kommentar


    • #3
      JEDER case-Block muss mittels break beendet werden. Sonst kann es sein dass noch weitere nicht zutreffende Blöcke abbearbeitet werden.
      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

      Kommentar


      • #4
        Auch wenn du mit dem Zaun winkst, ich raff es immer noch nicht.
        Die Manual-Page war die erste wo ich nachgeschaut habe, aber mein Problem konnte auch die Sichtung dieser Seite nicht lösen.

        Was hat das BREAK mit dem 2. CASE zu tun? Wie gesagt, das Skript springt einfach in die falsche Schleife, sobald ich das die() mit einem header() ersetze. Der BREAK soll ja nur gemacht werden, wenn KEIN (Eingabe-)Fehler vorliegt. Aber das ist nicht mein Problem...

        EDIT:

        Danke für eure Hilfe...

        PHP-Code:
           if(isset($_FILES["datei"]))
             {
             
             if (
        substr($_FILES["datei"]["type"], 05) != 'image')
                {
                
        header("Location: ".$_SERVER["PHP_SELF"]."?fehler=format");
                }
             
             switch (
        $_FILES["datei"]["error"])
                    {
                    case 
        0: break; // kein fehler
                    
        case 1header("Location: ".$_SERVER["PHP_SELF"]."?fehler=size1");
                            break;
                    case 
        2header("Location: ".$_SERVER["PHP_SELF"]."?fehler=size2");
                            break;
                    case 
        3header("Location: ".$_SERVER["PHP_SELF"]."?fehler=transfer");
                            break;            
                        case 
        4header("Location: ".$_SERVER["PHP_SELF"]."?fehler=leer");
                            break;
                    } 
        Das funktioniert! Es lag wirklich an den fehlenden BREAKs. Dabei dachte ich, dass der BREAK nicht gebraucht wird, wenn vorher ein header() aufgerufen wurde... So kann man sich irren. Wieder was gelernt für die Zukunft... Ach und großes Danke für die Schnelligkeit der Antworten. Hat mir wirklich sehr weitergeholfen... DANKE!
        Zuletzt geändert von Dampfi; 01.10.2007, 10:09.

        Kommentar


        • #5
          PHP-Code:
          case 0: break; 
          kannst du auch gleich weg lassen
          Gruss
          H2O

          Kommentar

          Lädt...
          X