[PHP] move_uploaded_file in endless loop

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Avond mensen!

Frustrerend probleem: het lijkt er op dat de functie move_uploaded_file in z'n eentje voor een eindeloze lus in mijn PHP-script zorgt. Wanneer het verplaatsen van het bestand mislukt, lijkt het alsof de functie gewoon opnieuw uitgevoerd wordt, wat dus in een lus resulteert.

Het uploaden van de bestanden zelf gaat prima; als ik bijv $_FILES["bestand"]["error"] uitlees, komt daar 0 uit (maw, de file upload is gelukt). Bij move_uploaded_file gaat het soms echter fout. Dat is trouwens ook het frustrerende; soms gaat het prima, de andere keer gaat het fout. Ook bij dezelfde bestanden.

Error reporting staat op E_ALL, maar move_uploaded_file geeft me geen warning of notice.

Als ik de break in volgend voorbeeld weglaat, dan eindigt de pagina in een eindeloze lus (om dit stukje zit een foreach heen, mij een raadsel waarom juist die foreach in een eindeloze lus blijft hangen):

PHP:
1
2
3
4
5
$fullpath = $DOCUMENT_ROOT . $ucms["uploaddir"] . $filename;
if (!move_uploaded_file($_FILES[$field]["tmp_name"], $fullpath)) {
  echo "Mislukt!<br>\n";
  break;
}


Inmiddels ben ik de wanhoop nabij. Het stukje code heeft altijd gewerkt (het is een CMS dat op een stuk of 10 sites draait, nooit problemen ondervonden). Vooral irritant is het feit dat het kreng geen warning geeft, dan zou ik al wat verder zijn.

Kijk ik over iets heen?

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Geef ook eens wat van de code er omheen en de input die je geeft aan het script.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb flink wat weggeknipt, het is een enorme lap code. Trouwens, ik zat er zelf naast: het is geen foreach, maar een for lus. Dus als move_uploaded_file mislukt, telt hij $i niet op, maar voert hij de for lus wél opnieuw uit.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
for ($i = 0; $i < $numrows; $i++) {
    $field = mysql_result($result,$i,"field");
    $type = mysql_result($result,$i,"type");

    switch ($type) {
        case "line":
        case "text":
        case "set":
            // Van alles
            break;
        case "date":
            // Nog meer van alles
            break;
        case "file":
            if (isset($_FILES[$field]["tmp_name"])) {
                $filename = stripslashes($_FILES[$field]["name"]);
                $fullpath = $DOCUMENT_ROOT . $ucms["uploaddir"] . $filename;
                if (!move_uploaded_file($_FILES[$field]["tmp_name"], $fullpath)) {
                    echo "Mislukt<br>\n";
                    break 2; // Weglaten = eindeloze lus
                }
                else {
                    chmod($fullpath, 0757);
                    include("_upload.inc.php");
                }
            }
    }
}

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Waarom gebruik je niet gewoon een while lus met mysql_fetch_assoc? DAt si een stuk sneller dan mysql_result gebruiken.

Tel verder eens hoeveel rijen er uit je db komen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ongelofelijk maar waar; het lijkt er op dat dat hem is. Het enige wat ik nu gedaan heb, is de for lus voor de while ($row = mysql_fetch_assoc($result)) vervangen. Even kijken of het blijft werken, maar voorlopig kom ik het probleem niet meer tegen.

Hoe kan dit in godsnaam met elkaar te maken hebben? Je hebt gelijk dat mysql_fetch_* performancewise sowieso beter is, maar ik had niet verwacht het probleem hier mee op te lossen.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Verwijderd schreef op 22 april 2004 @ 01:04:
Ongelofelijk maar waar; het lijkt er op dat dat hem is. Het enige wat ik nu gedaan heb, is de for lus voor de while ($row = mysql_fetch_assoc($result)) vervangen. Even kijken of het blijft werken, maar voorlopig kom ik het probleem niet meer tegen.

Hoe kan dit in godsnaam met elkaar te maken hebben? Je hebt gelijk dat mysql_fetch_* performancewise sowieso beter is, maar ik had niet verwacht het probleem hier mee op te lossen.
Wat is $numrows? Welke waarde bevat deze? Als je hier namelijk -1 of 1000000000 in zet zal het lijken alsof het echt oneindig is. Bij -1 is dat natuurlijk ook zo ;)
Pagina: 1