Avatar billede futte850 Nybegynder
29. februar 2012 - 23:44 Der er 15 kommentarer og
1 løsning

php page switching

Da jeg er igang med at lave en hjemmeside, ville jeg gerne have bruge noget switch til, at skifte imellem mine sider.

Mit problem er så, at jeg har brugt et gammel script som skulle virke, dog uden held.

Jeg lavede så en lille test side for, at finde ud af hvad problem var.

Det eneste jeg har kunnet finde ud af er, at på mit webhotel virker det fint, men desværre så virker det ikke optimalt i xampp, lokalt på min pc.

http://www.dummierun.dk/test/phpswitch/ (dette er test siden, her virker det fint)

Hvis jeg køre det samme script lokalt på min maskine får jeg denne fejl:

Notice: Undefined index: page in C:\xampp\htdocs\test\phpswitch\switch.php on line 3
Dette er forsiden

Menuen virker sådan set fint, den vil dog ikke vise forsiden.php automatisk, men jeg skal klikke på menuen før den kommer frem.!

Hvad kan fejlen skyldes ??

index.php:

<!DOCTYPE  html>
<html  lang="da-DK">
<head>

    <title>PHP | Switching |</title>

    <style type="text/css">

        body {
            font-family: Helvetica, Arial, sans-serif;
            font-size: 11px;
            }
           
        .nav {
            position: relative;
            top: 100px;
            left: 200px;
            }
       
        .menu li {
            list-style-type: none;
            float: left;
            margin-right: 5px;
            }
           
        .switch {
            position: relative;
            top: 200px;
            left: 60px;
            }
           
    </style>
</head>
<body>
    <div class="nav">
        <ul class="menu">
        <li><a href="?page=forside">Forside</a></li>
        <li><a href="?page=portfolio">Portfolio</a></li>
        <li><a href="?page=profil">Profil</a></li>
        <li><a href="?page=links">Links</a></li>
        <li><a href="?page=feedback">Feedback</a></li>
        </ul>
    </div>
    <div class="switch"><?php include 'switch.php'; ?></div>
</body>
</html>

switch.php:

<?php
       
        switch($_GET['page'])
        {
            case "forside":
                include 'forside.php';
            break;
            case "portfolio":
                include 'portfolio.php';
            break;
            case "profil":
                include 'profil.php';
            break;
            case "links":
                include 'links.php';
            break;
            case "feedback":
                include 'feedback.php';
            break;
            default:
                include 'forside.php';
            break;
        }
?>

i alle xxx.php siderne har jeg bare tilføjet noget tekst: "Dette er forsiden" f.eks.
Avatar billede olebole Juniormester
01. marts 2012 - 00:07 #1
<ole>

Det er ikke en fejl, men en notice. Sådan en får du, når du bruger 'bad practice' - altså en skidt kodestruktur. Mange slår den slags meldinger fra, men det sikrer dem kun, at de aldrig får lært at kode ordentligt. Behold dem endelig slået til i dit udviklingsmiljø  *o)

Den viste notice kommer kun første gang, du går ind på siden, hvor der ikke står noget om page i URL'en. Du undgår den ved at skrive en mere hensigtsmæssig kodestruktur:

<?php
    if (!empty($_GET)) { 
        switch($_GET['page'])
        {
            case "forside":
                include 'forside.php';
            break;
            case "portfolio":
                include 'portfolio.php';
            break;
            case "profil":
                include 'profil.php';
            break;
            case "links":
                include 'links.php';
            break;
            case "feedback":
                include 'feedback.php';
            break;
            default:
                include 'forside.php';
            break;
        }
    }
?>
... voilà!  =)

/mvh
</bole>
Avatar billede futte850 Nybegynder
01. marts 2012 - 08:41 #2
Det er da egentligt meget smart med den funktion :)

Kunne du eventuelt fortæller mig hvad koden du har tilføjet gør: 
if (!empty($_GET)) {
Avatar billede futte850 Nybegynder
01. marts 2012 - 08:54 #3
Lige en tilføjelse...

Jeg har lige siddet og søgt lidt efter switch funktionen og det lyder til at 'if/elseif/elseif' er hurtigere og bedre at bruge end 'switch/case/case'. (2 gang hurtigere at bruge elseif)
Avatar billede Mr-Petersen Nybegynder
01. marts 2012 - 09:33 #4
det her vil også virke.

<body>
    <div class="nav">
        <ul class="menu">
        <li><a href="index.php?page=forside">Forside</a></li>
        <li><a href="index.php?page=portfolio">Portfolio</a></li>
        <li><a href="index.php?page=profil">Profil</a></li>
        <li><a href="index.php?page=links">Links</a></li>
        <li><a href="index.php?page=feedback">Feedback</a></li>
        </ul>
    </div>
    <div ><? if ($page == "") { ?>
                <? include "forside.php" ?>
                <? } else { ?>
                <? include "$page.php" ?>
                <? } ?></div>
</body>
</html>
Avatar billede DeeDawg Nybegynder
01. marts 2012 - 10:25 #5
@Mr-Petersen: Nej, det kan du ikke være sikker på. At benytte PHP short tags, er ikke noget man kan forvente er slået til på den pågældende PHP installation. Derfor er det en dårlig idé at blive vandt til at bruge dem. Desuden er din løsning latterlig. Hvorfor afbryde PHP's flow så unødvendigt mange gange? :)

@futte850: Du vil også finde andre påstande om at switch er hurtigere, så jeg vil gerne sige til dig - du skal ikke tro på alt hvad du læser. Generelt bør dit valg være baseret på den opgave du gerne vil have udført. I dit tilfælde her, er det et godt valg at benytte switch, da den passer til den opgave du vil have udført.

Den forskel der end måtte være i de 2 funktioners hastighed, vil være så lille, at du ikke vil lægge mærke til det anyway. :)
Avatar billede Mr-Petersen Nybegynder
01. marts 2012 - 11:03 #6
så bliver den ikke afbrudt.

<? if ($page == "") {
                include "forside.php";
                } else {
                include "$page.php";
                }?>
Avatar billede futte850 Nybegynder
01. marts 2012 - 11:24 #7
Det virker næsten nu, men har stadig problemer med at få forside til at vise sig når man kommer ind på siden.
Avatar billede DeeDawg Nybegynder
01. marts 2012 - 12:13 #8
Det kunne gøres således

<?php
    $page = (empty($_GET) ? "forside" : $_GET['page']);
    switch($page){
        case "portfolio": include 'portfolio.php'; break;
        case "profil": include 'profil.php'; break;
        case "links": include 'links.php'; break;
        case "feedback": include 'feedback.php'; break;
        default: include 'forside.php'; break;
    }
?>


@Mr-Petersen: Desuden er din løsning usikker. Jeg kan selv finde på at lave en lign. løsning når jeg er træt og ikke tænker klart, hvilket jeg desværre også har gjort i hvert fald mindst 1 gang, her på Eksperten. Heldigvis var olebole der hurtigt til at rette op på det.

Den løsning du har vist her, kan give eventuelle hackere mulighed, for at få inkluderet andre uønskede PHP filer. Derfor er det vigtigt at definere præcis hvilke filer der er okay, og alt andet skal ignoreres. :)
Avatar billede Mr-Petersen Nybegynder
01. marts 2012 - 13:22 #9
Tak, så lærte jeg også noget i dag :)
Avatar billede olebole Juniormester
01. marts 2012 - 14:23 #10
@Mr-Petersen: En anden ting er, at hvis $page kan fange $_GET['page'], så er din PHP-opsætning dybt forældet og usikker. Direktivet, som styrer dette (register_globals) har som default været sat til off siden PHP 4.2.0 ... det er længe siden  =)

Du kan læse lidt mere om det her.

@futte850: Fordelen ved switch er, at betingelsen evalueres én gang. Herefter sammenlignes resultatet med hver case. Ved if/elseif/else evalueres betingelsen hver gang.

Det betyder ikke, du ikke kan finde eksempler, hvor if/ifelse/else kan være marginalt hurtigere, men det er primært af akademisk interesse.

Du kan også konstruere andre betingelsesstrukturer, som virker endnu hurtigere - i stil med Duff's Device, som kendes fra loops - men det forringer læsbarheden/vedligeholdelsen, og det har kun interesse i helt specielle situationer. Det er ikke noget, der er hensigtsmæssigt i en almindelig webapplikation. Her er det ofte til langt mere besvær end hjælp. At spare et millisekund ved en include kan let koste mange penge i vedligeholdelse.

Det korte svar/råd: Brug en switch  *o)
Avatar billede olebole Juniormester
01. marts 2012 - 14:36 #11
En anden og meget hurtig løsning, som samtidig er letlæselig og let at vedligeholde, kunne være:

<?php
if (!empty($_GET)) {
    $allowedIncludes = array(
        'forside' => 1,
        'portfolio' => 1,
        'profil' => 1,
        'links' => 1,
        'feedback' => 1
    );
    if ($allowedIncludes[$_GET['page']]) {
        include($_GET['page'].'.php');
    }
} else {
    include('forside.php');
}
?>
Avatar billede futte850 Nybegynder
01. marts 2012 - 23:01 #12
olebole: hvordan får jeg det til at virke, hvis mine .php filer ligger inde i en mappe som hedder 'include' ?
Avatar billede olebole Juniormester
01. marts 2012 - 23:25 #13
Noget i stil med:

<?php
if (!empty($_GET)) {
    $allowedIncludes = array(
        'forside' => 1,
        'portfolio' => 1,
        'profil' => 1,
        'links' => 1,
        'feedback' => 1
    );
    if ($allowedIncludes[$_GET['page']]) {
        include('include/'.$_GET['page'].'.php');
    }
} else {
    include('include/forside.php');
}
?>
Avatar billede futte850 Nybegynder
01. marts 2012 - 23:31 #14
Det virker bare.!! : )

Jeg takker mange gange.. smid et svar olebole!
Avatar billede olebole Juniormester
01. marts 2012 - 23:37 #15
Selvtak, men ellers tak - jeg samler ikke point. Du kunne jo evt. spørge DeeDawg  =)
Avatar billede DeeDawg Nybegynder
02. marts 2012 - 16:31 #16
Haha. Jamen, lad os da endelig belønne dem, som ikke har helt styr på det de laver. God idé, futte850. ;)
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