Matthias: $_FILES['bild']['tmp_name'] überprüfen ob vorhanden?

Ich überprüfe die Bildinformationen mit:

$picture = getimagesize ($_FILES['bild']['tmp_name']);

wenn aber kein Bild in meiner Var drin ist, bekomme ich eine Fehlermeldung. ich habe schon versucht es mit
isset abzufangen, aber es klappt nicht. Kann mir jemand sagen wie ich die Fehlermeldung abfange?

Matthias

  1. Hello,

    $picture = getimagesize ($_FILES['bild']['tmp_name']);

    wenn aber kein Bild in meiner Var drin ist, bekomme ich eine Fehlermeldung. ich habe schon versucht es mit
    isset abzufangen, aber es klappt nicht. Kann mir jemand sagen wie ich die Fehlermeldung abfange?

    Frag erst nach, ob der Upload von PHP als fehlerfrei erkannt wurde.
    Wenn genau ein File hochgeladen wurde, ist

    $_FILES['bild']['error']) === UPLOAD_ERR_OK

    if (isset($_FILES['bild']['error']) and $_FILES['bild']['error']) === UPLOAD_ERR_OK)
    {
        $pic_data = getimagesize ($_FILES['bild']['tmp_name']);
    }

    Dann kannst Du auch davon ausgehen, dass ein tmp_name vorhanden ist für das File.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hi!

      $picture = getimagesize ($_FILES['bild']['tmp_name']);
      wenn aber kein Bild in meiner Var drin ist, bekomme ich eine Fehlermeldung. ich habe schon versucht es mit isset abzufangen, aber es klappt nicht. Kann mir jemand sagen wie ich die Fehlermeldung abfange?

      Da ist kein Bild sondern der Pfad zu einer Datei drin. Wenn was anderes (außer NULL) drin ist, ergibt isset() immer true, ist also keine geeignete Test-Funktion.

      Frag erst nach, ob der Upload von PHP als fehlerfrei erkannt wurde.
      Wenn genau ein File hochgeladen wurde, ist

      $_FILES['bild']['error']) === UPLOAD_ERR_OK

      Besser wäre is_uploaded_file() zu befragen.

      Früher hatte (nach meinen Erinnerungen) die Funktion auch bei ungültigen Bilddateien einen Fehler geworfen, was aber wohl nicht mehr der Fall ist. Da half nur der Einsatz des @-Operators. Auftretende Fehler erkennt man programmtechnisch sowieso am Rückgabewert der Funktion.

      Lo!

      1. Wenn ich es richtig verstanden habe dann so:

        if (is_uploaded_file($_FILES['userfile']['tmp_name']))

        aber dann bekomme ich folgende Fehlermeldung:

        Undefined index: userfile

        Matthias

        1. Hallo,

          if (is_uploaded_file($_FILES['userfile']['tmp_name']))
          Undefined index: userfile

          das heißt, $_FILES['userfile'] existiert nicht, ein Upload einer Datei mit diesem Namensfeld hat also nicht stattgefunden. Genau das solltest du aber erst mit isset() abfragen. Was ist dir dabei nicht gelungen?

          So long,
           Martin

          --
          Männer haben nur eine Angst: Die Angst, kein Mann zu sein.
            (Liv Tyler, US-Schauspielerin)
          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          1. Verstehe ich das richtig:

            if(isset(is_uploaded_file($_FILES['userfile']['tmp_name'])))

            Matthias

            1. Hallo,

              Verstehe ich das richtig:
              if(isset(is_uploaded_file($_FILES['userfile']['tmp_name'])))

              nein, anscheinend nicht.
              Es hat keinen Sinn zu fragen, ob es in Rudersberg eine Heinz-Erhardt-Straße gibt, wenn noch nicht bekannt ist, ob Rudersberg überhaupt existiert.
              Auf dein Beispiel bezogen: Du kannst nicht nach der Existenz von $_FILES['userfile']['tmp_name'] fragen, wenn nicht einmal $_FILES['userfile'] existiert.

              Ciao,
               Martin

              --
              Ja, ja ... E.T. wusste schon, warum er wieder nach Hause wollte.
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. Hello,

                Verstehe ich das richtig:
                if(isset(is_uploaded_file($_FILES['userfile']['tmp_name'])))

                nein, anscheinend nicht.
                Es hat keinen Sinn zu fragen, ob es in Rudersberg eine Heinz-Erhardt-Straße gibt, wenn noch nicht bekannt ist, ob Rudersberg überhaupt existiert.

                Auf dein Beispiel bezogen: Du kannst nicht nach der Existenz von $_FILES['userfile']['tmp_name'] fragen, wenn nicht einmal $_FILES['userfile'] existiert.

                Das stimmt nicht wirklich.
                Nach

                if (isset($_FILES['userfile']['tmp_name']))

                kann er in PHP jederzeit fragen. Das Ergebnis von isset() sagt aber nichts darüber aus, in welcher Tiefe

                1)   $_FILES
                2)   $_FILES['userfile']
                3)   $_FILES['userfile']['tmp_name']

                die Struktur und damit auch die Variable existiert.

                Das müsste er, wenn es denn notwendig wäre, Stufe für Stufe verifizieren.

                Darum hatte ich vorgeschlagen, zuerst

                if (isset($_FILES['bild']['error']) and $_FILES['bild']['error']) === UPLOAD_ERR_OK)

                zu prüfen, denn wenn diese Bedingungskombination erfüllt ist, muss auch ein File vorhanden sein, von dem man dann auch gerne noch prüfen mag, ob es ein "uploaded File" ist. Das hat aber gar keinen Zweck, wenn der Upload als solcher schon fehlerhaft war.

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Hello,

                  kleine Korrektur. Meine Ausage betrifft den Fehlerfall...

                  Das Ergebnis von isset() sagt aber bei false als Antwort nichts darüber aus, in welcher Tiefe

                  1)   $_FILES
                  2)   $_FILES['userfile']
                  3)   $_FILES['userfile']['tmp_name']

                  die Struktur und damit auch die Variable noch existiert.

                  Das müsste er, wenn es denn notwendig wäre, Stufe für Stufe verifizieren.

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                2. Hi,

                  Nach
                     if (isset($_FILES['userfile']['tmp_name']))
                  kann er in PHP jederzeit fragen.

                  ja, nur dass als Ergebnis drei unterschiedliche Fälle möglich sind:

                  a) true:  Das angefragte Element existiert
                  b) false: Das angefragte Element existiert nicht
                  c) false + Notice-Meldung: Das angefragte Element existiert nicht, nicht einmal dessen Elternelement

                  Fall c) scheint bei Matthias vorzuliegen. Er fragt nach $_FILES['userfile']['tmp_name'] und bekommt eine Notice-Meldung. Also "fehlt" ihm nicht nur $_FILES['userfile']['tmp_name'], sondern auch schon das übergeordnete $_FILES['userfile'], was er vorher erst abprüfen müsste.

                  Das Ergebnis von isset() sagt aber nichts darüber aus, in welcher Tiefe

                  1)   $_FILES
                  2)   $_FILES['userfile']
                  3)   $_FILES['userfile']['tmp_name']

                  die Struktur und damit auch die Variable existiert.
                  Das müsste er, wenn es denn notwendig wäre, Stufe für Stufe verifizieren.

                  Genau das wollte ich mit meinem vorherigen Beitrag schon veranschaulichen.

                  Darum hatte ich vorgeschlagen, zuerst
                       if (isset($_FILES['bild']['error']) and $_FILES['bild']['error']) === UPLOAD_ERR_OK)
                  zu prüfen

                  Das würde ebenfalls eine Notice werfen, wenn schon $_FILES['bild'] nicht existiert.

                  Ciao,
                   Martin

                  --
                  Wer im Glashaus sitzt, sollte Spaß am Fensterputzen haben.
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                  1. Hello,

                    c) false + Notice-Meldung: Das angefragte Element existiert nicht, nicht einmal dessen

                    Elternelement

                    Das habe ich noch nie erlebt, dass bei isset() eine Notice kommt.

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                     ☻_
                    /▌
                    / \ Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
                  2. Hi!

                    c) false + Notice-Meldung: Das angefragte Element existiert nicht, nicht einmal dessen Elternelement

                    Auch in dem Fall kommt keine Fehlermeldung. Deswegen ist ja isset() ein Sprachkonstrukt und keine Funktion, so dass das, was da als Argument angegeben ist, nicht bereits vor Funktionsaufruf aufzulösen versucht wird.

                    Lo!

                  3. Hi,

                    Nach
                       if (isset($_FILES['userfile']['tmp_name']))
                    kann er in PHP jederzeit fragen.

                    ja, nur dass als Ergebnis drei unterschiedliche Fälle möglich sind:

                    a) true:  Das angefragte Element existiert
                    b) false: Das angefragte Element existiert nicht
                    c) false + Notice-Meldung: Das angefragte Element existiert nicht, nicht einmal dessen Elternelement

                    Fall c) scheint bei Matthias vorzuliegen. Er fragt nach $_FILES['userfile']['tmp_name'] und bekommt eine Notice-Meldung. Also "fehlt" ihm nicht nur $_FILES['userfile']['tmp_name'], sondern auch schon das übergeordnete $_FILES['userfile'], was er vorher erst abprüfen müsste.

                    Nein, müsste er nicht - weil PHP bei isset in Bezug auf Arrays so „tolerant“ ist, sich nicht darum zu kümmern, ob die vorherigen Ebenen alle existieren.

                    Darum hatte ich vorgeschlagen, zuerst
                         if (isset($_FILES['bild']['error']) and $_FILES['bild']['error']) === UPLOAD_ERR_OK)
                    zu prüfen

                    Das würde ebenfalls eine Notice werfen, wenn schon $_FILES['bild'] nicht existiert.

                    Nein, würde es nicht.

                    MfG ChrisB

                    --
                    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                    1. Hello,

                      Nein, müsste er nicht - weil PHP bei isset in Bezug auf Arrays so „tolerant“ ist, sich nicht darum zu kümmern, ob die vorherigen Ebenen alle existieren.

                      PHP wertet die Bezeichnerkette einfach von links nach rechts aus. Solange kein Glied fehlt, wird weiter ausgewertet.

                      Darum hatte ich vorgeschlagen, zuerst
                           if (isset($_FILES['bild']['error']) and $_FILES['bild']['error']) === UPLOAD_ERR_OK)
                      zu prüfen

                      Das würde ebenfalls eine Notice werfen, wenn schon $_FILES['bild'] nicht existiert.

                      Nein, würde es nicht.

                      Hierzu entsteht der Artikel im WIKI
                      http://wiki.selfhtml.org/wiki/Artikel:PHP/File_Upload

                      Mir dünkt, dass man auf die Zusammenhänge zwischen HTML-Formular und $_FILES-Array in PHP doch noch genauer (mit einer Zeichnung) eingehen könnte.

                      Immerhin gibt es ja auch noch die Unterscheidung zwischen Single-Upload und Multi-Upload. PHP verwendet für beide Varianten unterschiedliche Datenmodelle des $_FILES-Array.

                      Liebe Grüße aus dem schönen Oberharz

                      Tom vom Berg

                      --
                       ☻_
                      /▌
                      / \ Nur selber lernen macht schlau
                      http://bergpost.annerschbarrich.de
        2. Hallo Matthias,

          if (is_uploaded_file($_FILES['userfile']['tmp_name']))
          aber dann bekomme ich folgende Fehlermeldung:

          Undefined index: userfile

          warum bist Du verwundert. Deinem Erstbeitrag entnehme ich, dass Dein Formularfeld

          bild

          heißt und nicht

          userfile

          Um den Fehlerunterdrückungsoperator wirst Du wohl nicht herumkommen. Die Dateien sind Benutzereingaben und Du kannst nicht ausschließen, dass jemand einfache Textdateien oder unpassende Binärdateien hochlädt.

          Freundliche Grüße

          Vinzenz

        3. Hi,

          Wenn ich es richtig verstanden habe dann so:

          if (is_uploaded_file($_FILES['userfile']['tmp_name']))

          aber dann bekomme ich folgende Fehlermeldung:

          Undefined index: userfile

          Dann wurde wohl unter dem Parameter-Namen userfile keine Datei hochgeladen.

          Hast du das jetzt einfach per copy&paste übernommen, ohne daran zu denken, dass entsprechend der Benamung des Feldes in deinem Formular anzupassen ...?

          MfG ChrisB

          --
          RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        4. Hi!

          Wenn ich es richtig verstanden habe dann so:
          if (is_uploaded_file($_FILES['userfile']['tmp_name']))
          aber dann bekomme ich folgende Fehlermeldung:
          Undefined index: userfile

          Generell solltest du erst einmal prüfen, ob überhaupt ein Upload stattgefunden hat. Dafür ist die Existenz der Einträge in $_FILES zu prüfen und auch ob Fehler im error-Eintrag angezeigt werden. is_uploaded_file() ist dann erst der nächste Schritt, um zu prüfen, ob der Wert im Dateiname-Feld auf eine hochgeladene Datei verweist.

          Lo!