/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Dynamisk include
Fra : Erik Ginnerskov


Dato : 02-12-05 11:57

Hej NG

Neg har netop fået dynamisk include til at fungere i asp og har derfor fået
blod på tanden. Nu vil jeg gerne have det til at køre i php også.

Men jeg kan ikke hverken i bøger eller online-manualer finde noget, jeg kan
stykke sammen til noget brugbart.

Det skulle gerne være noget i retning af denne pseudokode:

<?
if ID er tom;
sæt ID til "s1";
end if;
Server.Execute(ID & ".inc") /*[1]*/
?>

1] asp-kald til en fil, der skal inkluderes - skal selvfølgelig omskrives
til php-syntaks.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



 
 
Michael Zedeler (02-12-2005)
Kommentar
Fra : Michael Zedeler


Dato : 02-12-05 12:31

Erik Ginnerskov wrote:
> Neg har netop fået dynamisk include til at fungere i asp og har derfor fået
> blod på tanden. Nu vil jeg gerne have det til at køre i php også.
>
> Men jeg kan ikke hverken i bøger eller online-manualer finde noget, jeg kan
> stykke sammen til noget brugbart.

http://dk.php.net/manual/en/function.include.php

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf

Erik Ginnerskov (02-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 02-12-05 13:04

Michael Zedeler wrote:

> http://dk.php.net/manual/en/function.include.php

Alle include() køres, før der med php er blevet tjekket for input. Jeg kan
derfor ikke bruge include.

Jeg kan heller ikke se på den side, hvordan jeg skal tjekke, om ID er tom
eller ej. Kan det være noget i denne retning:

<?
if (empty(ID) {
ID = "s1": /*sæt s1 som default indhold*/
}
end if;

kald til side med ID indsat som parameter /*pseudokode*/
?>

Min tilsvarende asp-kode ser sådan ud (hvis det kan give et hint):

<%
side_ID = Request.Querystring("id")
if side_ID = "" Then
side_ID = "ns1"
end if

Server.Execute(side_ID & ".inc")
%>

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Andreas M. (02-12-2005)
Kommentar
Fra : Andreas M.


Dato : 02-12-05 13:27

Erik Ginnerskov wrote:
> Michael Zedeler wrote:
>
>> http://dk.php.net/manual/en/function.include.php
>
> Alle include() køres, før der med php er blevet tjekket for input. Jeg kan
> derfor ikke bruge include.

Hvor ser du det henne?

--
Andreas M.

Erik Ginnerskov (02-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 02-12-05 13:33

Andreas M. wrote:
> Erik Ginnerskov wrote:
>> Michael Zedeler wrote:
>>
>>> http://dk.php.net/manual/en/function.include.php
>>
>> Alle include() køres, før der med php er blevet tjekket for input.
>> Jeg kan derfor ikke bruge include.
>
> Hvor ser du det henne?

Sådan er det i hvert fald i asp-verdenen. Forholder det sig anderledes i
php-verdenen?

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Henrik Stidsen (02-12-2005)
Kommentar
Fra : Henrik Stidsen


Dato : 02-12-05 13:58

Erik Ginnerskov submitted this idea :
> Sådan er det i hvert fald i asp-verdenen. Forholder det sig anderledes i
> php-verdenen?

Jeps.

<?php
if(isset($_GET["page"])) $page = $_GET["page"];
else $page = "default";

include($page.".php");
?>

Works like a charm :)

--
Henrik Stidsen - http://henrikstidsen.dk/



Peter Brodersen (02-12-2005)
Kommentar
Fra : Peter Brodersen


Dato : 02-12-05 14:16

On Fri, 02 Dec 2005 13:57:56 +0100, "Henrik Stidsen"
<nntpspam@hs235.dk> wrote:

>include($page.".php");
>?>
>
>Works like a charm :)

... inklusive stort sikkerhedshul

--
- Peter Brodersen

Henrik Stidsen (02-12-2005)
Kommentar
Fra : Henrik Stidsen


Dato : 02-12-05 14:35

Peter Brodersen pretended :
> .. inklusive stort sikkerhedshul

Det er så noget helt andet :)

--
Henrik Stidsen - http://henrikstidsen.dk/



Ulrik Nielsen (02-12-2005)
Kommentar
Fra : Ulrik Nielsen


Dato : 02-12-05 15:00

Henrik Stidsen wrote:
>
> Det er så noget helt andet :)

Det er det :)

den hurtige vej undeom er:

$x = (int) $_GET['page'];
include 'page_'.$x.'.inc.php';


--
ulrik nielsen |
-----------------+---------------------------------------------------
quote or the day | Plate voltage too low on demodulator tube
from bofh | http://www.cs.wisc.edu/~ballard/bofh/

Henrik Stidsen (02-12-2005)
Kommentar
Fra : Henrik Stidsen


Dato : 02-12-05 15:24

Ulrik Nielsen has brought this to us :
> include 'page_'.$x.'.inc.php';

Hvad med blot at lave en addslashes() på inputtet - giver lidt mere
frihed til hvad man vil kalde sine filer

--
Henrik Stidsen - http://henrikstidsen.dk/



Peter Brodersen (02-12-2005)
Kommentar
Fra : Peter Brodersen


Dato : 02-12-05 15:47

On Fri, 02 Dec 2005 15:24:05 +0100, "Henrik Stidsen"
<nntpspam@hs235.dk> wrote:

>> include 'page_'.$x.'.inc.php';
>
>Hvad med blot at lave en addslashes() på inputtet - giver lidt mere
>frihed til hvad man vil kalde sine filer

Det hjælper ikke på noget som helst. Folk kan stadigvæk angive en URL
eller en sti til et andet sted i samme system. Omend det altid kan
hjælpe at prepende include-filen før variabel-angivelsen.
--
- Peter Brodersen

Michael Zedeler (02-12-2005)
Kommentar
Fra : Michael Zedeler


Dato : 02-12-05 16:00

Peter Brodersen wrote:
> On Fri, 02 Dec 2005 15:24:05 +0100, "Henrik Stidsen"
> <nntpspam@hs235.dk> wrote:
>
>>>include 'page_'.$x.'.inc.php';
>>
>>Hvad med blot at lave en addslashes() på inputtet - giver lidt mere
>>frihed til hvad man vil kalde sine filer
>
> Det hjælper ikke på noget som helst. Folk kan stadigvæk angive en URL
> eller en sti til et andet sted i samme system.

Jeg vil gerne indrømme at jeg aldrig har tænkt det igennem - hvordan kan
man komme til det? Normalt tillader jeg aldrig "sjove" tegn i den slags
variable, så jeg har aldrig haft problemet.

> Omend det altid kan
> hjælpe at prepende include-filen før variabel-angivelsen.

$minusikrevariabel = "../../../../etc/passwd";
unlink($prefiks . "/" . $minusikrevariabel);

Ups.

Jeg ved godt at det forudsætter skriverettigheder til filen, hvilket
webserveren nok ikke har, men alligevel...

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf

Henrik Stidsen (02-12-2005)
Kommentar
Fra : Henrik Stidsen


Dato : 02-12-05 16:10

Michael Zedeler has brought this to us :
>> Omend det altid kan
>> hjælpe at prepende include-filen før variabel-angivelsen.

> $minusikrevariabel = "../../../../etc/passwd";

Og hvis koden så ser sådan her ud:

unlink("/sti/til/filer/".addslashes($input).".php");

så har jeg meget svært ved at se hvor problemet opstår ?

--
Henrik Stidsen - http://henrikstidsen.dk/



Michael Zedeler (02-12-2005)
Kommentar
Fra : Michael Zedeler


Dato : 02-12-05 17:41

Henrik Stidsen wrote:
> Michael Zedeler has brought this to us :
>
>>> Omend det altid kan
>>> hjælpe at prepende include-filen før variabel-angivelsen.
>
>> $minusikrevariabel = "../../../../etc/passwd";
>
> Og hvis koden så ser sådan her ud:
>
> unlink("/sti/til/filer/".addslashes($input).".php");
>
> så har jeg meget svært ved at se hvor problemet opstår ?

Tjaeh. Addslashes ser ikke ud til at gøre nogen forskel. Hvis jeg kører
denne her:

echo "/sti/til/fil/" . addslashes("../../../../etc/passwd");

Får jeg dette her:

/sti/til/fil/../../../../etc/passwd

Så det eneste, du har gjort, er at hælde et ".php" på. Betyder det at
alle php-filer pr. definition ikke behøver at være beskyttede, uanset
hvor de ligger?

Det kommer også an på hvad man bruger det til. Hvis jeg f. eks. laver en

exec("rm /sti/til/filer/".addslashes($input).".php");

Så kan jeg jo slette hvadsomhelst med denne her:

$minusikrevariabel = "../../../../etc/passwd; echo "

eller

$minusikrevariabel = "egern; rm /etc/passwd; echo "

Men det er måske et lidt andet emne. Desuden står der nogle guidelines
på PHPs hjemmeside om hvad man så kan gøre:

http://dk2.php.net/function.exec

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf

Henrik Stidsen (02-12-2005)
Kommentar
Fra : Henrik Stidsen


