Avatar billede tlunde Nybegynder
19. november 2008 - 08:01 Der er 28 kommentarer

Læse foldere og deres indhold?

Hej,
Jeg er igang med at lave et billedgalleri, hvor jeg selvuploader billederne til ftpp i foldere med indhold. I den forbindelse skal jeg så have lavet noget listning af folderne og deres indhold.

Så det jeg gerne vil, er at kunne fremvise en liste over folderne som er uploadet, hvor mange billeder der er i folderen og så datoen på folderen.

Hvordan gør jeg det nemmest?
Avatar billede jakobdo Ekspert
19. november 2008 - 08:09 #1
Du bør starte med at lære funktionen glob() at kende.

http://dk.php.net/glob

Den kan både liste filer (billeder) og mapper.

Biller noget ala:

foreach (glob("{*.jpg,*.JPG}",GLOB_BRACE ) as $filename) {
      echo "$filename \n";
}

Mapper ala:

foreach (glob("*", GLOB_ONLYDIR) as $folder){
      echo "$folder \n";
}
Avatar billede tlunde Nybegynder
19. november 2008 - 08:23 #2
Jeg har en test.php side hvor jeg tester dette nye kode, men skal jeg ikke på en eller anden måde definere stien til hvor mine foldere ligger?
Avatar billede tlunde Nybegynder
19. november 2008 - 08:29 #3
og er denne glob() funktion bedre end bare at bruge readdir(), opendir() og closedir()??
Avatar billede jakobdo Ekspert
19. november 2008 - 09:16 #4
glob er ihf. nemmere.
Og sti kan angives som:

foreach (glob("/path/*", GLOB_ONLYDIR) as $folder){
      echo "$folder \n";
}
Avatar billede tlunde Nybegynder
19. november 2008 - 09:37 #5
Min testside ligger her:
http://marieogthomas.dk/test.php

Og ved at smide dette kode ind:
$image_dir = "upload/gallery/";

foreach (glob($image_dir, GLOB_ONLYDIR) as $folder){
      echo "$folder \n";
}

får jeg bare outputtet:
upload/gallery/

Og der ligger 3 foldere i mappen "gallery" som jeg gerne skulle have vist data på :-)
Avatar billede erikjacobsen Ekspert
19. november 2008 - 10:23 #6
Er det ikke: $image_dir = "upload/gallery/*";
Avatar billede tlunde Nybegynder
19. november 2008 - 10:26 #7
Nu får jeg rigtigt nok dette ud:
upload/gallery/20070425_opelvectra
upload/gallery/20080809_tobias
upload/gallery/20080831_zoo

ved at rette $image_dir til "upload/gallery/*";

Men hvordan går jeg "upload/gallery/" væk, så jeg kun har folderens navn?
Avatar billede tlunde Nybegynder
19. november 2008 - 10:27 #8
Og kan jeg hive mere data ud af funktionen end bare folderens navn? Eks datoen?
Avatar billede tlunde Nybegynder
19. november 2008 - 10:29 #9
Har rettet koden til dette nu:
foreach (glob($image_dir, GLOB_ONLYDIR) as $folder){
    $folder = explode("/", $folder);
    echo "<a href='".$_SERVER['PHP_SELF']."?action=createalbum&albumname=$folder[2]'>$folder[2]</a><br>";
}

er der noget forkert i at gøre det på denne måde?
Avatar billede erikjacobsen Ekspert
19. november 2008 - 10:33 #10
Det ser ok ud. Jeg ville nok vælge et andet variabelnavn til resultatet fra explode.
Avatar billede tlunde Nybegynder
19. november 2008 - 10:37 #11
Gør det da noget, at det også hedder $folder?
Og kunne jeg hive andet data ud fra mine foldere ved brug af glob()?
Avatar billede olebole Juniormester
19. november 2008 - 10:47 #12
<ole>

I princippet kan du med lige præcis denne kode godt bruge $folder begge steder, men du skal ikke rette særlig meget i den, før scriptet 'vælter'. Ved at bruge samme variabelnavn til de to vidt forskellige ting, sætter du vand over til øretæver.

Prøv altid at forebygge fejl og misforståelser i forbindelse med evt. senere ændringer/udbygninger. Det er to forskellige ting, du hælder ned i din variabel med samme navn. Det ville derfor være mere hensigtsmæssigt at vælge to forskellige navne  ;o)

/mvh
</bole>
Avatar billede erikjacobsen Ekspert
19. november 2008 - 10:50 #13
glob() giver dig filnavne og foldernavne. Ikke andet. Hvad skal du bruge?

Ole: også et lille kryds i dag, hva'?
Avatar billede tlunde Nybegynder
19. november 2008 - 11:24 #14
Okay, nu et andet problem...
Har redigeret lidt i koden, for at sætte et stykke sql ind, inden den printer folderne ud:

foreach (glob($image_dir, GLOB_ONLYDIR) as $folder){
    // ..og exploder på / for at finde foldernavn
    $folder_complete = explode("/", $folder);
   
    $sql = "SELECT COUNT(*) FROM gallery WHERE folder = '".$folder_complete[2]."'";
    $query = mysql_db_query($dbName, $sql);

    if (mysql_num_rows($query) == 0) {
        // ..for dernæst at lave datoen om til normal dato
        $date = date("d.m.Y", mktime(0, 0, 0, substr($folder_complete[2], 4, 2), substr($folder_complete[2], 6, 2), substr($folder_complete[2], 0, 4)));
        // ..og printer linket ud til sidst
        echo $date." - <a href='".$_SERVER['PHP_SELF']."?action=createalbum&albumname=$folder_complete[2]'>".substr($folder_complete[2], 9)."</a><br>";   
    }
}

Ideen i det hele er, at når jeg klikker på et album, som bliver printet ud, så opretter jeg det album i databasen med diverse indhold.

Og når albummet er oprettet i databasen, så skal det selvfølgelig ikke vises i listen mere, og det var hvad jeg prøvede at lave med det sql kald inden den printer folderne ud. Men der ud til at mysql_num_rows($query) hele tiden er 1, selvom jeg kun har oprettet det første album i databasen "Opel Vectra".

Hvordan kan det være?
Avatar billede erikjacobsen Ekspert
19. november 2008 - 11:38 #15
SELECT COUNT(*) FROM ... giver altid een række med tallet i et felt. Du skal hente tallet ud som du plejer ... fx mysql_fetch_array eller mysql_result
Avatar billede tlunde Nybegynder
19. november 2008 - 11:53 #16
erikjacobsen:
Hmm...kan ikke lige se hvordan jeg skal omskrive min sql med det du nævner?
Avatar billede jakobdo Ekspert
19. november 2008 - 12:09 #17
F.eks. sådan:
$sql = "SELECT noget FROM gallery WHERE folder = '".$folder_complete[2]."'";
$query = mysql_db_query($dbName, $sql);
$antal = mysql_num_rows($query);
Avatar billede tlunde Nybegynder
19. november 2008 - 12:16 #18
jakobdo:
jamen, er det ikke det samme som jeg har allerede?
Hvor jeg får resultat 1 på alle 3 foldere, selvom det kun er den første folder der er oprettet i databasen?
Avatar billede tlunde Nybegynder
19. november 2008 - 12:18 #19
Ahh...min fejl :-)

Jeg har rettet det til, så det nu er sådan her:
$sql = "SELECT folder FROM gallery WHERE folder = '".$folder_complete[2]."'";
    $query = mysql_db_query($dbName, $sql);

    if (mysql_num_rows($query) == 0) {
        // ..for dernæst at lave datoen om til normal dato
        $date = date("d.m.Y", mktime(0, 0, 0, substr($folder_complete[2], 4, 2), substr($folder_complete[2], 6, 2), substr($folder_complete[2], 0, 4)));
        // ..og printer folderen ud til sidst
        echo $date." - <a href='".$_SERVER['PHP_SELF']."?action=createalbum&albumname=$folder_complete[2]'>".substr($folder_complete[2], 9)."</a><br>";   
    }

Og det virker :-)
Avatar billede erikjacobsen Ekspert
19. november 2008 - 12:21 #20
Hvis du kun skal bruge antal rækker, så er det dumt ikke at bruge COUNT(*)
Avatar billede jakobdo Ekspert
19. november 2008 - 12:30 #21
Og endnu bedre:
COUNT(folder) eller id eller noget.
Avatar billede erikjacobsen Ekspert
19. november 2008 - 12:49 #22
COUNT(*) er lidt hurtigere, generelt, fordi COUNT(folder) kun tæller felter der ikke er NULL - hvilket så skal checkes, derfor lidt dyrere. Måske optimeres checket væk for felter, der ikke kan være NULL - det ved jeg så ikke.
Avatar billede tlunde Nybegynder
19. november 2008 - 12:54 #23
Nu er jeg kommet så langt i det hele, at jeg skal have hevet første billede ud af de mapper der bliver gennemgået ved dette:
foreach (glob($image_dir, GLOB_ONLYDIR) as $folder){

}

Denne printer bare mappernes navn ud, men kan jeg i samme ombæring - på en eller anden måde - få fat i første billede i den mappe den printer ud?
Avatar billede erikjacobsen Ekspert
19. november 2008 - 13:05 #24
Hvordan definere du "første billede"? Men ja, du kan lave en "glob" mere inde i løkken med dit $folder-navn, og så en "/*" bagefter. Og så tage hvad du nu synes er det første filnavn...
Avatar billede tlunde Nybegynder
19. november 2008 - 13:11 #25
Hmm...tror jeg ikke lige jeg forstår, hvordan jeg skal gøre :-)
Jeg printer jo mapperne ud, og ved hver mappe vil jeg gerne have vist det første billede som thumb til hvert galleri...

Se evt: http://marieogthomas.dk/test.php hvor jeg er kommet til nu, så du måske forstår :-)
Avatar billede erikjacobsen Ekspert
19. november 2008 - 15:10 #26
Du kan jo fx lave en

foreach (glob("$folder/*") as $file){
...
}

Og så tage det første billede den finder.
Avatar billede tlunde Nybegynder
02. januar 2009 - 19:13 #27
Tak for hjælpen, smid nogle svar :-)
Avatar billede jakobdo Ekspert
03. januar 2009 - 21:58 #28
Svar!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester