[PHP] Directory 'doorlopen' en alle plaatjes weergeven.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • enveekaa
  • Registratie: September 2003
  • Laatst online: 06:09
Ik ben bezig met een functie die alle bestanden uit een gegeven directory leest.

Wat relevante informatie vooraf:
$art_code heeft waarde "53113" en 1 is even een vaste waarde.
Directory afb1/53113/ bevat 1 plaatje -> document.gif
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// code waarmee de functie wordt aangeroepen
$test = afbdyn("1",$art_code); 

// functie zelf
function afbdyn($pos,$art_code) {
    $path = "afb$pos/$art_code";
    echo $path;

    if (!file_exists($path)) {
        $afbdyn = "Geen afbeeldingen.";
        return $afbdyn;
    } else {
        $dir = opendir($path);
        while (readdir($dir) != false) {
            $file = readdir($dir);
            if ($file != "." && $file != ".." && $file != ".DS_Store") {
                $afbdyn = "$afbdyn[img]$path/$file[/img]";
            }
        }
        return $afbdyn;
    }
}

De output is [img]afb1/53113/[/img] dus er gaat iets mis :)

Misschien vraag je je af wat doet "if ($file != "." && $file != ".." && $file != ".DS_Store")" om je code? die filtert hidden files die MacOSX aanmaakt eruit. 8)

Iemand die ziet wat ik fout doe?

Groet!
Nick

[ Voor 11% gewijzigd door enveekaa op 22-11-2004 14:08 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Waarom noem je je functie afbdyn() :? Geef hem gewoon een duidelijke naam zodat iedereen (inclusief jij over een maand) direct kan zien wat de functie doet.

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
29
30
31
32
33
34
35
<?

function printAfbeeldingenUitDirectory($directory = ".", $inclusiefSubmappen = true)
{
    $dh = opendir($directory);
    
    while ( $file = readdir($dh) )
    {
        if ( $file == "." || $file == ".." || $file == ".DS_Store" )
        {
            continue;
        }
        
        $path = $directory . "/" . $file;
        
        if ( is_dir($path) )
        {
            if ( $inclusiefSubmappen )
            {
                printAfbeeldingenUitDirectory($path, true);
            }
        }
        else
        {
            if ( $size = @getimagesize($path) )
            {
                print '[img]"'[/img]';
            }
        }
    }
    
    closedir($dh);
}

?>

Heb het niet getest, maar je ziet wel in welke richting je moet denken.

Om even je vraag te beantwoorden:
PHP:
1
2
        while (readdir($dir) != false) {
            $file = readdir($dir);

Zoek eens in de php manual op wat readdir doet.

[ Voor 48% gewijzigd door Michali op 22-11-2004 14:28 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • enveekaa
  • Registratie: September 2003
  • Laatst online: 06:09
Hmm die code is inderdaad heel anders -- iets te uitgebreid, maar evengoed bedankt.

Je hebt redelijk wat PHP kennis... aangezien je zo even uit je losse mouw dit eruit gooit :) Wat doe ik nu fout in mijn code?

readdir lijkt me toch de juiste functie voor deze code?
readdir geeft de bestandsnaam van het volgende bestand in de directory. De bestandsnamen worden teruggegeven in de volgorde waarin ze zijn opgeslagen in het bestandssysteem -- oftewel, ideaal voor een loopje om een dir uit te lezen?\

Nogmaals bedankt voor 't meedenken :)

Over die functie naam "afbdyn", is een test naam.. en nog niet eens zo gek vin ik, Afbeelding Dynamisch .. had eerst allemaal vaste funties voor verschillende directory's -- iederen zen eigen manier he :)

[ Voor 18% gewijzigd door enveekaa op 22-11-2004 14:39 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Wat je fout doet is dat je eerst checkt of er nog een nieuwe file in de directory zit. Maar wat er gebeurt is dat op het zelfde moment de handle naar het volgende bestand gaat. Stel dat je dus 3 bestanden in een mapje hebt zitten. 1.jpg 2.jpg en 3.jpg. Bij de eerste loop check je in de while dus of 1.jpg niet gelijk is aan false. Dat is natuurlijk niet zo. Daarna verplaatst de handle (de file pointer zoals ze het noemen) zich naar het volgende bestand, 2.jpg. Deze vraag je op met $file = readdir($dir);. Je denkt dus dat je 1.jpg te pakken hebt, maar je werkt werkelijk met 2.jpg. Ik verwacht dus in jouw geval dat je aan het testen bent met 1 afbeelding of niet ;).

Deze constructie is beter: while ( $file = readdir($dir) ) omdat je zo in de loop zelf file een nieuwe waarde geeft en direct controleert op zijn waarde. Alles behalve false, 0 en "" is geloof ik true. Aangezien readdir altijd een niet lege string terug geeft (een bestand moet een naam hebben namelijk) kun deze constructie veilig gebruiken.
enveekaa schreef op maandag 22 november 2004 @ 14:34:
Over die functie naam "afbdyn", is een test naam.. en nog niet eens zo gek vin ik, Afbeelding Dynamisch .. had eerst allemaal vaste funties voor verschillende directory's -- iederen zen eigen manier he :)
Ieder zijn eigen stijl ja, maar je moet toegeven dat de naam afbeeldingDynamisch() een stuk beter is afbdyn(). Ik had het niet kunnen raden namelijk en dat is wel een teken dat het geen goede naam is. Zeker als je wat meer code hebt geschreven weet je na een tijdje niet goed meer waar een bepaalde functie nou voor diende, hoe goed je geheugen ook is. Dan is het erg belangerijk dat je de functie een goede naam hebt gegeven zodat je het daar snel uit af kan leiden. Zelf uitleggende code noemen ze dat.
Hmm die code is inderdaad heel anders -- iets te uitgebreid, maar evengoed bedankt.
Te uitgebreid? Uit je titel kan ik afleiden dat dit precies is wat je zoekt of heb ik het mis?

[ Voor 38% gewijzigd door Michali op 22-11-2004 14:47 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • enveekaa
  • Registratie: September 2003
  • Laatst online: 06:09
Ieder zijn eigen stijl ja, maar je moet toegeven dat de naam afbeeldingDynamisch() een stuk beter is afbdyn(). Ik had het niet kunnen raden namelijk en dat is wel een teken dat het geen goede naam is. Zeker als je wat meer code hebt geschreven weet je na een tijdje niet goed meer waar een bepaalde functie nou voor diende, hoe goed je geheugen ook is. Dan is het erg belangerijk dat je de functie een goede naam hebt gegeven zodat je het daar snel uit af kan leiden. Zelf uitleggende code noemen ze dat.
Inderdaad handig :) zal het aanhouden.. tis nu nog redelijk kleinschalig maar kan me voorstellen dat het naar mate het script groter wordt dus behoorlijk onoverzichtelijk kan worden.
Te uitgebreid? Uit je titel kan ik afleiden dat dit precies is wat je zoekt of heb ik het mis?
Hmm ja is wel zo, alleen ik is nooit sprake van subdirectory's en als ik heel eerlijk ben volg ik jou script niet helemaal ... ligt aan mij ja :)
Ik ga even verder prutsen :) zodra het werkt post ik me resultaten k? :)

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Maar snap je nu wat je fout deed? En vraag anders gewoon wat je niet snapt in mijn script. Dan kan ik het gewoon goed uitleggen als je wilt.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • enveekaa
  • Registratie: September 2003
  • Laatst online: 06:09
Michali schreef op maandag 22 november 2004 @ 15:06:
Maar snap je nu wat je fout deed? En vraag anders gewoon wat je niet snapt in mijn script. Dan kan ik het gewoon goed uitleggen als je wilt.
Ja dat is duidelijk, de volgorde van de hele procedure klopte gewoon van geen kant!
Heel eigenwijs hoor ;) maar k ben nog even verder gaan klooien en heb het nu werkend.. met de volgende code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?

function PlaatjesUitDirectory($positie,$artikel) {
    $path = "afb".$positie."/".$artikel."/";
  if (!is_dir($path)) {
    $output = "Opgegeven direcotory bestaat niet! ".$path;
    return $output;
  } else {
    $dir = opendir($path);
    while ($file = readdir($dir)) {
        if ($file != "." && $file != ".." && $file != ".DS_Store") {
            $output = $output."[img]\"".$path.$file."\"[/img]";
        }
    }
    return $output;
  }
}

?>


Geloof dat dit toch wel redelijk klopt? wat is jou mening?

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Je zit al goed in de richting alleen heb ik nog een paar verbeteringen (ik kan het niet laten :P)

-!is_dir($path) heb ik !file_exists($path) van gemaakt. de naam van deze functie geeft beter aan wat je bedoeling met het statement was.

-!file_exists($path) heb ik weer file_exists($path) van gemaakt en if en else heb ik omgedraait. Scheelt weer een keer een boolean omdraaien, beetje performance winst ;)

-$output = $output."... heb ik $output .= "... van gemaakt. Daar is de operator voor namelijk :)

-van "<img src=\"" heb ik '<img src="' gemaakt. Dan hoef je de quotes niet steeds te escapen. Leest makkelijker, zorgt dat je bestand kleiner is en dat je het makkelijker kan aanpassen.

-ik heb @getimagesize toegevoegd. getimagesize vraagt de informatie van een afbeelding op. Als dit bestand geen afbeelding is wordt er een warning gegeneerd en returned hij false. Die warning onderdruk ik met een @ en hij komt dus verder niet langs het if statement als het geen geldige afbeelding is

-$output = ""; return $output heb ik vervangen voor return ""; Scheelt weer een temp die je zowiezo zo veel mogelijk moet mijden.

-ik heb een $output = ""; voor de loop gezet. Als er geen afbeeldingen in $ouput worden gezet kan hij namelijk nog steeds wat returnen. Anders krijg je de melding dat de variabel niet bestaat en heb je ook nog kans dat er iets fout gaat in het script waar je de functie aanroept.

