Hovednavigation

php.gif

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 
//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
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
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 
    include('indhold/'.$side.'.php'); 
?>

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


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

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


<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
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
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 
    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

Læs også: Dynamiske sider med PHP Include - Nu med metatags

Relaterede blogindlæg

Del
Indlægget blev skrevet af Martin d. 13/10, 2007 kl 20:58 og blev sidst rettet d. 09/01, 2008 kl 21:13

Kommentarer

RSS Feed for dette indlæg

GravImg
Skrevet af Jonas
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?

GravImg
Skrevet af Martin
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

GravImg
Skrevet af Kent
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 ?

GravImg
Skrevet af Martin Nielsen
30/04 - 2008 kl. 06:48

evt bare lav en fil i indholdsmappen som ikke indeholder andet end:
<?php include('/sti/til/Foto/index.php');
?>

Så burde du nemt kunne snyde den på den måde

Mvh
Martin

GravImg
Skrevet af Kent
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 ?

GravImg
Skrevet af Martin Nielsen
30/04 - 2008 kl. 06:48

Hvis du bruger "En af de mulige løsninger" så burde det ikke være noget problem
så skal linket bare være
index.php?side=sjov&underside=sidenSomLinkes

GravImg
Skrevet af Dennis
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

GravImg
Skrevet af Dennis
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?

GravImg
Skrevet af Dennis
30/04 - 2008 kl. 06:48

har selv fundet fejlen...
der manglede et $_GET['side']='mappen';
den skal selvfølgelig starte:
<?php
if (empty($_GET['underside']))
{
if (empty($_GET['side']))
{
$_GET['side']='mappen-som-forsiden-ligger-i';
$side='forside'; }

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

Det er selvfølgelig korrekt :) sorry for den lange svartid, har været lidt travl. Eksemplet og download er opdateret.
Mvh
Martin

GravImg
Skrevet af Claus Fischer
30/04 - 2008 kl. 06:48

Kan du ikke lave noget så man kan loade titel fra den side man loader?

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:47

Det kræver vist en forklaring?

GravImg
Skrevet af Claus Fischer
30/04 - 2008 kl. 06:48

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.

GravImg
Skrevet af Preben Lang
30/04 - 2008 kl. 06:48

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.

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

Glad for det kan bruges, så får man jo lyst til at skrive en masse flere tutorials

GravImg
Skrevet af Preben Lang
30/04 - 2008 kl. 06:48

Bare gå i krig, hvis det er php så læser jeg dem. Jeg prøver at lære det, så jeg støvsuger jævnligt nettet for tutorials.

GravImg
Skrevet af Martin
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

GravImg
Skrevet af Preben Lang
30/04 - 2008 kl. 06:48

Ok: Martin. Nu har jeg siddet og fumlet rundt med det du har lavet og det virker perfekt. De eneste fejl der var, var mine slåfejl. MEN: Jeg sad og tænkte at den samme kode som indlæser indholdet kunne vel også bruges til at indlæse relevate undermenuer så de ikke hele tiden er fremme. Men jeg kan ikke rigtig gennemskue det. jeg prøvede at bruge $side = 'side1' og så fremdeles og jeg prøvede at skrive en IF-ELSE funktion til at styre det. meningen er at hvis $side er lig 'side1' så viser vi en undermenu der hedder side1.php, hvis ikke henter den blank.php.

Min ide var at bruge din første tutorial til at styre undermenuerne og den anden til at styre indholdet.

Kan du afse lidt tid til at hjælpe mig på vej?

mvh
Preben Lang

GravImg
Skrevet af Preben Lang
30/04 - 2008 kl. 06:48

Jeg prøvede flg. kode, men uden held:

if ($side = 'side3') {include ('menu/'.$side.'.php');} else {include ('menu/blank.php');}

blank.php er en tom side uden så meget som eet tegn. derfor skulle den ikke ødelægge indtrykket af menuen.
mvh Preben

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

Det kan du sagtens... jeg ville lave en:

<?php 
switch($_GET['side']) {
   case 
'side1':
     
$menu='side1menu.php';
   break;
   case 
'side2':
     
$menu='side2menu.php';
   break;
   case 
'side3':
    
$menu='side3menu.php';
   break;
   default:
    
$menu='standardmenu.php';
   break;
}
include(
sti/til/menuer/.$menu);
?>





Switch er det samme som at lave en lang række if-then-else sætninger, og er ganske meget mere overskueligt når der er mange.

GravImg
Skrevet af Martin
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

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

Så er del 3 skrevet som omhandler problemet Claus bragte på banen:

