/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Warning ved brug af foreach (glob)
Fra : Stig Sørensen


Dato : 18-10-08 08:29

Hej gruppe..

Jeg har en folder /cache hvor der skal tjekkes efter filer, der alle
starter med et unix timestamp.
Hvis filen er ældre end 1 minut skal det slettes:


foreach (glob("cache/*") as $filename) {
   $filename2 = substr("$filename", 6, 10);
   if ($filename2 < time()-60) {
      unlink($filename);
   }
}

Og det virker fint efter hensigten. Men når der ingen filer er i /
cache folderen så gives der en Warning output til browseren:

Warning: Invalid argument supplied for foreach() in index.php on line
2

Linie 2 er: foreach (glob("cache/*") as $filename) {

Jeg har prøvet at lave en $filename = ""; inden foreachen fordi jeg
troede den brokkede sig over det tomme variable, men det ændre ikke
noget.


Mvh
Stig

 
 
Bertel Lund Hansen (18-10-2008)
Kommentar
Fra : Bertel Lund Hansen


Dato : 18-10-08 15:49

Stig Sørensen skrev:

> foreach (glob("cache/*") as $filename) {
>    $filename2 = substr("$filename", 6, 10);
>    if ($filename2 < time()-60) {
>       unlink($filename);
>    }
> }

> Og det virker fint efter hensigten. Men når der ingen filer er i /
> cache folderen så gives der en Warning output til browseren:

Ja, man kan ikke foreache over et tomt array. Løsningen er at teste først:

$filsamling=glob("cache/*");
If (count($filsamling))
   foreach ($filsamling as $filename)
      if (substr("$filename",6,10) < time()-60) unlink($filename);

Det er med vilje jeg ikke har brugt {}, men det er en smagssag.

--
Bertel
http://bertel.lundhansen.dk/      FIDUSO: http://fiduso.dk/

Philip Nunnegaard (18-10-2008)
Kommentar
Fra : Philip Nunnegaard


Dato : 18-10-08 15:55

"Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev

> Det er med vilje jeg ikke har brugt {}, men det er en smagssag.

Jeg var slet ikke klar over at man kunne udelade tuborgklammerne.
Jeg ville tro at den så havde problem med at vide hvad der hørte ind under
if-sætningen, og hvad der ikke gjorde.


Bertel Lund Hansen (18-10-2008)
Kommentar
Fra : Bertel Lund Hansen


Dato : 18-10-08 17:50

Philip Nunnegaard skrev:

> Jeg var slet ikke klar over at man kunne udelade tuborgklammerne.

1 (1) ((1)) og (((1))) er det samme.

x=7; {x=7;} {{x=7;}} og {{{x=7;}}} er det samme.

Det betyder at hvis man kun har ét statement, så er klammer ikke
nødvendige.

> Jeg ville tro at den så havde problem med at vide hvad der hørte ind under
> if-sætningen, og hvad der ikke gjorde.

Slet ikke. Semikolon af slutter et statement.

   if (x==2) y=5;

Her går det galt for programmøren (ikke for PHP):

   if (x==2)
      y=6;
      z=13;

Første statement afsluttes ved første semikolen, og z=13 udføres
uanset hvad x er. Derfor er klammer nødvendige hvis der er mere
end et statement der er underlagt en betingelse eller en løkke:

   if (x==2) {
      y=6;
      z=13;
   }

Man kan altså godt konekvent anvende klammer hvis man synes det
er en fordel. Selv vil jeg have så meget info på skærmen ad
gangen som muligt, så jeg vil ikke spilde linjer på overflødige
klammer, og derfor bruger jeg også startklamme på samme linje -
altså:

   if (x==2) {

og ikke

   if (x==2)
   {

Jeg skriver også på én linje hvis det ikke bliver for langt

--
Bertel
http://bertel.lundhansen.dk/      FIDUSO: http://fiduso.dk/

Mads Lie Jensen (18-10-2008)
Kommentar
Fra : Mads Lie Jensen


Dato : 18-10-08 17:49

On Sat, 18 Oct 2008 16:49:08 +0200, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>> Og det virker fint efter hensigten. Men når der ingen filer er i /
>> cache folderen så gives der en Warning output til browseren:
>
>Ja, man kan ikke foreache over et tomt array. Løsningen er at teste først:

Min php (5.2.6) brokker sig nu ikke over en foreach på et tomt array.
Der sker selvfølgelig ikek noget, men der kommer ingen warnings.
Til gengæld får jeg en warning hvis jeg laver en foreach over f.eks en
streng eller en boolean.

>$filsamling=glob("cache/*");
>If (count($filsamling))

Den kan stadig fejle:
$id = "streng";
if (count($id)) {
   foreach($id as $val) {

..... vil give en fejl
Det vil være mere rigtigt at teste med
if (is_array($id))
   foreach($id as $val) {

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
Gartneriet - http://www.gartneriet.dk/

Stig Sørensen (18-10-2008)
Kommentar
Fra : Stig Sørensen


Dato : 18-10-08 10:02

On Oct 18, 4:49 pm, Bertel Lund Hansen <unosp...@lundhansen.dk> wrote:
> Stig Sørensen skrev:
>
> > foreach (glob("cache/*") as $filename) {
> >    $filename2 = substr("$filename", 6, 10);
> >    if ($filename2 < time()-60) {
> >            unlink($filename);
> >    }
> > }
> > Og det virker fint efter hensigten. Men når der ingen filer er i /
> > cache folderen så gives der en Warning output til browseren:
>
> Ja, man kan ikke foreache over et tomt array. Løsningen er at teste først:
>
> $filsamling=glob("cache/*");
> If (count($filsamling))
>         foreach ($filsamling as $filename)
>                 if (substr("$filename",6,10) < time()-60) unlink($filename);
>
> Det er med vilje jeg ikke har brugt {}, men det er en smagssag.


Det giver stadig samme warning:

$filsamling = glob("cache/*");
if (count($filsamling)) {
   foreach ($filsamling as $filename) {
      $filename2 = substr("$filename", 6, 10);
         if ($filename2 < time()-60) {
            unlink($filename);
         }
   }
}

Warning: Invalid argument supplied for foreach()

Forstår ikke hvorfor.

Stig Sørensen (18-10-2008)
Kommentar
Fra : Stig Sørensen


Dato : 18-10-08 10:08

Det hjalp ved at benytte !empty i stedet for et count.

Mange tak for hjælpen.

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste