Wie include für Unternavigationsaufruf erstellen?

Hallo zusammen,

wie kann ich eine PHP-Datei inkludieren, die von einer Unternavigation aufgerufen wird? Denn klicke ich auf einen Unternav-Link, verschwindet die Hauptnav und nur Unternav und Inhalt werden angezeigt.

Folgendes Codebeispiel:

Hauptnavigation
Inkludierte PHP-Datei, die durch Hauptnav aufgerufen wird und folgende DIVs enthält:
Unternavigation
Inkludierte PHP-Datei, die durch Unternav aufgerufen wird.

Links für Unternav sehen z. B. so aus:
Infos zum allgemeinen Bereich (ALT+5)

Zum Inkludieren verwende ich folgenden Code, den ich in einem Forum gefunden habe:

<?php if (isset($_GET['section'])){ $site=$_GET['section']; } else {$site='dsmainintro.php'; #Standardseite, falls kein Parameter ünergeben wurde } if (file_exists('./'.$site)) {include './'.$site; } else {echo 'Fehler 404: Die Datei .$site wurde leider nicht gefunden :('; } ?>

Vielen Dank schon mal für Eure Hilfe.

Sicherheitshinweis:
bei $site solltest du zumindest Zeichen wie ‘/’ durch Zeichen wie ‘!’ oder ‘?’ etc ersetzen,
damit man da nicht über eine solche Sicherheitslücke beliebigen Inhalt reinbasteln kann.

Ansonsten mußt du anhand der aufgerufenen URI und er übergebenen Parameter
entscheiden, was passieren soll - wenn ein Parameter nicht reicht, muß du gegebenenfalls
mehrere übergeben, um zu entscheiden, wie die Seite aufgebaut wird.
Dazu wird man das PHP letztlich eher so strukturieren, daß man ganz zu Beginn erst mal
per Skript die GET-Parameter ausließt und analysiert, was überhaupt passieren soll.
Und wenn das komplett klar ist, beginnt man erst mit einer Ausgabe.

#position ist übrigens bei deinem Beispiel ein Fragmentidentifzierer, den wertet nur der browser
aus, das wird also nicht an den server zur Auswertung per PHP übergeben.

Hallo Hoffmann,

schon mal vielen Dank für den Sicherheitshinweis. Da ich von PHP nicht wirklich Ahnung habe, hab ich drei Fragen:

1 Wo siehst Du die /-Zeichen? Im Code sind keine drin.
2 Falls Du den Inhalt von $site meinst: Wie kann ich da was maskieren und warum ist das eine Sicherheitslücke?
3 Wie muss ich genau vorgehen, um nach dem Anklicken eines Unternav-Links die Hauptnav und Unternav zu behalten und die mit dem Unternav-Link aufgerufene Seite zu erhalten?

Oder muss der Link in der Unternav so aussehen und mit PHP entsprechend ausgewertet werden:
Infos zum allgemeinen Bereich

#position hab ich nur angegeben, damit die Screenreadersoftware nach dem Aufruf des Links dort hin springt.

Hinsichtlich des Sicherheitsproblems:
Ich meine, hier ist eine Funktion gesperrt, mit der man auch Dateien von entfernten Rechnern
einbinden kann, von daher ist das Risiko ohnehin begrenzt.
Da du aber per GET-Parameter den Dateinamen übergibst, kann ein neugieriger Mensch
sowas wie “dstabmainsite.php?section=/privat/.htaccess” oder so als URI eingeben - und
sofern es die Datei gibt, wird dann der Inhalt ausgegeben, was man vielleicht nicht immer
will - die ‘/’ kommen also von einem potentiellen Angreifer, der was wissen will, was du an sich
nicht verraten möchtest.

Z.B. mit str_replace kann man Zeichenketten durch andere ersetzen, gibt aber natürlich auch
andere Möglichkeiten.

Was du genau machen mußt, damit sich die Ausgabe so ergibt, wie du sie haben willst, hängt
entscheidend davon ab, wie die Struktur deines Skriptes ist und was du genau haben willst.
Da ich mir nicht so ganz sicher bin, ob ich das wirklich verstehe, versuche ich mal nur einen
Weg zu erklären, der häufiger auftritt:
Du hast Dokumentfragmente zu einem Untermenü und den eigentlichen Inhalt, wobei Art
des Untermenüs und Inhalt beliebig kombinierbar sein sollen.
Das kann man realisieren mit Verweisen, die einen GET-Parameter für den Inhalt und einen
für das Untermenü haben:

Menü 2 und Inhalt 7

In der URI selbst wird das zu ‘index.php?menue=u2&inhalt=i7’, das & trennt mehrere
Parameter voneinander, muß aber natürlich als Attributwert von href maskiert werden.

Für die Menüs hälst du die Fragmente etwa im Verzeichnis ‘menue’ vor, für den inhalt in Inhalt.

Dann mußt du in index.php also erstmal die Parameter auslesen:
if (isset($_GET[‘menue’])){
$menue=$_GET[‘menue’];
}
else
{
$menue=u1;
}

f (isset($_GET[‘inhalt’])){
$inhalt=$_GET[‘inhalt’];
}
else
{
$inhalt=i1;
}

Dann kommt ein Teil, wo du den GET-Parameter auf Sicherheitsprobleme untersuchst und
daraus dann Dateinamen zusammenbastelst, also etwa für $inhalt=‘i7’ eine Variable mit
einem existierenden Dateinamen
$welcherInhalt='inhalt/i7.inc’
entsprechend etwa für $menue=‘u2’ sowas wie $welchesMenue=‘menue/u2.inc’

An passender Stelle in index.php bindest du das dann eben ein:
include $welcherInhalt;
und für das Menü an passender Stelle
include $welchesMenue;

Wenn du andererseits immer eindeutig weist, welches Menü zu welchem Inhalt gehört,
brauchst du natürlich nur einen Parameter für den Inhalt, an dem du ablesen kannst, zu
welchem Menü der gehört - man könnte die GET-Parameter etwa so strukturieren, daß
man sowas eingibt wie
Menü 2 und Inhalt 7

Zum Inhalt ‘inhalt/u2i7.inc’ gehört dann eben immer das Menü ‘menue/u2.inc’ und man
kann die beiden dann irgendwo per include einbinden.
Dazu muß man mit den entsprechenden Funktionen von PHP die Zeichenkette 'u2i7’
analysieren.

Alternativen, um solche Korrelationen festzuhalten könnten auch in arrays stehen, wo dann
eben den Inhaltsnamen Menünamen zugeordnet sind, wo man dann einfach nachguckt,
welches Menü man nehmen muß. Da muß man dann keine Zeichenketten analysieren,
man muß nur sicherstellen, daß zu jedem Inhalt ein Menü im array zu finden ist.

Wenn du ferner immer gleiche Inhalte hast, etwa wie das Hauptmenü, Kopf und Fuß,
pappst du das entweder direkt in die index.php oder bindest sie an entsprechender Stelle
per include ein. Was da sinnvoller ist, hängt davon ab, wie komplex und umfangreich
das Projekt ist oder mal werden könnte und wie groß die Wahrscheinlichkeit ist, daß man in
verschiedenenen Dateien später mal gleiche Inhalte ändern will.

Wenn du statt solch nichtssagender Namen wie u2 und i7 sinnvollere verwendest, ist das ein
guter Ansatz, um was wiederzufinden, das macht dann gegebenenfalls die Auswertung etwas
komplizierter - auch das kann man kombinieren, indem man per array dem einen das andere
zuordnet.