Naar volgende item in array (WHILE)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Patrick vd Pols

Patrick vd Pols

03/05/2012 18:58:37
Quote Anchor link
Hey allemaal,

Ik loop tegen een probleem aan. Ik ben overnieuw begonnen het met scripten van een upload systeem. Nu check ik alles eerst client side met javascript(het form kan ook niet gesubmit worden zonder javascript) en daarna nog een keer server side met PHP.

Hier een stukje van de code :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    while(list($key,$value) = each($_FILES['images']['name']))
            {            
                // check if at least 1 file is selected
                if (!empty($_FILES['images']['name'][$key]))
                    {                // At least 1 file is selected, so we can do some more stuff:
                         $continue = 'TRUE'; // Let it continue
                        
                        // We have to save the file extension, so we can add this back to the encrypted name later
                         $fileextension = pathinfo($value, PATHINFO_EXTENSION);
            
                         // Lets generate a random unique number, to prevent duplicate filenames;
                           $random_number = rand(1001,999999);
      
                         // Add the random to the filename      
                         $random_number_file_name = $random_number.$value;
                         // Now we change the name to an MD5 hash, and add back the filextension. (DONT FORGET THE DOT)
                         $filename = md5($random_number_file_name).".".$fileextension;
                                        
                    // check if the files posted have the right extension.
                    if (in_array($_FILES['images']['type'][$key], $allowed_files) && $continue == 'TRUE')
                    {                    
                        $continue = 'TRUE';
                    }
                    else {
                        
                        $continue = 'FALSE';
                      
                        echo $value." - Invalid File Type";
                        
                    }
                    // Check if the files are not more than 1mb (1048576 is the exact value of 1mb)
                    if ($_FILES['images']['size'][$key] < $max_size  && $continue == 'TRUE')
                    {
                        $continue = 'TRUE';
                    }
                     else {
                        $continue = 'FALSE';
                        echo $value." - Size exceeds 1MB";
                    }
                }
                
                else { // No file is selected.
                
                    echo "No image selected.";
                }
                
                if ($continue == 'TRUE') // If everything is checked and passed the test
                {
                    // Time to move the uploaded files to their directory
                    move_uploaded_file($_FILES['images']['tmp_name'][$key], $map . $filename);
                    echo $value." - Upload Succes<br />";
                    echo $public_map.$filename;
                    echo "<br /><br />";
                    
                }
                              
                
                
            }

Nu heb ik, als een een fout word geconstateerd de variable $continue op FALSE staan, dat werkt opzich wel, maar als hij bijvoorbeeld een verkeerde extensie vind, gaat hij hem daarna ook nog checken op size , en dit moet hij dan overslaan en gewoon naar het volgende item in de array gaan.

Ik heb het geprobeerd met break; , maar zodra hij dan een fout vind voert hij het hele script niet meer uit.

Iemand een idee hoe ik dit aan moet pakken? Alvast bedankt!
 
PHP hulp

PHP hulp

25/04/2024 17:43:03
 
Noppes Homeland

Noppes Homeland

03/05/2012 19:08:49
Quote Anchor link
Kijk eens naar andere upload scripts, dan moet er toch echt een lampje bij je gaan branden.

Een stukje basiskennis kan je hier op doen:
http://www.pfz.nl/wiki/uploaden/

En het zal al helemaal geen kwaad kunnen als je wat php beginners / basis tutorials doorneemt.
 
Patrick vd Pols

Patrick vd Pols

03/05/2012 19:10:05
Quote Anchor link
Als er een lampje had gaan branden en ik al niet uren had zitten stoeien had ik het het hier ook niet gepost..
 
Obelix Idefix

Obelix Idefix

03/05/2012 19:13:24
Quote Anchor link
Bouw je controle anders op.
Je hebt nu elke keer een afzonderlijke if/else.
Kun je toch ook genest doen?
Of controleer of $continu op FALSE staat --> dan hoeft die de if-lus niet in.
 
Patrick vd Pols

Patrick vd Pols

03/05/2012 19:15:41
Quote Anchor link
Je bedoelt zoiets als

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
  if (!empty($_FILES['images']['name'][$key]) && $continue != 'FALSE')
?

Dat ga ik zo gelijk even proberen!
 
Obelix Idefix

Obelix Idefix

03/05/2012 19:22:24
Quote Anchor link
Bijvoorbeeld.
Of
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(voorwaarde)
{
    // voorwaarde voldaan
    if(voorwaarde2)
    {
        // aan voorwaarde 2 voldaan
    }
    else
    {
        // niet aan voorwaarde 2 voldaan
    }
}
else
{
    //    niet aan voorwaarde 1 voldaan
}

en zo kun je eventueel nog wat verder 'nesten'.
 
Patrick vd Pols

Patrick vd Pols

03/05/2012 19:23:06
Quote Anchor link
Oke bedankt! Ik ga weer ff stoeien!
 
Pg Vincent

Pg Vincent

03/05/2012 19:28:13
Quote Anchor link
"Nu check ik alles eerst client side met javascript(het form kan ook niet gesubmit worden zonder javascript) en daarna nog een keer server side met PHP."

Javascript controles zijn handig, maar je kunt met javascript helemaal niets afdwingen. Het is een kleine moeite om het javascript aan te passen en zo alles te laten doen wat een hacker wil.

Verder; je bouwt nu een soort state-machine door in $continue aan te geven wat de status is, maar daarmee maak je het jezelf eigenlijk alleen maar lastig.

Gebruik de eerdergenoemde IF/ELSE structuur en zorg dan dat je bij elke controle eerst het stukje "wat als het niet werkt" afhandelt en daarna wat er gedaan moet worden als de controle lukt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if (bestand niet geupload)
{

  // handel fout af
}
else
{
  // bestand is geupload, doe volgende controle
  if (bestand is niet geldig)
  {

    // handel fout bestand af
  }
  else
  {
    // bestand geupload en geldig, ga verder met de volgende actie
  }
}

?>


Dat houdt de situatie overzichtelijk en je krijgt onderaan niet een hele rits onsamenhangende foutafhandelingen.
Gewijzigd op 03/05/2012 19:28:38 door Pg Vincent
 
Pim -

Pim -

03/05/2012 19:31:34
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
while(list($key,$value) = each($_FILES['images']['name']))
?>

Is hondslelijk...
Gebruik:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
foreach($_FILES['images']['name'] as $key => $value)
?>
 
Patrick vd Pols

Patrick vd Pols

03/05/2012 19:32:53
Quote Anchor link
Bedankt voor de tip Vincent! Duidelijk!

Pim wat is er beter aan foreach ten opzichte van while? Het doet hetzelfde toch?
 
Pim -

Pim -

03/05/2012 19:33:16
Quote Anchor link
Oh en BTW, voor je probleem bestaat een hele makkelijk oplossing:
continue;

Dit keyword lijkt op break, maar gaat verder met het volgende item van de loop, ipv dat het loopen stopt.

Toevoeging op 03/05/2012 19:35:54:

Foreach is beter, omdat het exact hiervoor gemaakt is. Het is onzinnig om dat zo lelijk na te bootsen met while.

Ook is het waarschijnlijk sneller, omdat er meer in de C laag gebeurt, wat meestal/altijd sneller is, al is dat niet echt significant.
 
Patrick vd Pols

Patrick vd Pols

03/05/2012 20:08:01
Quote Anchor link
Hey pim bedankt voor je reactie. Het is inderdaad opgelost met continue; , maar ik ga het toch maar even proberen de methode die vincent voorstelde.

Thanks all!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.