http://martin-nielsen.com/blog/php_include_-_nu_med_metatags-170.html

GravImg
Skrevet af Morten
30/04 - 2008 kl. 06:48

Hej Martin.

Tak for dine rigtig gode artikler, som virkelig har gjort en forskel for mig.

Jeg er ved at lave en ny side, og her har jeg med succes brugt din første artike Dynamiske sider med includes.

Nu har jeg nået et punkt, hvor jeg er gået helt i stå, og jeg har prøvet forskelligt uden held.
Jeg vil skitsere mitproblem, og så vil jeg håbe, du får tid til at give mig et hint.

Min forside består af en top, en bund og så indhold, der varierer alt efter hvilket link man trykker på. mine links ligger fast i toppen af siden - her har jeg anvendt metoden i din første artikel, og det virker perfekt.

Når jeg klikker på Nyheder, kommer nyheder.php til syne i indholdsvinduet - herligt:)
Nu vil jeg gerne have, at der i venstre side af Nyheder fremkommer tre ydereligere links eks indland, udland og aktuelt. Her stopper så festen for mig.

Jeg har prøvet at indsætte dette under indhold:

<?php
switch($_GET['side']) {
case 'nyheder':
$menu='nyheder-menu.php';
break;
case 'info':
$menu='info-menu.php';
break;
default:
$menu='blank-menu.php';
break;
}

include(menuer/.$menu);
?>

ps. hvis ikke jeg sætter anførselstegn før menuer og efter menu i includen virker det ikke.

Når jeg loader siden og klikker på linket Nyheder skrives der:

http://localhost/nymortenhilmer.dk/index.php?side=nyheder

men siden forbliver uforandret..

Håber, du kan afse et øjeblik.

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

Hejsa, det er selvfølgelig mig der har lavet en fejl... include('menuer/'.$menu);

Jeg har lige lavet et eksempel her:
http://www.martin-nielsen.com/eksempler/dynamisk_menu/index.php?side=side2
Hvor side 2 har special menu

Jeg har lagt eksemplet op her i zip:
http://martin-nielsen.com/downloads/dynamisk_menu.zip

Håber det kan bruges
Mvh
Martin

GravImg
Skrevet af kim gaba
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

GravImg
Skrevet af kim gaba
16/06 - 2008 kl. 22:31

links hedder self filer! har delt mange af dem op i mapper ind i "indhold" men mine andre filer som ligger i indhold virker ikke! håber meget du kan hjælpe mig

GravImg
Skrevet af Martin
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?

GravImg
Skrevet af kim gaba
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,

GravImg
Skrevet af Martin
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

GravImg
Skrevet af kim gaba
25/09 - 2008 kl. 10:30

okay ville utrolig gerne prøv hvor den checket begge steder! hvis du har en ide om hvordan må du meget gerne komme med den men ellers så mange tak for hjælpen!

GravImg
Skrevet af Martin
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

GravImg
Skrevet af Anders
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

GravImg
Skrevet af Anders
24/09 - 2008 kl. 19:30

Lige en ekstra ting:

Jeg har brugt http://www.firepages.com.au/phpdev5.htm til at teste mine php sider offline, hvilket også har gjort mit liv noget nemmere :-)

GravImg
Skrevet af Martin Nielsen
24/09 - 2008 kl. 19:35

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.

GravImg
Skrevet af Rasmus
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 :)

GravImg
Skrevet af Christopher
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.

GravImg
Skrevet af Martin
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)

GravImg
Skrevet af Mathias
30/12 - 2008 kl. 23:26

Super fed guide! virkelig! men jeg har et problem med at få vist min 404 side. Du har det helt samme problem i din eksempel "http://www.martin-nielsen.com/eksempler/dynamisk2/index.php?side=side4" her burde din fejlside komme op, men det gør den ikk? i stedet skriver den at den efterspurgte fil ikke findes? hvad er fejlen? den samme fejl er der i det eksempel man kan downloade.

Mvh. Mathias

GravImg
Skrevet af Mathias
31/12 - 2008 kl. 00:21

Nu har jeg fundet fejlen. Fejlen ligger kun i eksempel 1. Og er fordi du i din sikkerhedskode skriver $_GET['side']='404'; der skulle stå $side='404'; :) Godt nytår

GravImg
Skrevet af Mathias
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

GravImg
Skrevet af Martin
01/01 - 2009 kl. 11:44

Tak for rettelsen, den havde jeg lige overset :) det skulle være rettet nu både i indlægget, downloaden og eksemplet.


Ny kommentar








Sikkerheds kode





DanskeWeblogs.dk | Samling af de danske blogs