Dato : 02-12-05 18:23

Michael Zedeler laid this down on his screen :
> Så det eneste, du har gjort, er at hælde et ".php" på. Betyder det at alle
> php-filer pr. definition ikke behøver at være beskyttede, uanset hvor de
> ligger?

Næ, formålet er at du ikke skulle kunne få fat i andre filer, f.eks.
passwd filen fordi PHP vil spørge efter passwd.php

> $minusikrevariabel = "egern; rm /etc/passwd; echo "

Hmm, ja, tror lige jeg huskede forkert med hvad addslashes fangede -
men så kan man jo bruge escapeshellcmd() som nævnes på

> http://dk2.php.net/function.exec

så er man i hvert fald ude over det problem.

--
Henrik Stidsen - http://henrikstidsen.dk/



Peter Brodersen (02-12-2005)
Kommentar
Fra : Peter Brodersen


Dato : 02-12-05 16:20

On Fri, 02 Dec 2005 15:59:58 +0100, Michael Zedeler
<michael@zedeler.dk> wrote:

>> Det hjælper ikke på noget som helst. Folk kan stadigvæk angive en URL
>> eller en sti til et andet sted i samme system.
>Jeg vil gerne indrømme at jeg aldrig har tænkt det igennem - hvordan kan
>man komme til det? Normalt tillader jeg aldrig "sjove" tegn i den slags
>variable, så jeg har aldrig haft problemet.

Hvis allow_url_fopen er enabled (hvilket den ofte er), vil man blot
kunne submitte fx "http://www.eksempel.dk/fil", som så blot skal
returnere noget php-kode.

addslashes() vil ikke ændre på det eksempel. Almindelige slashes
bliver ikke escaped eller lignende.

>> Omend det altid kan
>> hjælpe at prepende include-filen før variabel-angivelsen.
>$minusikrevariabel = "../../../../etc/passwd";
>unlink($prefiks . "/" . $minusikrevariabel);

Hm, min tanke var at hvis man prependede med et filnavn (og ikke et
mappenavn), ville man ikke kunne træde tilbage, men det er
tilsyneladende alligevel tilfældet. Følgende virker fx alligevel, mod
forventning:

readfile("foo.txt/../../../etc/passwd");

--
- Peter Brodersen

Peter Brodersen (02-12-2005)
Kommentar
Fra : Peter Brodersen


Dato : 02-12-05 16:22

On Fri, 02 Dec 2005 16:20:02 +0100, Peter Brodersen
<usenet2005@ter.dk> wrote:

>>> Omend det altid kan
>>> hjælpe at prepende include-filen før variabel-angivelsen.
>>$minusikrevariabel = "../../../../etc/passwd";
>>unlink($prefiks . "/" . $minusikrevariabel);
>
>Hm, min tanke var at hvis man prependede med et filnavn (og ikke et
>mappenavn), ville man ikke kunne træde tilbage, men det er
>tilsyneladende alligevel tilfældet. Følgende virker fx alligevel, mod
>forventning:

... omend min pointe var, at man om ikke andet ikke kan sikre sig imod
at stringen ikke indledes med "http://".

>readfile("foo.txt/../../../etc/passwd");

... og den virker så uanset om foo.txt overhovedet findes eller ej.
--
- Peter Brodersen

Ulrik Nielsen (02-12-2005)
Kommentar
Fra : Ulrik Nielsen


Dato : 02-12-05 16:53

Peter Brodersen wrote:
>>readfile("foo.txt/../../../etc/passwd");
>
>
> .. og den virker så uanset om foo.txt overhovedet findes eller ej.


mon ikke denne kunne redes ved at benytte basename()

$x = basename($_GET['x']);

incluce ("sider/$x.php");

ville prøve at inkludere filen:

sider/passwd.php - og hvis den ikke findes vil siden bare fejle...

--
ulrik nielsen |
-----------------+---------------------------------------------------
quote or the day | Plate voltage too low on demodulator tube
from bofh | http://www.cs.wisc.edu/~ballard/bofh/

Peter Brodersen (02-12-2005)
Kommentar
Fra : Peter Brodersen


Dato : 02-12-05 17:02

On Fri, 02 Dec 2005 16:52:56 +0100, Ulrik Nielsen <un.spam@tiscali.dk>
wrote:

>>>readfile("foo.txt/../../../etc/passwd");
>> .. og den virker så uanset om foo.txt overhovedet findes eller ej.
>mon ikke denne kunne redes ved at benytte basename()

Joeh, hvis det er det, man vil. Jeg er ikke meget for at man kan
fremprovokere php-fejl på den måde, der blandt andet giver oplysninger
om filstruktur og muligt brugernavn.

--
- Peter Brodersen

Michael Zedeler (02-12-2005)
Kommentar
Fra : Michael Zedeler


Dato : 02-12-05 17:33

Peter Brodersen wrote:

>>readfile("foo.txt/../../../etc/passwd");
>
> .. og den virker så uanset om foo.txt overhovedet findes eller ej.

Jeg plejer bare at

if(ereg("[^A-z0-9]", $min_usikre_sti)) {
   < farvel >
}
$min_sikre_sti = "/sti/til/ting/man/må/pille/ved/$min_usikre_sti";

Man kan eventuelt stoppe en slash ind i det regulære udtryk, hvis der
skal være mulighed for at vælge underbiblioteker (idet "abc/def" ~
"abd//def" ~ "abc///def" ~ ...).

Mit tankesæt er, at hvis man får noget, der er mærkeligere end at det
passer på det regulære udtryk, så er der nok alligevel noget galt.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf

Peter Brodersen (02-12-2005)
Kommentar
Fra : Peter Brodersen


Dato : 02-12-05 17:56

On Fri, 02 Dec 2005 17:32:36 +0100, Michael Zedeler
<michael@zedeler.dk> wrote:

>if(ereg("[^A-z0-9]", $min_usikre_sti)) {
>   < farvel >
>}

Spændende - så tillader du også bl.a. \ og `

Uanset hvad så foretrækker jeg whitelists. Eller i det mindste et
file_exists()-tjek før man ukritisk affyrer include()-bomben.

--
- Peter Brodersen

Michael Zedeler (02-12-2005)
Kommentar
Fra : Michael Zedeler


Dato : 02-12-05 18:13

Peter Brodersen wrote:
> On Fri, 02 Dec 2005 17:32:36 +0100, Michael Zedeler
> <michael@zedeler.dk> wrote:
>
>
>>if(ereg("[^A-z0-9]", $min_usikre_sti)) {
>>   < farvel >
>>}
>
> Spændende - så tillader du også bl.a. \ og `

Ja. Der er faktisk en grummer fejl. Gad vide hvor mange steder, jeg skal
rundt og rette den. Der skulle stå

if(ereg("[^A-Za-z0-9]", $min_usikre_sti)) {
   < farvel >
}

I perl (som er det jeg bruger mest) skriver jeg \w, så mon problemet er
så stort...? Hmmm... Iøvrigt burde man også kunne skrive

if(ereg("[^[:word:]]", $min_usikre_sti)) {
   < farvel >
}

> Uanset hvad så foretrækker jeg whitelists.

Ditto her.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf

