@codenerd på twitter Mit seneste tweet:

Videre med PHP Include

I tutorialen Dynamiske sider med PHP Include så jeg på hvordan du nemt kunne lave et website hvor indholdet blev inkluderet i designet således design nemt kunne opdateres uden at skulle rette alle sider. I denne fortsættelse ser vi på selvsamme system, men med undermenuer. Dette er noget som flere har efterspurgt, så det kommer her.

Artiklen her er en viderebygger på Dynamiske sider med PHP Include så jeg vil anbefale du læser denne først

Vi lægger hårdt ud med toppen af dokumentet som før så sådan her ud:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
//check om side er sat - hvis ikke skal vi vise forsiden, og $_GET['side'] sættes derfor til forside
if (empty($_GET['side'])) {
    $_GET['side']="forside";
}
//sikkerhedscheck
//check om siden eksisterer, hvis ikke sæt side til 404 og sæt header til 404 siden findes ikke
if (!is_file("indhold/".$_GET['side'].".php") || eregi("../",$_GET['side'])) {
    $_GET['side']="404";
    header("HTTP/1.0 404 Not Found");
}
?>

Her er givetvis et par ændringer, men i første omgang er det dog ikke så slemt. Først og fremmest er vi nødt til at udbygge den første kode så den tager hensyn til underside også. Dette indfører vi en variabel til at holde styr på:

PHP
1
2
3
4
5
6
7
8
9
10
11
<?php
if (empty($_GET['underside'])) {
    if (empty($_GET['side'])) {
        $side='forside';
    } else {
        $side=$_GET['side'];
    }
} else {
    $side=$_GET['underside'];
}
?>

Ovenstående kode checker først om $_GET[‘underside’] er sat, hvis dette er tilfælde bliver $side sat til denne, da det så er underside der skal loades i systemet. Hvis underside ikke er sat, tester vi om $_GET[‘side’] er sat, hvis dette ikke er tilfælde loader vi pr. default forside, og ellers sættes $side til $_GET[‘side’].

Sikkerhedschecket kræver også en minimal ændring, i stedet for $_GET[‘side’] indskrives $side:

PHP
1
2
3
4
5
6
<?php
if (!is_file('indhold/'.$side.'.php') || eregi('../',$side)) {
    $_GET['side']=$side='404';
    header("HTTP/1.0 404 Not Found");
}
?>

Og det samme gælder for koden som inkluderer side:

PHP
1
2
3
<?php
    include('indhold/'.$side.'.php');
?>

Hereter vil alt virke, og links laves som før med:

PHP
1
<a href="index.php?side=side2">Side 2 </a>

Mens underlinks laves på følgende måde:

PHP
1
<a href="index.php?side=side2&underside=side2-1">Underside til side 2</a>

Dette er den simple løsning, hvor alt indhold stadig gemmes i mappen “indhold”. Dette giver imidlertid et par problemer:

  1. Alle sidder skal hedde noget unikt
  2. Undersider kan inkluderes som almindelige sider hvis navnet på undersiden angives som side= i adressen (eksempel)

Kan du leve med ovenstående, er der ingen grund til at læse videre, hvis ikke kommer her en mulig løsning

En af de mulige løsninger

I stedet for at gemme alt indhold i mappen “indhold” laves en mappe for hver side i indholds mappen. Hvis vi fx siger vi har tre menupunkter Side 1, Side2, Side3 og Side2 har følgende undersider: Side 2-1, Side2-2. Vil vi havde 3 mapper med navnene Side1, Side2 og Side3 – i Side1 og Side2 ligger en fil med navnet Side1.php/Side2.php – mens der i mappen Side2 ligger 3 filer: Side2.php, Side2-1.php og Side2-2.php. Her er vi igen nødt til at ændre lidt på PHPen

Vi beholder den samme kode til at tjekke om det er side eller underside der skal loades:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
if (empty($_GET['underside'])) {
    if (empty($_GET['side'])) {
        $_GET['side']='forside';
        $side='forside';
    } else {
        $side=$_GET['side'];
    }
} else {
    $side=$_GET['underside'];
}
?>

Sikkerhedstjekket ændrer vi til følgende

PHP
1
2
3
4
5
6
7
<?php
if (!is_file('indhold/'.$_GET['side'].'/'.$side.'.php') || eregi('../',$side)) {
    $_GET['side']='404';
    $side='404';
    header('HTTP/1.0 404 Not Found');
}
?>

Forskellen er at vi her altid går ind i mappen $_GET[‘side’]
samme ændring skal laves hvor vi inkluderer indholdet:

PHP
1
2
3
<?php
    include('indhold/'.$_GET['side'].'/'.$side.'.php');
?>

Og vupti så er vi klar igen

Jeg håber ikke denne artikel har været for overfladisk, men som altid svarer jeg selvfølgelig på spørgsmål og hjælper gerne, lige som alle eksempler kan downloades herunder.

Downloads

Eksempler

33 kommentarer

  1. Skrevet af Jonas  d. 30/04/2008 kl 06:48

    Jeg siger tak, det var jo netop lige det jeg skulle bruge, havde ellers prøvet at rette din første tutorial til, men det virkede ikke helt efter hensigten. Kan du ikke på et tidspunkt lave noget kode til en menu, hvor de rigtige undersider vises når man er på den aktive side?

    Svar på kommentaren
  2. Skrevet af Martin  d. 30/04/2008 kl 06:48

    Jo men det kan jeg da godt når jeg lige får tid.
    Det er nu ikke så svært igen den dovne og lette løsning er bare at lave en betinget sætning efter hvert hovedmenupunkt der tjekker om $side= menupunktet, hvis ja, vises undersiderne

    Svar på kommentaren
  3. Skrevet af Kent  d. 30/04/2008 kl 06:48

    Det er skide godt :-)

    Jeg har dog lidt problemer.. jeg har fx en anden mappe med billede gallery. Og kan ikke få den til at åbne den sti i den include..
    mappen hedder "Foto/index.php". hvordan skal man lave det link ?

    Svar på kommentaren
  4. Skrevet af Kent  d. 30/04/2008 kl 06:48

    Takker. :-)

    Men man kan ikke linke til "undermapper" ? altså Jeg kunne fx godt tænke mig at lave en mappe under "indhold" der hedder "Sjov" og så ligge alle mine sjov filer derind ?

    Svar på kommentaren
  5. Skrevet af Dennis  d. 30/04/2008 kl 06:48

    jeg kan ikke få det til at virke med undermapper, ved godt artiklen handler om undermenuer, men jeg mangler en måde at include noget fra en fil i en under mappe
    <a href="index.php?lukket/test
    altså hvor mappen hedder lukket og filen test.php

    Svar på kommentaren
  6. Skrevet af Dennis  d. 30/04/2008 kl 06:48

    har nu brugt dit eksempel og det hele virker jo nu, men den melder fejl på forsiden… det gør din side også… hvad skal man gøre eller hvor skal man ligge forside filen for at det virker?

    Svar på kommentaren
  7. Hvis man sætter title på index.php til ABC. Så ville titel på alle de andre sider også være ABC. Jeg tænker her på google. Men jeg har fundet en løsning. Jeg trækker det ned fra min database og viser det med en echo string. Så kunen jeg jo også få keywords og description på.
    Håber du forstår.
    Jeg fandt selv løsningen.

    Svar på kommentaren
  8. Smukt arbejde. Det passer perfekt til et par projekter jeg arbejder på for et nogle jeg kender. To firmaer, der har brug for noget bedre end statiske sider, og er lidt for "små" til rigtige CMS’er.

    Svar på kommentaren
  9. Skrevet af Martin  d. 30/04/2008 kl 06:48

    Til Claus:
    Ah på den måde, ja det gør jeg også her selv
    Kunne godt være jeg skulle skrive et indlæg omkring dette. For det er som du siger ikke godt for søgemaskinerne

    Svar på kommentaren
  10. Skrevet af Martin  d. 30/04/2008 kl 06:48

    Kan lige tilføje med hensyn til den if du havde lavet deroppe, så er problemet det enkelte = , ved sammenligning bruges ==, da enkelt = angiver en værdi, på den måde ville $side altid være = side3

    Håber det hjalp,
    ellers skriver du bare

    Svar på kommentaren
  11. Skrevet af Martin  d. 17/06/2008 kl 06:38

    Hej Kim,
    Skal lige ha afklaret lidt

    Dvs du har en struktur ala:

    index.php
    INDHOLD
    – fil.php
    – fil2.php
    – MAPPE 1
    — side.php
    — side2.php
    – MAPPE 2
    —side5.php

    Og du vil tilgå fil og fil2 udenom include systemet eller hvordan?

    Svar på kommentaren
  12. Skrevet af Martin  d. 17/06/2008 kl 15:00

    Hvis du bruger den første løsning her i kan du bare smide dem alle i roden af indhold – ellers skal der kodes lidt om så den tjekker begge dele, og det kan som godt give lidt uventede resultater

    Svar på kommentaren
  13. Skrevet af kim gaba  d. 17/06/2008 kl 23:01

    hey martin
    tak for den fed tutorial! virker perfekt!

    efter jeg har fået alle mine links i mappe og det fungere, ville jeg stadig gerne have nogen af dem til at ligge i indhold, så de ikke allesammen behøves og have en mappe? men kan ikke få det til at virke håber du kan hjælpe mig

    Svar på kommentaren
  14. Skrevet af kim gaba  d. 17/06/2008 kl 23:01

    min struktur ser sådan ud! godt ramt :) ! fil1 og fil2 vil ikke virke i mit include, ved ikke hvorfor. men min filer skal ligge i mapper f.eks

    index.php
    INDHOLD

    – mappe 1
    —fil1.php
    -mappe 2
    — fil2.php
    – MAPPE 3
    — side.php
    – MAPPE 4
    —side.php

    skal ligge sådan ellers gider det ikke og kører. ville helst undgå og skulle ligge dem alle i mapper for at det kører med min include,

    Svar på kommentaren
  15. Skrevet af Martin  d. 18/06/2008 kl 08:40

    Jeg kan godt lige lave et eksempel en af dagene hvis det er, men ellers er konceptet

    
    <?php
    if ($side er en mappe) { 
    gå ind i mappen 
    } else {
    indhold fra roden
    }
    ?>
    

    is_dir() kan bruges til formålet

    Svar på kommentaren
  16. Skrevet af Anders  d. 24/09/2008 kl 19:11

    Hej Martin

    Jeg er ved at lave en lille hjemmeside, og dine php toturials har været en virkelig stor hjælp. Jeg har forsøgt mig med diverse andre lær-php-guider, men de har allesammen været uforståelige eller for omfattende til mit niveau. Dine toturials havde lige præcis hvad jeg skulle bruge, og var forklaret på en måde så jeg kunne forstå det. Derfor: TAK!

    MVH
    Anders

    Svar på kommentaren
  17. Hej Anders, glad for det kan bruges, jeg sigter utroligt meget efter at ramme en tone og et forklaringsniveau så alle kan få gavn af det, primært fordi jeg mener at de fleste ressourcer omkring programmering, ligger niveauer over det emne de skriver om. Tak for linket, den vil jeg lige tage et nærmere kig på.
    Selv bruger jeg XAMPP til at teste lokalt, både på arbejde men også hjemme, også noget jeg havde tænkt at dække i et blog indlæg på et tidspunkt.

    Svar på kommentaren
  18. Skrevet af Rasmus  d. 03/11/2008 kl 04:54

    Kanon guider Martin :)

    Undrer mig over følgende kode i "En af de mulige løsninger":

    $_GET[‘side’]=’forside';
    $side=’forside';

    Jeg troede ikke man kunne assigne værdi til en $_GET-variabel !?
    Er de de to variabler $side og $_GET[‘side’] ikke de samme?

    Hvis du får tid en dag ville det være fantastisk med en guide til hvordan man automatiserer highlightning af det menupunkt man er på.
    Hvis man fx. er på side 2-1 (http://www.martin-nielsen.com/eksempler/dynamisk2/index.php?side=side2&underside=side2-1) ville det menupunkt blive understreget automatisk.

    Keep trucking :)

    Svar på kommentaren
  19. Skrevet af Christopher  d. 28/12/2008 kl 18:59

    Martin, du er min frelser! :)
    I love you. Har læst utrolig mange artikler om php, men dit er simpelhen utroligt. Man fatter det med det samme. Håber du en dag vil udgive artikler om hvordan man laver hele sider med login, chat, forum osv.

    Svar på kommentaren
  20. Skrevet af Martin  d. 28/12/2008 kl 20:40

    Mange tak christopher, glad for det kan bruges og er forståeligt.

    @Rasmus, undskyld jeg aldrig fik svaret dig hvis du stadig følger med her, fik aldrig en mail omkring et nyt indlæg.
    For at svare på dit spørgsmål – du kan sagtens asigne en $_GET, alle variabler kan sådan set tildeles en værdi og omdefineres (bort set fra konstanter)

    Svar på kommentaren
  21. Skrevet af Mathias  d. 31/12/2008 kl 18:50

    Nu har jeg forsøgt mig med eksempel 2. Men spekulerer på, kan det lade sig gøre at den mappe man lægger filen i hedder noget andet end præcis det samme som selve filen? I så fald, hvad kræver det af kode?

    Mvh. Mathias

    Svar på kommentaren

Leave a Reply to Jonas Cancel reply

Krævede felter er markeret med *.

*