Avatar billede Hans Frederik Novice
24. september 2010 - 10:48 Der er 4 kommentarer og
2 løsninger

Automatisk sortering af billed-filer driller.

Jeg har en PHP-fil, som genererer thumbs, der åbner de billeder som de genererer thumbs fra i en ny side (se her: http://hansfrederik.dk/index.php?page=billeder&sub=ruspics)

Problemet er, som man kan se hvis man besøger ovenstående side, at man ikke kommer frem til billedet, der svarer til den thumb som man egentlig trykker på, men derimod til et tilsyneladende tilfældigt billede fra samme mappe. Jeg håber nogen kan hjælpe mig med at finde ud af hvorfor?

Siden det er tungt arbejde at side og kigge gennem kode, giver jeg 200 point for en løsning.

Koden i (page=)billeder.php ser således ud:

<?
if($_GET[billeder]){
    if(isset($_GET[n])){
        echo printpic($_GET[folder],$_GET[n]);
    }
}

else{
    include "$_GET[sub].php";
    $sti = "$_GET[sub]/".$_GET[sti];
    echo printdir($sti);
}

//Her opsættes links og thumbs.
function printdir($folder){
    $path = realpath("./");
    $sti = $path."/".$folder;
    if($bib = opendir($sti)){
        $n = 0;
        while (false !== ($fil = readdir($bib))){
            if($fil !== "." && $fil !== ".." && !ereg("^\..+", $fil)){
                $fil_liste[] = "$fil";
            }
        }
        closedir($bib);
        if(is_array($fil_liste)){
            usort($fil_liste, "strnatcmp");
        }
        $nn = 0;
        for ($n = 0; $n<count($fil_liste); $n++){
            $page = $_GET[page];
            if($nn==0){
                $nn++;
            }
            //Her opsættes linkene til mapperne med billider.
            if(is_dir($sti."/".$fil_liste[$n]) and $nn < 5){
                $liste[] = "<tr class=listebaggrund><th class=asien><p><a class=fedlinksort href='$_SERVER[PHP_SELF]?page=$page&amp;sub=$_GET[sub]&amp;sti=$fil_liste[$n]'>$fil_liste[$n]</a></p></th></tr>";
            }
            elseif(is_dir($sti."/".$fil_liste[$n])){
                $liste[] = "<tr class=listebaggrund><th class=asien><p><a class=fedlinksort href='$_SERVER[PHP_SELF]?page=$page&amp;sub=$_GET[sub]&amp;sti=$fil_liste[$n]'>$fil_liste[$n]</a></p></th>";
            }
            //Her opsættes thumb-siden.
            elseif($nn == 1){
                $liste[] = "<tr><td class=asienthumb><p class=asienp>
                <a href='$_SERVER[PHP_SELF]?folder=$folder&amp;page=$page&amp;n=$n&amp;billeder=1'>
                <img src='thumb.php?pic=$folder/$fil_liste[$n]' alt='Se billede' class=noborder></a></p></td>\n";
                }
            else{
                $liste[] = "<td class=asienthumb><p class=asienp>
                <a href='$_SERVER[PHP_SELF]?folder=$folder&amp;page=$page&amp;n=$n&amp;billeder=1'>
                <img src='thumb.php?pic=$folder/$fil_liste[$n]' alt='Se billede' class=noborder></a></p></td>\n";
            }
            if($nn == 5){
                $liste[] = "</tr>\n";
                $nn = 0;
            }
            $nn++;
        }
        $filliste = "<h4>Indhold af $folder:</h4>";
        $filliste = $filliste ."<table>\n".join("", $liste)."</table>\n";
        return $filliste;
    }
    else {
        die("Noget gik galt :(  Skriv til webmaster! (Kode1)".$bib);
    }
}
//Her opsættes visningen af det store billede.
function printpic($folder,$n){
    $path = realpath("./");
    $sti = $path."/".$folder;
    if($bib = opendir($sti)){
        while (false !== ($fil = readdir($bib))){
            if($fil !== "." && $fil !== ".." && !ereg("^\..+", $fil)){
                if(is_dir($sti."/".$fil)){
                    $fil_liste[] = "<a href='$_SERVER[PHP_SELF]?sti=$fil&amp;billeder=1'>$fil</a>";
                }
                else{
                    $fil_liste[] = "$fil";
                }
            }
        }
        closedir($bib);
        if(is_array($fil_liste)){
            natcasesort($fil_liste);
        }
        for ($num = ($n-2); $num <= ($n+2); $num++){
            if($num >= 0 && $num < count($fil_liste)){
                $liste[] = "<td class=center><p class=asienp>
                <a href='$_SERVER[PHP_SELF]?folder=$folder&amp;page=billeder&amp;n=$num&amp;billeder=1'>
                <img src='thumb.php?pic=$folder/$fil_liste[$num]' alt='Se billede' class=noborder></a></p><p class=asienp>
                <a href='$_SERVER[PHP_SELF]?folder=$folder&amp;n=$num&amp;billeder=1'>$fil_liste[$num]</a></p></td>\n";
            }
            else{
                $liste[] ="<td></td>";
            }
        }
        $numm = $n-1;
        $nump = $n+1;
        echo "<table class=asientable><tr>";
        if($numm >= 0){
            echo "<td>
            <a href='$_SERVER[PHP_SELF]?folder=$folder&amp;page=billeder&amp;n=$numm&amp;billeder=1'>
            <img src='faelles/pics/pilv.png' alt='Forrige billede' class=noborder></a>
            </td>";
        }
        echo "<td><p class=ingenmargin><img src='pic.php?pic=$folder/$fil_liste[$n]' alt='' class=noborder></p></td><td>";
        if($nump<count($fil_liste)){
            echo "<a href='$_SERVER[PHP_SELF]?folder=$folder&amp;page=billeder&amp;n=$nump&amp;billeder=1'>
            <img src='faelles/pics/pilh.png' alt='Næste billede' class=noborder></a></td>";
        }
        echo "</tr></table>\n";
        $filliste = $filliste ."<table class=asientable><tr>".join("", $liste)."</tr></table>\n";
        $mappe = explode("/",$folder);
        $rod = basename($_SERVER[PHP_SELF]);
        $filliste = $filliste ."<p><a href='$rod'>billeder</a> ~ <a href='$_SERVER[PHP_SELF]?sti=$mappe[1]'>$mappe[1]</a></p>";
        return $filliste;
    }
    else {
        die("Noget gik galt :(  Skriv til webmaster! (Kode2)".$bib);
    }
}
?>


Skriv, hvis der er ekstra oplysninger du har brug for.
På forhånd mange tak!
Avatar billede tjens Nybegynder
24. september 2010 - 14:51 #1
Kan det være fordi readdir ikke nødvendigvis giver samme rækkefølge hver gang, og du kun gemmer billednummer n i links?

Prøv at sortere array efter readdir (alle steder).



Dit site er hackervenligt:  include "$_GET[sub].php";
Hvis din side kaldes med noget ala &sub=http://HaxorHQ.kk/fileeditor vil du include fremmed phpkode som eksekveres på din server, og dermed give fremmede kontrollen med alle filer på din server.

Skift til noget ala:

    $sub = "";
    if ($_GET[sub] == "ruspics") $sub =  "ruspics.php";
    include $sub;

og valider generelt alle GET/POST variable inden de bruges
Avatar billede tjens Nybegynder
24. september 2010 - 18:30 #2
Jeg kan se at du allerede har en natcasesort(), men den virker nok ikke helt som forventet.
Prøv at se indexerne i eksemplet: http://php.net/manual/en/function.natcasesort.php
Jeg synes, de er "uldne". Nogen der kan forklare dem?
Avatar billede Hans Frederik Novice
25. september 2010 - 15:09 #3
Tak for tippet om hackertingen.. men først og fremmest bliver jeg nødt til at få den sortering til at virke!

Jeg tror jeg kender problemet nu, men jeg kender endnu ikke løsningen. Håber du kan hjælpe!:

På linje 30 i koden står der: "$page = $_GET[page];".
Det står der, fordi jeg bruger "billeder.php" (som filen hedder) til flere forskellige billedgallerier. Det var filen oprindeligt ikke lavet til. Oprindeligt købte jeg den af en programør, og han lavede den, så den virkede, også med sortering, men derefter har jeg ændret den til ukendelighed, og jeg husker nu, at det faktisk var da jeg genereliserede den med "$page = $_GET[page];" at sorteringen stoppede med at virke.

Der er jo nemlig en situation hvor den virker, når man allerede har valgt et billede, og så trykker på de thumbnails der kommer nedenunder det valgte billede, kommer det rigtige billede frem, ligesom her:
http://hansfrederik.dk/index.php?folder=Billeder%20fra%20Asien/03%20-%20KOH%20TAO&page=billeder&n=10&billeder=1

Det vil sige at når man ikke skifter side (fra thumbnailsiden til siden med det store billede) bliver arryet "$fil_liste" bibeholdt, men når man skifter side, gør det ikke pga. at "$page = $_GET[page];" henter siden på ny.

Jeg kender ikke meget til PHP, så jeg ved ikke om det jeg har skrevet ovenfor er totalt falskt, men for mig virker det til at være problemet.

Kan du give løsningsforslag til det?
Avatar billede Hans Frederik Novice
25. september 2010 - 16:05 #4
OK, jeg fandt løsningen. Problemet var at jeg havde to forskellige sorteringer, den ene under
"//Her opsættes links og thumbs." nemlig:
"usort($fil_liste, "strnatcmp");"

og den anden under
"//Her opsættes visningen af det store billede." nemlig, som du sagde:
"natcasesort($fil_liste);"

Jeg ændrede simpelthen "natcasesort($fil_liste);" til "usort($fil_liste, "strnatcmp");".

>>tjens: Hvis du vil have 100 point for din hjælp, så læg også et svar.
Avatar billede tjens Nybegynder
25. september 2010 - 20:06 #5
OK, godt du fandt fejlen.
Jeg synes også, at natcasesort ikke kunne bruges på denne måde, ifølge manualen.
Avatar billede Hans Frederik Novice
25. september 2010 - 22:59 #6
@tjens: Måske kan du hjælpe med dette problem, nu kender du jo lidt til siden: http://www.eksperten.dk/spm/919718
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

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