Erik Ginnerskov (02-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 02-12-05 22:29

Michael Zedeler, Peter Brodersen, Ulrik Nielsen and others wrote a lot, of
which I didn't understand much:

Efter Henriks forslag har jeg afprøvet dette:

<?php
if(isset($_GET["page"])) $page = $_GET["page"];
else $page = "s1";

include($page.".inc");
?>

Det fungerer. Når jeg efterfølgende i browserens adresselinje indtaster
navnet på den side, koden er skrevet i, uden at angive en parameter,
indlæses siden med del s1 inkluderet.

Skriver jeg i adresselinjen (eller i et link på en anden side) sidens navn
og tilføjer en kendt parameter, indlæses den udpegedede delside:

<a href="sidenavn.php?page=s2">Linktekst</a>

Hvad er det så, I siger kan gå galt og hvordan kan jeg forebygge det?

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Michael Zedeler (02-12-2005)
Kommentar
Fra : Michael Zedeler


Dato : 02-12-05 23:07

Erik Ginnerskov wrote:
> Michael Zedeler, Peter Brodersen, Ulrik Nielsen and others wrote a lot, of
> which I didn't understand much:
>
> [klip]

Ja. Det virker sådan set.

> Hvad er det så, I siger kan gå galt og hvordan kan jeg forebygge det?

Der er et sikkerhedsproblem, fordi brugeren selv kan vælge hvilken fil,
der skal inkluderes. Også fra andre kataloger på din server.

Du bør skifte

if(isset($_GET["page"])) $page = $_GET["page"];

ud med

if(isset($_GET["page"]) && ereg("[^A-Za-z0-9]", $_GET["page"])) $page =
$_GET["page"];

Så kan man i det mindste ikke få lov til at snuse omkring i andre kataloger.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf

Erik Ginnerskov (03-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 03-12-05 00:43

Michael Zedeler wrote:
> Erik Ginnerskov wrote:

> Du bør skifte
>
> if(isset($_GET["page"])) $page = $_GET["page"];
>
> ud med
>
> if(isset($_GET["page"]) && ereg("[^A-Za-z0-9]", $_GET["page"])) $page
> = $_GET["page"];
>
> Så kan man i det mindste ikke få lov til at snuse omkring i andre
> kataloger.

Til gengæld holder det op med at fungere overhovedet. Der bliver godt nok
skrevet i adresselinjen, at man har bedt om et andet sideindhold, men det
bliver ikke indlæst. ;(

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Michael Zedeler (03-12-2005)
Kommentar
Fra : Michael Zedeler


Dato : 03-12-05 01:00

Erik Ginnerskov wrote:
> Michael Zedeler wrote:
>
>>Erik Ginnerskov wrote:
>
>>Du bør skifte
>>
>>if(isset($_GET["page"])) $page = $_GET["page"];
>>
>>ud med
>>
>>if(isset($_GET["page"]) && ereg("[^A-Za-z0-9]", $_GET["page"])) $page
>>= $_GET["page"];
>>
>>Så kan man i det mindste ikke få lov til at snuse omkring i andre
>>kataloger.
>
> Til gengæld holder det op med at fungere overhovedet. Der bliver godt nok
> skrevet i adresselinjen, at man har bedt om et andet sideindhold, men det
> bliver ikke indlæst. ;(

Jamen så virker sikkerhedsforanstaltningen jo

Spøg til side - regexen tillader kun navne med tegnene A-Z, a-z og 0-9.
Hvis du bruger andet, vil det blive afvist. Hvad sætter du parameteren
"page" til?

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf

Erik Ginnerskov (03-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 03-12-05 01:06

Michael Zedeler wrote:

> Jamen så virker sikkerhedsforanstaltningen jo
>
> Spøg til side - regexen tillader kun navne med tegnene A-Z, a-z og
> 0-9. Hvis du bruger andet, vil det blive afvist. Hvad sætter du
> parameteren "page" til?

Jeg har inkluderingsfilerne s1.inc, s2.inc og s3.inc. Jeg har mine links til
skift af sideindhold udformet sådan:

<a href="sidenavn.php?page=s1" class="tlink">side 1</a>
<a href="sidenavn.php?page=s2" class="tlink">side 2</a>
<a href="sidenavn.php?page=s3" class="tlink">side 3</a>

Ved klik på link, der skulle skifte sideindhold, sker kun ændringen i
adresselinjen. Det indhold, som er indlæst, bliver bibeholdt.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Erik Ginnerskov (04-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 04-12-05 23:48

Michael Zedeler wrote:

> Der er et sikkerhedsproblem, fordi brugeren selv kan vælge hvilken
> fil,
> der skal inkluderes. Også fra andre kataloger på din server.

Det har fået mig til at tænke på, hvis nu jeg i stedet fik defineret en
række mulige lovlige inkluderingsfiler og tjekket, at inputparameteren
svarer til en af dem - og hvis ikke, inkluderes den defaulte fil.
Pseudokode:

<?
if ($_GET["page"]) er forskellig fra "s1", "s2", "s3"; /* o.s.v. */
$page = "s1";
include($page.".inc");
?>

Kunne man gøre det på den måde, ville det ikke kunne misbruges.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Henrik Stidsen (05-12-2005)
Kommentar
Fra : Henrik Stidsen


Dato : 05-12-05 00:27

Erik Ginnerskov wrote on 04-12-2005 :
> Kunne man gøre det på den måde, ville det ikke kunne misbruges.

Men dynamikken går lidt fløjten af det - så kunne man ligeså godt lægge
det hele i en database.

--
Henrik Stidsen - http://henrikstidsen.dk/



Bertel Lund Hansen (05-12-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-12-05 00:34

Erik Ginnerskov skrev:

> Det har fået mig til at tænke på, hvis nu jeg i stedet fik defineret en
> række mulige lovlige inkluderingsfiler og tjekket, at inputparameteren
> svarer til en af dem - og hvis ikke, inkluderes den defaulte fil.

Det var præcis hvad mit svar til dig indeholdt:

<news:1oc02rolvv928$.1wpi91wln89xv$.dlg@40tude.net>

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (05-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 05-12-05 00:55

Bertel Lund Hansen wrote:

>> Det har fået mig til at tænke på, hvis nu jeg i stedet fik defineret
>> en række mulige lovlige inkluderingsfiler og tjekket, at
>> inputparameteren svarer til en af dem - og hvis ikke, inkluderes den
>> defaulte fil.
>
> Det var præcis hvad mit svar til dig indeholdt:
>
> <news:1oc02rolvv928$.1wpi91wln89xv$.dlg@40tude.net>

Jeg forstår ikke lige din kode. Men jeg må prøve at kigge nærmere på koden
igen. Hvis jeg eksperimenterer med den, kan det være, at jeg fatter det.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Bertel Lund Hansen (05-12-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-12-05 01:22

Erik Ginnerskov skrev:

> Jeg forstår ikke lige din kode. Men jeg må prøve at kigge nærmere på koden
> igen.

<?

$sider = array (
   'scorer' => 'Scorer',
   'beter' => 'Beter',
   'doblinger' => 'Doblinger',
   );
}

Jeg opretter et array med to elementer pr. post: et filnavn og en
overskrift. Til filen scorer.inc svarer posten

      'scorer' => 'Scorer',

Tegnet => bruges ved en særlig type array (associativt array),
men det betyder blot at 'scorer' og 'Scorer' knyttes sammen som
en post (med to elementer). Dette array indeholder min menuliste
(den rigtige er dog længere).

// Sørg for at siden "scorer" vises
// hvis der er noget som helst kludder med filnavnet:
$code='scorer'; $title=$sider[$code];

Jeg bruger $code til at holde rede på hvilken side der er bedt
om. Derfor sætter jeg den allerførst til at pege på 'scorer' og
sætter den tilsvarende overskrift (og titel). Hvis resten går
galt, ved jeg at siden scorer.inc' vil blive vist.

$order=$_GET['page'];

Her henter jeg så parametern fra adresselinjen. Jeg har valgt at
bruge variabelnavnet "page", og det er så også det der skal
bruges i linket som det vil fremgå senere.

if (isset($sider[$order])) {
   $code=$order;
   $title=$sider[$order];
}

Her tjekkes det at den bestilte side findes i mit array. Kun hvis
det er tilfældet, får den lov at erstatte standardsiden

$content=$code.'.inc';

Og her blev så det færdige filnavn dannet. Jeg har nemlig valgt
at kalde alle de inkluderede sider for .inc til efternavn.

?>

Så lukker jeg for PHP-delen og laver en almindelig HTML-side med
<head> og starten på <body> indtil jeg skal have genereret min
menu:

<?
   // Menu
   print "<div class='bridgemenu'>";
   foreach($sider as $key => $entry) {
      print "<p class='menupunkt'>";
      if ($code==$key) print $entry;
      else print "<a href='?page=$key'>$entry</a>";
      print "</p>\n";
   };
   print "\n </div>\n";

"Foreach" laver et automatisk gennemløb af et array. Det er
hurtigt og bør foretrækkes nå det kan bruges. Man skal dog huske
at det producerer en *kopi* af elementerne, så hvis de skal
ændres under gennemløbet, skal man lave en anden slags løkke. Men
jeg kan godt nøjes med en kopi. Med parentesen:

($sider as $key => $entry)

bestemmer jeg at postens elementer skal hedde key$ og $entry. De
skifter værdi for hvert gennemløb. Hvis $key er magen til $code,
så er det den aktuelle side, og den skrives som almindelig tekst.
Alle de andre skrives som links. Bemærk "?page=" som jo er den
måde man angiver en parameter.

   // Efter menuen hentes den valgte sides indhold:
   include($content);

Her blev indholdet inkluderert. Det ligger inden i en div.

?>

Og så lukker jeg PHP og danner afslutningen på siden i almindelig
HTML - eller noget mere PHP hvis det er nødvendigt.

> Hvis jeg eksperimenterer med den, kan det være, at jeg fatter det.

Den forudsætter at de angivne filer findes.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (05-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 05-12-05 01:28

Bertel Lund Hansen wrote:

En lang og grundig forklaring. Jeg takker. Det burde gøre det lidt lettere
at få det til at virke - hvis jeg ikke er alt for tungnem. ;)

> Den forudsætter at de angivne filer findes.

Naturligvis.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Bertel Lund Hansen (02-12-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 02-12-05 19:01

Erik Ginnerskov skrev:

> Neg har netop fået dynamisk include til at fungere i asp og har derfor fået
> blod på tanden. Nu vil jeg gerne have det til at køre i php også.

Her er noget kode jeg bruger.Arrayet indeholder et filnavn (uden
efternavn) plus en tekst der bruges som menutekst og overskrift.

$sider = array (
   'scorer' => 'Scorer',
   'beter' => 'Beter',
   'doblinger' => 'Doblinger',
   );
}

// Sørg for at siden "scorer" vises
// hvis der er noget som helst kludder med filnavnet:
$code='scorer'; $title=$sider[$code];
$order=$_GET['page'];
if (isset($sider[$order])) {
   $code=$order;
   $title=$sider[$order];
}
$content=$code.'.inc';

Derefter følger der en del almindelig HTML-kode (uden for <? ?>)
og så kommer menugenereringen:

<?
   // Menu
   print "<div class='bridgemenu'>";
   foreach($sider as $key => $entry) {
      print "<p class='menupunkt'>";
      if ($code==$key) print $entry;
      else print "<a href='?page=$key'>$entry</a>";
      print "</p>\n";
   };
   print "\n </div>\n";

   // Efter menuen hentes den valgte sides indhold:
   include($content);
?>

Testen inde i løkken sørger for at det aktuelle menupunkt ikke er
et link og blot står med den almindelige skrift. Hvis $code og
$key er ens, så er det pågældende indhold allerede valgt og vist.

Det er samme styring jeg bruger på Fiduos sider hvor du kan se
hvordan det virker.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (05-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 05-12-05 02:01

Bertel Lund Hansen wrote:

> $sider = array (
> 'scorer' => 'Scorer',
> 'beter' => 'Beter',
> 'doblinger' => 'Doblinger',
> );
> }

Mangler der ikke en { et eller andet sted der?

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Erik Ginnerskov (05-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 05-12-05 02:10

Erik Ginnerskov wrote:

>> $sider = array (
>> 'scorer' => 'Scorer',
>> 'beter' => 'Beter',
>> 'doblinger' => 'Doblinger',
>> );
>> }
>
> Mangler der ikke en { et eller andet sted der?

Nej, der er en } for meget.

Tak Berthel, det fungerer nu.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Bertel Lund Hansen (05-12-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-12-05 02:21

Erik Ginnerskov skrev:

> Nej, der er en } for meget.

Ja, jeg klippede i noget kode og fik en parentes for meget med.

> Tak Berthel, det fungerer nu.

Glimrende - bortset fra stavningen af mit navn ...

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (05-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 05-12-05 02:24

Bertel Lund Hansen wrote:

> Glimrende - bortset fra stavningen af mit navn ...

Pardon. Jeg har i mange år haft en kollega, der havde et h med i navnet, så
det lå 'lissom' i fingrene at skrive det på den måde.

Bertel Bertel Bertel Bertel - nu ka' jeg. ;)

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Erik Ginnerskov (05-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 05-12-05 17:52

Bertel Lund Hansen wrote:

> $sider = array (
> 'scorer' => 'Scorer',
> 'beter' => 'Beter',
> 'doblinger' => 'Doblinger',
> );
> $code='scorer'; $title=$sider[$code];
> $order=$_GET['page'];
> if (isset($sider[$order])) {
> $code=$order;
> $title=$sider[$order];
> }
> $content=$code.'.inc';
> ?>

Hvis jeg nu vil genbruge det andet led i array'et i en <hx><? echo $str....;
?></hx>

Hvad er det så for en størrelse, jeg skal bruge der?

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Bertel Lund Hansen (06-12-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 06-12-05 14:22

Erik Ginnerskov skrev:

>> $code='scorer'; $title=$sider[$code];
>> $order=$_GET['page'];
>> if (isset($sider[$order])) {
>> $code=$order;
>> $title=$sider[$order];
>> }
>> $content=$code.'.inc';
>> ?>

> Hvis jeg nu vil genbruge det andet led i array'et i en <hx><? echo $str....;
> ?></hx>
> Hvad er det så for en størrelse, jeg skal bruge der?

Det er $title. Den sætter jeg til det andet element, og det er
det jeg bruger som både titel og overskrift.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (06-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 06-12-05 23:57

Bertel Lund Hansen wrote:
>> Hvis jeg nu vil genbruge det andet led i array'et i en <hx><? echo
>> $str....;
>>> </hx>
>> Hvad er det så for en størrelse, jeg skal bruge der?
>
> Det er $title. Den sætter jeg til det andet element, og det er
> det jeg bruger som både titel og overskrift.

Den har jeg bl.a. prøvet, jeg har lavet linjen sådan:

<hx><? echo $titel; ?></hx>

Så får jeg en fejlmelding udskrevet på siden:

Notice: Undefined variable: titel in C:\Dokumenter\hjs\kladde1\html\s1.inc
on line 1

Jeg har også prøvet at kopiere indhold af $key over i en ny variabel
$subheader på det tidspunkt i loopet, hvor det er kommet til aktuelle linje
i array'et:

if ($code==$key) print $entry;
$subheader = $entry;

.... med det formål at kunne bruge $subheader i overskriften. Det giver en
parse error:

Parse error: parse error, unexpected T_ELSE in
C:\Dokumenter\hjs\kladde1\html\dynphp.php on line 52

.... og ingen side overhovedet.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Bertel Lund Hansen (07-12-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 07-12-05 00:23

Erik Ginnerskov skrev:

>> Det er $title. Den sætter jeg til det andet element, og det er
>> det jeg bruger som både titel og overskrift.

> Den har jeg bl.a. prøvet, jeg har lavet linjen sådan:

> <hx><? echo $titel; ?></hx>

> Notice: Undefined variable: titel in C:\Dokumenter\hjs\kladde1\html\s1.inc
> on line 1

Velkommen i klubben. "Titel" er dansk - "title" er engelsk.
Variablen hedder $title (eng.).

> Jeg har også prøvet at kopiere indhold af $key over i en ny variabel
> $subheader på det tidspunkt i loopet, hvor det er kommet til aktuelle linje
> i array'et:

> if ($code==$key) print $entry;
> $subheader = $entry;
>
> ... med det formål at kunne bruge $subheader i overskriften. Det giver en
> parse error:

> Parse error: parse error, unexpected T_ELSE in
> C:\Dokumenter\hjs\kladde1\html\dynphp.php on line 52

> ... og ingen side overhovedet.

Det er klart. Du griber forkert ind i en if-blok. De opfører sig
således i programmeringssprog af C-typen:

1.   if (betingelse) handling;

2.   if (betingelse) handling;
   else anden_handling;

3.   if (betingelse) handling;
   indskudt_handling;
   else anden_handling; // !!! Ballade !!! Her kommer et else uden
en umiddelbart forudgående if-sætning.

En handling kan godt bestå af flere sætninger (uendeligt mange
faktisk). Så skal det bare markeres at det er en blok, og det
bruger man {} til:

1a. if (betingelse) {
   handling;
   der;
   består;
   af;
   flere;
   sætninger;
}

På samme måde kan de øvrige eksempler udvides.

3a. if (betingelse) {
   handling;
   indskudt_handling;
}
else anden_handling; // Nu kommer else umiddelbart efter
if-blokken.


Her er den korrekte måde at lave din kode på (men den er
overflødig som du vil se senere):

if ($code==$key) {
   print $entry;
   $subheader = $entry;
}


Hvis du har brug for en underoverskrift, ville det nok være mere
elegant med et andet array:

$side = array (
   array ('scorer', 'Scorer', 'Scoreunderoverskrift'),
   array ('beter', 'Beter', 'Beterunderoverskrift'),
   ...
);

men så skal koden laves ret meget om fordi det så ikke længere er
et associativt array.

Som det er nu, kan du imidlertid bruge $title i stedet for midt i
løkken at finde den samme streng og gemme den i $subheader.
Princippet er imidlertid godt nok - det sker jævnligt at man kun
har adgang til en værdi mens en løkke kører, og så må man huske
den på samme måde som du havde tænkt (men kodet forkert)..

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (07-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 07-12-05 00:37

Bertel Lund Hansen wrote:

>> Notice: Undefined variable: titel in
>> C:\Dokumenter\hjs\kladde1\html\s1.inc on line 1
>
> Velkommen i klubben. "Titel" er dansk - "title" er engelsk.
> Variablen hedder $title (eng.).

Dooooo. Selvfølgelig.

>> Jeg har også prøvet at kopiere indhold af $key over i en ny variabel
>> $subheader på det tidspunkt i loopet, hvor det er kommet til
>> aktuelle linje i array'et:
>
>> if ($code==$key) print $entry;
>> $subheader = $entry;

> if ($code==$key) {
> print $entry;
> $subheader = $entry;
> }
>

Det var bare den dumme {}, jeg havde glemt

> Hvis du har brug for en underoverskrift, ville det nok være mere
> elegant med et andet array:

Det er ikke som sådan en underoverskrift. Men øverst på den inkluderende
side er i forvejen en overskrift, der ikke påvirkes af, hvad der bliver
inkluderet på siden. Derfor navngav jeg variablen sådan.

> Som det er nu, kan du imidlertid bruge $title i stedet for midt i
> løkken at finde den samme streng og gemme den i $subheader.
> Princippet er imidlertid godt nok - det sker jævnligt at man kun
> har adgang til en værdi mens en løkke kører, og så må man huske
> den på samme måde som du havde tænkt (men kodet forkert)..

Nu har jeg fået det til at virke på begge måder. Takker.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Bertel Lund Hansen (07-12-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 07-12-05 10:00

Erik Ginnerskov skrev:

>> Variablen hedder $title (eng.).

> Dooooo. Selvfølgelig.

Prøv at designe en hjemmeside med
<titel>Bertels hjemmeside</titel>
i <head>.

Det virker sgu ikke!

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408526
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste