Avatar billede Hans Frederik Novice
06. august 2010 - 04:48 Der er 11 kommentarer og
1 løsning

Problem med dynamisk 'include'

Venlige eksperter!

Jeg har følgende kode i min index.php fil til min hjemmeside:

    <div class="indhold">
    <?
        $page = $_GET['page'];
        if (!empty($page)) {
            $page .= '.php';
            include($page);
        }
        else {
            include('intro.php');
        }
    ?>
    </div>

Dermed kan jeg inkludere mange sider i samme design, hvilket jo er skønt, MEN, så havde jeg jo tænkt mig at vise nogle billeder på min side, og bruger følgende kode dertil:

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

else{
    $sti = "Billeder/".$_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++){
            if($nn==0){
                $nn++;
            }
            //Her opsættes linkene til mapperne med billider.
            if(is_dir($sti."/".$fil_liste[$n]) and $nn < 4){
                $liste[] = "<tr><th class=asien><p><a href='$_SERVER[PHP_SELF]?sti=$fil_liste[$n]'>$fil_liste[$n]</a></p></th></tr>";
            }
            elseif(is_dir($sti."/".$fil_liste[$n])){
                $liste[] = "<tr><th class=asien><p><a href='$_SERVER[PHP_SELF]?sti=$fil_liste[$n]'>$fil_liste[$n]</a></p></th></tr>";
            }
            //Her opsættes thumb-siden.
            elseif($nn == 1){
                $liste[] = "<tr><td class=asienthumb><p class=asienp>
                <a href='$_SERVER[PHP_SELF]?folder=$folder&amp;n=$n&amp;billeder=1'>
                <img src='thumb.php?pic=$folder/$fil_liste[$n]' alt='Se billede' class=noborder></a>
                <a href='$_SERVER[PHP_SELF]?folder=$folder&amp;n=$n&amp;billeder=1'>$fil_liste[$n]</a></p></td>\n";
                }
            else{
                $liste[] = "<td class=asienthumb><p class=asienp>
                <a href='$_SERVER[PHP_SELF]?folder=$folder&amp;n=$n&amp;billeder=1'>
                <img src='thumb.php?pic=$folder/$fil_liste[$n]' alt='Se billede' class=noborder></a>
                <a href='$_SERVER[PHP_SELF]?folder=$folder&amp;n=$n&amp;billeder=1'>$fil_liste[$n]</a></p></td>\n";
            }
            if($nn == 4){
                $liste[] = "</tr>\n";
                $nn = 0;
            }
            $nn++;
        }
        $filliste = "<h4>Indhold af $folder:</h4>";
        $filliste = $filliste ."<table class=listefarve>\n".join("", $liste)."</table>\n";
        return $filliste;
    }
    else {
        die("Noget gik galt :(  Skriv til webmaster!".$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;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;n=$numm&amp;billeder=1'>
            <img src='billedsys/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;n=$nump&amp;billeder=1'>
            <img src='billedsys/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!".$bib);
    }
}
?>

Det virker jo også fantastisk alene, bare ikke sammen med den ovenstående dynamiske include kode. Hvorfor ikke? Fordi koden til visning af billederne indeholder følgende:

$_SERVER[PHP_SELF]?sti=$fil_liste[$n]

som resulterer i et kald til den dynamiske include, der, eftersom at den ikke finder en fil, fordi $fil_liste[$n] refererer til et sæt af mapper, returnerer intro.php.

Jeg har slet ingen anelse om hvordan det kan løses!
Skal billedkoden omskrives?
Er der en anden måde at hente de forskellige sider til min index.php?
Er der en tredie mulighed som jeg har overset?

Hjælp venligst. Som det ses på klokkeslettet har jeg kæmpet for at finde en løsning alt for længe!
Avatar billede majbom Novice
06. august 2010 - 07:49 #1
jeg ved sq ikke om jeg forstår dit problem, men er det fordi at når du klikker på et linke, ved den ikke hvilken side der blev inkluderet, og viser dermed intro-siden?
Avatar billede Hans Frederik Novice
06. august 2010 - 08:14 #2
OK. Problemet ser saaledes ud:
I min INDEX.PHP fil staar der:

$page = $_GET['page'];
        if (!empty($page)) {
            $page .= '.php';
            include($page);
        }
samtidig har jeg en side, som bliver 'included' gennem et link ind i min index.pxp, hvor der staar:

<a href='$_SERVER[PHP_SELF]?sti=$fil_liste[$n]'>

Hvilket er en del af en funktion i ovenstaaende kode, der genererer en liste med links til mapper. Den specifike traad her, linker til hver af disse mapper, MEN, $_SERVER[PHP_SELF] bliver jo til index.php, fordi filen med koden er 'included' i denne. Saa foer siden naar at kalde mappen frem, som den egentlig skulle linke til, bliver den smidt igennem
$page = $_GET['page'];
        if (!empty($page)) {
            $page .= '.php';
            include($page);
        }
