foreach-Schleife bricht nach einer gewissen Anzahl von Durchläufen ab

  • Moin moin,
    ich habe folgendes Problem:


    Ich wollte dieses Skript benutzen um kleine Foto-Galerien hochzuladen.


    PHP
    1. if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){ foreach ($_FILES['files']['name'] as $f => $name) { if ($_FILES['files']['error'][$f] == 4) { continue; } if ($_FILES['files']['error'][$f] == 0) { if ($_FILES['files']['size'][$f] > $max_file_size) { $message[] = "$name is too large!."; continue; } elseif( ! in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) ){ $message[] = "$name is not a valid format"; continue; } else{ // No error found! Move uploaded files if(move_uploaded_file($_FILES['files']['tmp_name'][$f], $path.$name)) $count++; } } } }


    Nur sobald es mehr Fotos als ~20 werden, bricht es mit der Meldung

    Code
    1. [COLOR=#000000][FONT=Times New Roman]Notice: Undefined index: files in /mn... on line 60
    2. Warning: Invalid argument supplied for foreach() in...[/FONT][/COLOR]


    Zeile 60 ist diese hier

    PHP
    1. foreach ($_FILES['files']['name'] as $f => $name) {


    Wäre cool wenn mir da jemand helfen könnte.
    Achja, max_file_uploads hab ich schon hochgesetzt.


    Gruß,
    Dominik

  • Es wäre nicht schlecht, wenn wir das passende Formular dazu sehen würden. Und kontrolliere mal $_FILES mit

    PHP
    1. echo "<pre>\n";
    2. print_r($_FILES);
    3. echo "</pre>\n";
  • Moin,
    klar, hier das Formular

    HTML
    1. <form action="image_gallery.php?page=images&step=3&function=upload&gallery='.$_GET['gallery'].'" method="post" enctype="multipart/form-data">
    2. <input type="file" id="file" name="files[]" multiple="multiple" accept="image/*" />
    3. <input type="submit" value="Upload!" />
    4. </form>

  • Achja, max_file_uploads hab ich schon hochgesetzt.


    Dass nützt dir nicht viel, da du auch zwei Speicherbegrenzungen drin hast, eine pro Datei und dann insgesamt nochmal. Wird eine der Bedingungen überschritten geht es in die Hose.
    Wobei 20 Dateien schon echt viel sind wenn sie entsprechend gross sind.


    Anderes Thema ist die Scriptlaufzeit, die meist nach 30 Sekunden greift und das Script abbricht. Ob der Hoster da eine Änderung zulässt vermag ich nicht zu sagen, musst du ausprobieren.

  • Ja stimmt! Das ist dann die max_execution_time nehm ich an. Bin mal gespannt, ob Strato mich das ändern lässt :) allerdings fällt mir gerade auf, dass das Skript schon durchaus länger als 30sek läuft.

  • Ja cool, also das Problem lag dann wohl an der max_execution_time. Die konnt ich hochsetzen und es kommt keine Fehlermeldung mehr! Danke schonmal! Nun kommt bloß ein anderes Problem. Und zwar wird nach dem hochladen das Verzeichnis gescannt und alle Bilder mit " | " getrennt in die Datenbank geschrieben. Nur das funktioniert bei mehr als ca. 20 Bildern auch nicht mehr. Gibt's vielleicht eine max. Länge, wie lang ein String in ner MySQL-Datenbank sein darf? Aussehen tut das da so: Bild1.jpg|Bild2.jpg|Bild_3.jpg|...usw.



    $imagesForDb wird dann in die Datenbank geschrieben.

  • Ne, ne Fehlermeldung kommt nicht. Woran könnte es noch liegen?
    Das Skript bricht ab und keins der Bilder ist hochgeladen. Aber das Skript läuft schon ein paar Minuten. Es hat auf jeden fall mit der bildanzahl/Speicher zu tun, denk ich.

  • Mit phpinfo() kannst du die Einstellungen auslesen.
    Einfach eine PHP-Datei erstellen und dort

    PHP
    1. <?php
    2. phpinfo();
    3. ?>


    eintragen und hochladen.


    Diese Datei dann aufrufen und uns folgende Werte mitteilen.


    du schaust unter Core nach und zwar interessieren folgende Werte:


    • max_execution_time
    • max_file_uploads
    • memory_limit
    • post_max_size
    • upload_max_filesize


    unter upload_tmp_dir siehst du das Verzeichnis wo die Daten zwischenzeitlich landen die du hochgeladen hast.

  • Moin,
    hier die werte:


    max_execution_time (zum Test) = 8000
    max_file_uploads = 100
    memory_limit = 104M
    post_max_size = 16M
    upload_max_filesize = 16M


    upload_tmp_dir ist nicht gesetzt (no value).


    Liebe Grüße
    Dominik

  • Die Obergrenze aller Dateien die du zusammen sendest darf 16 Megabyte nicht überschreiten.


    Wie gross sind die Dateien zusammen genommen?


    Eine einzelne Datei darf nicht grösser sein als 16 Megabyte!
    Wie gross ist die grösste Datei?


    max_file_uploads steht bei dir auf 100 oder hast du das geändert? Dieser Wert gibt an wieviele Dateien gleichzeitig gesendet werden dürfen. Voreinstellung ist normalerweise 20.

  • Wenn ich so deine Probleme anschaue muss ich sagen, dass du wahrscheinlich bei jedem gelösten Problem wieder auf neuen Ärger stossen willst. Das Grundproblem ist nämlich, dass PHP mit grossen/vielen Uploads nicht besonders gut umgehen kann.


    Meine Empfehlung wäre, die Uploads Clientseitig zu regulieren, damit du nicht die ganze Datenmenge am Stück verarbeiten musst. Ich würde dafür Plupload verwenden, das ist eine recht umfangreiche API für Clientseitiges Uploadmanagement. Damit könntest du nach jedem erfolgreichen Upload einen PHP Request auslösen, welcher dann nur für dieses einzelne File zuständig ist. Plupload ist dabei nur meine bevorzugte API, es gibt auch andere Lösungen in verschiedensten Technologien wie HTML5, Flash oder Silverlight.