-van PlaatjesUitDirectory heb ik plaatjesUitDirectory gemaakt. Dit is een standaard naamgeving conventie. De naam van een class begint met een hoofdletter en van een functie en variabel met een kleine.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?

function plaatjesUitDirectory($positie,$artikel) {
  $path = "afb".$positie."/".$artikel."/";
  if (file_exists($path)) {
      $dir = opendir($path);
      $output = "";
      while ($file = readdir($dir)) {
          if ($file != "." && $file != ".." && $file != ".DS_Store" && @getimagesize($path.$file)) {
              $output .= '[img]"'.$path.$file.'"[/img]';
          }
      }
      return $output;
  } else {
      return "Opgegeven direcotory bestaat niet! ".$path;
  }
}

?>

[ Voor 19% gewijzigd door Michali op 22-11-2004 16:02 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • enveekaa
  • Registratie: September 2003
  • Laatst online: 06:09
Hmm ok :)

Ga nog even wat kleine aanpassingen doen.. bedankt voor je tips!!

Nick

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Als je hidden files wilt filteren, filter dan alles wat met een "." begint. Dat is een stuk zinniger. ;)

PHP:
1
if ($file[0] != ".")

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Ik zou eerder filteren op .jpg-bestanden, maar dat ben ik. ALleen de plaatjes laten zien dus...

Daarnaast ben ik het niet eens met 1 van de tips: je moet ALTIJD " gebruiken in HTML-tags. Kijk maar eens in de specs in www.w3.org, of valideer je code op validator.w3.org. Dat voorkomt misschien problemen met een of andere antieke browser.

En hoezo is de voorbeeldcode van michali te uitgebreid? Die 3 extra regels voor een subdir is toch mooi meegenomen? 'k denk ook dat hij het niet uit zijn mouw, maar uit een bestaand .php bestandje schud :) Dat was ik namelijk ook al van plan :)

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

MBV schreef op maandag 22 november 2004 @ 16:17:
Daarnaast ben ik het niet eens met 1 van de tips: je moet ALTIJD " gebruiken in HTML-tags. Kijk maar eens in de specs in www.w3.org, of valideer je code op validator.w3.org. Dat voorkomt misschien problemen met een of andere antieke browser.
Of '.

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
MBV schreef op maandag 22 november 2004 @ 16:17:
Daarnaast ben ik het niet eens met 1 van de tips: je moet ALTIJD " gebruiken in HTML-tags. Kijk maar eens in de specs in www.w3.org, of valideer je code op validator.w3.org. Dat voorkomt misschien problemen met een of andere antieke browser.
Als je het over een van mijn tips hebt zou ik hem nog eens lezen. Ik heb nooit gezegd dat hij ' moet gebruiken ipv ". Verder is je stelling niet waar. Je geeft een verwijzing naar w3c maar je hebt hem zelf niet eens gelezen blijkbaar:
By default, SGML requires that all attribute values be delimited using either double quotation marks (ASCII decimal 34) or single quotation marks (ASCII decimal 39). Single quote marks can be included within the attribute value when the value is delimited by double quote marks, and vice versa. Authors may also use numeric character references to represent double quotes (") and single quotes ('). For double quotes authors can also use the character entity reference ".

In certain cases, authors may specify the value of an attribute without any quotation marks. The attribute value may only contain letters (a-z and A-Z), digits (0-9), hyphens (ASCII decimal 45), periods (ASCII decimal 46), underscores (ASCII decimal 95), and colons (ASCII decimal 58). We recommend using quotation marks even when it is possible to eliminate them.
http://www.w3.org/TR/1999...ntro/sgmltut.html#h-3.2.2

Dit is wat de HTML 4.01 specificatie zegt overigens. Als we gaan kijken wat de XML specificatie zegt:
AttValue ::= '"' ([^<&"] | Reference)* '"'
| "'" ([^<&'] | Reference)* "'"
http://www.w3.org/TR/2004/REC-xml-20040204/#NT-AttValue

Ook dat lijkt me duidelijk.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Jij je zin: http://www.w3.org/TR/html401/intro/sgmltut.html#h-3.2.2
Heb alleen wel meegekregen dat single-quotes lastig werkt met javascript, en heb hier ooit een waarschuwing "doe dat nooit" gezien. Dus vandaar dat ik ervan overtuigd was. Sorry TS, voor het onnodig vervuilen :)

edit:
wil je die regexp even vertalen naar nederlands? als blijkt dat het in XHTML niet mag, dan weet ik waar ik me vergist heb :)

[ Voor 23% gewijzigd door MBV op 22-11-2004 16:45 ]


Acties:
  • 0 Henk 'm!

  • enveekaa
  • Registratie: September 2003
  • Laatst online: 06:09
MBV schreef op maandag 22 november 2004 @ 16:17:
Ik zou eerder filteren op .jpg-bestanden, maar dat ben ik. [/sub]
Wie zegt dat er alleen JPEGs staan? ;) De eerde genoemde manier: @getimagesize lijkt me handiger.
Pagina: 1