og eftersom den ikke finder nogen fil med det mappenavn den kalder efter, sender den os tilbage til intro.php. Det skulle fremgaa af koden ovenfor hvad der sker. Hvis det stadig er utydeligt, saa omskriver jeg det gerne igen, med links til et par eksempler.
Avatar billede majbom Novice
06. august 2010 - 08:33 #3
er det så ikke bare at tage siden med i adressen:

<a href='$_SERVER[PHP_SELF]?sti=$fil_liste[$n]&page=$page'>

?
Avatar billede Hans Frederik Novice
06. august 2010 - 20:00 #4
Først skulle jeg måske sige at jeg ingen anelse har om PHP, det er en kode jeg i sin tid har købt, og nu bruger i en ny side.

Desværre virker din kode ikke, resultatet er det samme.
Avatar billede Hans Frederik Novice
06. august 2010 - 20:22 #5
Er det muligt med PHP at skrive noget i retningen af:

    <div class="indhold">
    <?
        $page = $_GET['page'];
        if (!empty($page)) {
            $page .= '.php';
            include($page);
        }
        elseif {
          Hvis linket kommer fra Billeder.php, så bliv i billeder.php, ligemeget om linket ikke indeholder page.
        else {
            include('intro.php');
        }
    ?>
    </div>

Det ville jo forhindre problemet, eller?
En eller anden variant deraf kan måske skrives i PHP, man kunne jo også skrive: Hvis linket kommer fra Billeder.php, så include('Billeder.php')
Avatar billede majbom Novice
06. august 2010 - 21:50 #6
det var derfor jeg ville tage $page med i linket, som jeg skrev tidligere. så har du 'Billeder' i $page jo..
Avatar billede Hans Frederik Novice
07. august 2010 - 00:48 #7
Din metode er med sikkerhed i den rigtige retning. Hvis jeg skriver:

'$_SERVER[PHP_SELF]?page=billeder&sti=$fil_liste[$n]'

virker det!

Problemet er jo så at jeg gerne ville kunne bruge dette billed-script til mere end bare et sæt billeder (f.eks. asienbiller, ruslandbilleder, italienbiller osv..) Så det ville jo være meget bedre hvis man kunne gøre det universelt, som du forsøgte.

Problemet med dit link er, at siden 'glemmer' hvad page er, så når jeg peger på linket:

'$_SERVER[PHP_SELF]?page=$page&sti=$fil_liste[$n]'

giver $page ingenting. Som sagt ved jeg ingenting om PHP, om det burde gemme $page mellem hver "session" eller hvad man siger. Men det eneste sted hvor jeg kan finde det gemt er i det faktiske adressefeld, der hedder:

http://hansfrederik.dk/index.php?page=billeder

(Måske skulle jeg have givet dig siden tidligere, men nu har du den i hvert fald.)

Er der en måde hvorpå man kan hente denne ind i siden? Noget i retning af:

get (page) //hent page fra adressefeltet
$page = page //definer $page variablen til hvad end den har hentet fra adressefeltet.

hvis det er muligt, har vi jo løst problemet.
Avatar billede Hans Frederik Novice
07. august 2010 - 01:02 #8
Jeg prøvede at indsætte:

$page = $_GET[page];

i billeder, men det gjorde ingen forskel.

Jeg forstår ikke hvorfor? Hjælp?!
Avatar billede Hans Frederik Novice
07. august 2010 - 01:10 #9
Haha! Jeg løste problemet.. jeg inkluderede

$page = $_GET[page];

i den 'if' som linket befinder sig i, således:

            //Her opsættes linkene til mapperne med billider.
            if(is_dir($sti."/".$fil_liste[$n]) and $nn < 4){
                $page = $_GET[page];
                $liste[] = "<tr><th class=asien><p><a href='$_SERVER[PHP_SELF]?page=$page&sti=$fil_liste[$n]'>$fil_liste[$n]</a></p></th></tr>";
            }
            elseif(is_dir($sti."/".$fil_liste[$n])){
                $page = $_GET[page];
                $liste[] = "<tr><th class=asien><p><a href='$_SERVER[PHP_SELF]?page=$page&sti=$fil_liste[$n]'>$fil_liste[$n]</a></p></th></tr>";
            }

Det virkede.. nu skal jeg bare have transformeret resten af koden til "universalkode", men det bliver noget nemmere nu, hvor jeg har forstået et par ting om php.

Læg et svar, og du får point.
Avatar billede majbom Novice
07. august 2010 - 08:52 #10
jeg forstår ikke at du er nødt til at lave $page = $_GET['page'] igen, for hvis jeg forstår dig ret har du denne kode:

<div class="indhold">
<?
  $page = $_GET['page'];
  if (!empty($page)) {
      $page .= '.php';
      include($page); //HER MÅ DER STÅ Billeder.php??
  }
  else {
      include('intro.php');
  }
?>
</div>


så burde $page også være tilgængelig i din include, men hvis bar edet virker er det jo super :)
Avatar billede majbom Novice
21. august 2010 - 11:21 #11
tfp :)
Avatar billede Hans Frederik Novice
25. september 2010 - 22:58 #12
@splazz: 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
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