Hovednavigation

php.gif

Denne tutorial vil vise, hvorledes du kan lave en dynamisk hjemmeside med PHP. Det vil blive gennemgået hvordan du lægger design i en fil, og inkluderer alt indhold i denne. På denne måde skal du kun ændre design et sted når du engang ønsker, at lave et nyt. For at kunne bruge denne tutorial skal din server understøtte PHP.

Koden

Du arbejder enten med tabeller eller divs som design element, det er underordnet, men fælles er at du hver gang du laver en ny side skal kopiere hele designet ind i den nye side. Dette vil vi lave om på. Vi tager udgangs punkt i en side som kunne se sådan her ud (smukt design, jeg ved det):

Fin side

Menu

Her er indhold

Det første vi skal gøre er, at omdøbe index.html til index.php. Dette gør at det vil være muligt, at afvikle PHP kode i dokumentet. Dernæst skal vi se på hvordan linksne er opbygget. Som der ser ud nu har vi følgende:



<a href="side1.html">Side 1 </a>
<a href="side2.html">Side 2</a>      
<a href="side3.html">Side 3</a>

Dette er som sagt ikke særligt dynamisk, og vi ønsker derfor, at gøre sådan, at disse links altid fører til index.php, som indeholder designet af websitet. Samtidig er det også nødvendigt, at viderebringe informationen om hvilken side index.php så skal vise. Dette gør vi vha såkaldte get variabler eller querystrings, som kan sendes med en URL. Vi ændre derfor vores links til følgende:



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

Her kan det ses, at ved hvert link sendes brugeren til index.php. Siden der skal loades bliver sendt videre via get variablen side, og det er denne variabel vi skal modtage på index.php og basere indholdet på.

Forberedelse af indholdet

For at gøre det hele nemmere, og også mere sikkert, anbefaler jeg, at du lægger alt dit indhold ind i en mappe som hedder indhold. Ligeledes (for nemhedens skyld) kalder du disse sider .php. I siderne skal der kun ligge indhold, og altså ingen tags - men kun de html koder omkring indholdet, resten står index.php for.

Index.php

I index.php finder vi stedet hvor vores indhold skal vises og indsætter følgende kode:


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

include() er [en af] PHPs metode til at inkludere filer med, og ser vi inde i funktionen, skal den gå ind i mappen indhold, og så skal den hente variablen side fra GET/QueryString, som vi jo sender videre fra vores links, og sidst skal den sætte .php på. Klikker man fx på link 1 vi der komme til at stå include("indhold/side1.php" ); helt automatisk.

Forside samt fejlside

Som koden er nu, vil man få en fejlbesked når man kommer ind på forsiden. Dette skyldes at variablen side ikke er sat fra starten af. Ligeledes hvis en bruger ændre sidevariablen vil man få en fejl fordi den ikke findes. Dette vil vi nu fixe. Først laver du en ny indholds side og kalder den 404.php og gemmer den i indholds mappen. Dernæst går du ind i index.php og helt op i toppen af denne indsætter du følgende kode:


<?php
if (empty($_GET['side'])) { 
    $_GET['side']='forside'; 
}
?>

Dette vil bevirke, at forside.php vil blive loadet som forside. Vi checker simpelthen med PHPs indbyggede funktion empty() om variablen side er sat, hvis den ikke er det, sætter vi den til forside. Så mangler vi bare fejlsiden. Mange ville lave denne nede i dokumentet ved at checke om den fil der skal inkluderes findes, og hvis ikke inkluderes en 404 fejlbesked. Denne procedure er ikke helt korrekt, da en 404 siden findes ikke fejl, også er nødt til, at have headeren for en 404 fejl side. Derfor laver vi følgende kode efter ovenstående check:


<?php
if (!is_file('indhold/'.$_GET['side'].'.php') || eregi('../',$_GET['side'])) { 
    $_GET['side']='404'; 
    header('HTTP/1.0 404 Not Found'); 
}
?>

!is_file() checker om filen vi efterfølgende skal inkludere eksisterer. Hvis den ikke gør det sætter vi side til 404. Dernæst sendes den korrekte header() for en 404 fejl side til browseren. Dette er især vigtigt af hensyn til søgemaskiner, men også egen statistik. Ligeledes checker vi i ovenstående om .. findes i sidevariablen, da dette vil medføre, at forkerte sider kan inkluderes, her anvendes funktionen eregi(), som anvendes til at søge i tekststrenge.

Og vupti, du har nu lavet en dynamisk website, hvor du nemt og hurtigt kan ændre designet på hele siden

Videre med Include

Du kan naturligvis bruge include til, at indhente alle de sider du ønsker. Fx kan du i din index.php vælge, at inkludere din menu, således denne ligger i sin egen fil. Derved får du utrolig god overskuelighed, og det bliver igen endnu nemmere, at vedligeholde siden. Formatet er det samme, fx hvis du ønsker at inkludere menu.php skriver du:


<?php
include('menu.php');
?>

Download filer

Se eksempel

php.net

NY Tutorial der følger op på denne: Videre med PHP Include

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

Relaterede blogindlæg

Del
Indlægget blev skrevet af Martin d. 19/01, 2007 kl 09:30 og blev sidst rettet d. 13/10, 2007 kl 21:04

Kommentarer

RSS Feed for dette indlæg

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

Du er GUD.
Du har hjulpet mig op til flere gange, og kommer sikkert til det igen. Jeg vil forsøge at læse alle de artikler der kommer på din side. Top $. Mvh. Jan

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

Ja men tak tak :)
Jeg vil forsøge at få skrevet en masse spændende artikler du kan læse heh

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

Jeg elsker dig Martin! Du har lært mig at lave include. Har brugt måneder på det. Kanon forklaring!

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

Ja men jeg er da glad for den kunne bruges og var nemt tilgængelig. Har planer om at skrive en \"videre med php include\" når tiden byder det :)

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

Martin, har læst flere af dine artikler. Det er DIG som har lært mig at programmere i php. Tak MARTIN! :)

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

Fed artikel, men kunne godt tænke mig lidt mere om hvordan det virker med undermenupunkter

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

Det skal nok komme, har haft lidt travlt det sidste halve år - men frygt ej det er på vej :)

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

Det ser jeg frem til, det er nemlig lige noget jeg står og skal bruge

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

Hvis der skulle være nogen der fulgte med i RSS feed for kommentarene så vil jeg lige gøre opmærksom på at jeg nu har skrevet del 2 af denne tutorial:
http://www.martin-nielsen.com/blog/Videre_med_PHP_Include-122.html#comment

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

Da jeg lavede det her i forgårs nat kl 4 fik jeg kun php include til at virke (hvilket egentlig er fedt når man er af den gamle html4.01 skole... men ved nærmere gennemlæsning igen i dag holder det jo 1000 % at kunne lave dynamiske sider :) tak for hjælpen

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

Det gør i hvert fald livet lidt lettere :) - glad for at kunne hjælpe!!

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

Hej Martin
Kan du ikke vise den fulde "index.php", inklusive php teksten. Jeg er noget i tvivl om hvad du mener med "..går du ind i index.php og helt op i toppen af denne".
Ellers synes jeg det er en god instruks du giver.

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

Hej Marjorie,
Index.php ligger i den fil der er til download
http://martin-nielsen.com/downloads/dynamisk1.zip

Men har lige uploaded kildekoden for index.php her:
http://www.martin-nielsen.com/eksempler/dynamisk1/index.phps

Håber det hjælper
Mvh
Martin

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

Godt arbejde. Bruger det på alle mine sider. Hvis jeg bruger den ligesom du foreslår, hvordan laver jeg så et sitemap via din anden blog indlæg?

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

Kommer an på om du bruger den online eller PHPSiteMapNG, hvis du bruger førstnævnte skal du ikke tænke yderligere over det, da den bare følger dine links, hvis du bruger PHPSiteMapNG er der en indstilling under input der hedder Scan website, den slår du til og slår Local Filesystem fra

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

SÃ¥ er del 3 skrevet:
http://martin-nielsen.com/blog/php_include_-_nu_med_metatags-170.html

GravImg
Skrevet af Kasim
30/04 - 2008 kl. 06:51

Har íkke helt forstÃ¥et det med sider.php altsÃ¥ jeg vil lave sÃ¥dan at jeg har et link som dette sider.php?action=side1...

Men når jeg gør det siger den denne fejL: Warning: include(?action=one) [function.include.html]: failed to open stream: No such file or directory in /host/b/e/l/belajboyz/belajboyz/dreamy/index.php on line 61


Her er hele min kode:


<?php
session_start
();
if (empty(
$_GET['side'])) {
    
$_GET['side']='one';
}
?>
<?php
if (eregi('sider.php?action='.$_GET['side'].'') || eregi('sider.php?action=',$_GET['side'])) {
    
$_GET['side']='404';
    
header('HTTP/1.0 404 Not Found');
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Dreamy - A Ginger Ninja! template</title>
<link rel="stylesheet" href="style.css" type="text/css" media="screen" />
</head>

<body>

<div id="wrapper">

    <div id="header">
        <h1>Dreamy</h1>
    </div>

    <div id="menu">
        <ul>
            <li><a href="?side=one">Link One</a></li>
            <li><a href="#">Link Two</a></li>
            <li><a href="#">Link Three</a></li>
            <li><a href="#">Link Four</a></li>
            <li><a href="#">Link Five</a></li>
        </ul>
    </div>

    <div id="sidebar">
        <div id="feed">
            <a class="feed-button" href="#"> </a>
        </div>
        <ul>
            <li><a href="#">Link One</a></li>
            <li><a href="#">Link Two</a></li>
            <li><a href="#">Link Three</a></li>
            <li><a href="#">Link Four</a></li>
            <li><a href="#">Link Five</a></li>
        </ul>
        <div id="sidebar-bottom">
             
        </div>
    </div>

    <div id="content">
        <div id="ad-top">
            <!-- Insert 468x60 banner advertisement -->
        </div>
        <div class="entry">
<?php
       
include "sider.php?action=$_GET[side]";
?>
    </div>

    <div id="footer">
        <div id="footer-valid">
            <a href="http://validator.w3.org/check/referer">xhtml</a> / <a href="http://www.ginger-ninja.net/">ginger ninja!</a>
        </div>
    </div>

</div>

</body>
</html>


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

Nu kan jeg ikke lige gennemskue ud fra koden hvad præcis det er du ønsker.
Er det side.php?action=one der skal includes eller er det one.php der skal includes?

GravImg
Skrevet af Kasim
05/05 - 2008 kl. 18:50

sider.php?action=one skal includeres

GravImg
Skrevet af Thomas Moltsenn
26/09 - 2008 kl. 11:56

Hey Martin

Super fed tutorial.. Det var vidst det sidste, jeg manglede at lære, for at have noget, der bare ligner en hjemmeside :) Jeg kunne dog godt tænke mig en tutorial til en simpel gæstebog, hvor man selv kan redigere designet :)

Mange tak - jeg vender tilbage..

GravImg
Skrevet af Martin Nielsen
26/09 - 2008 kl. 12:00

@Thomas - glad for det kan bruges - og kan næsten love at der kommer en simpel tagwall/gæstebog tutorial på et tidspunkt :) det har været på min to-blog-about liste i lang tid

GravImg
Skrevet af Rudi Kærgaard
08/10 - 2008 kl. 22:19

Hej Martin nielsen.
Tak for din guide, den er utrolig hjælpsom, og var lige det jeg søgt.
Men nu har jeg et problem.
for jeg ønsker at benytte samme løsning på en underside. Hvordan løser jeg lettest dette?

Situationen:

jeg har en top menu, hvor jeg klikker på portefølje.
Nu er jeg i porteføljen, og der er en sidemenu i en div, hvor jeg kører med samme koncept. hvor min div ved siden af menuen skal skifte, alt efter hvad for et link jeg klikker på i side menuen.
og jeg kan vel ikke lave en adresse der ser sådan ud index.php?side=fakta
?port=molle fx.


------- ------ -------- ----- -------
---- billed
----
----
----

GravImg
Skrevet af Rudi Kærgaard
08/10 - 2008 kl. 22:21

Hej Martin nielsen.
Tak for din guide, den er utrolig hjælpsom, og var lige det jeg søgt.
Men nu har jeg et problem.
for jeg ønsker at benytte samme løsning på en underside. Hvordan løser jeg lettest dette?

Situationen:

jeg har en top menu, hvor jeg klikker på portefølje.
Nu er jeg i porteføljen, og der er en sidemenu i en div, hvor jeg kører med samme koncept. hvor min div ved siden af menuen skal skifte, alt efter hvad for et link jeg klikker på i side menuen.
og jeg kan vel ikke lave en adresse der ser sådan ud index.php?side=fakta
?port=molle fx.


------- ------ -------- ----- -------
---- billed
----
----
----

GravImg
Skrevet af RUdi Kærgaard
08/10 - 2008 kl. 22:28

undskyld jeg havde ikke set, at du allerede har skrevet en tut til dette. TAK :)

GravImg
Skrevet af Martin Nielsen
12/10 - 2008 kl. 15:47

Glad for det kan bruges :) og velkommen til


Ny kommentar








Sikkerheds kode





DanskeWeblogs.dk | Samling af de danske blogs