Seite 1 von 2

Include von Datei verhindern wenn ...

Verfasst: 27.07.2004 20:06
von exweised
Hallo,

ich habe mal wieder ein kleines Anliegen. :D Ich habe eine Navigationsleiste mit bestimmten Themen. Jedes Thema soll ein bestimmtes Menü mit anderer Indexseite öffnen. In diesem Menü sind natürlich weitere Links zu diesem Thema.
Es soll Anhand der Adresszeile auch ersichtlich sein, welches Menü und welche Seite geöffnet ist. Das habe ich so gelöst:

Indexseite = index.php
Menü 1 & Indexseite = index.php?list=1
Menü 1 & andere 1. Link daraus = index.php?list=1&path=link1
Menü 1 & andere 2. Link daraus = index.php?list=1&path=link2
Menü 2 & Indexseite = index.php?list=2
Menü 2 & andere 1. Link daraus = index.php?list=2&path=link1
...

Der Code in der index.php dafür sieht so aus:

Code: Alles auswählen

if ($_GET["list"] == "1") include("index_1.php");

if ($_GET["list"] == "1" && $_GET["path"] == "link1") include("index_1_seite_1.php"); 
if ($_GET["list"] == "1" && $_GET["path"] == "link2") include("index_1_seite_2.php");

if ($_GET["list"] == "2") include("index_2.php");

if ($_GET["list"] == "2" && $_GET["path"] == "link1") include("index_2_seite_1.php");

... 

if (!isset($_GET["list"]) && !isset($_GET["path"])) include("index.php");
Das Funktioniert auch soweit schon. Wenn jetzt die index.php offen ist, wird mir die Hauptseite angezeigt. Klicke ich in der Navigation auf ein Menü, wird ja index.php?list=1 geöffnet und index_1.php includet. Klicke ich jetzt in diesem Menü auf ein weiteren Link, soll ja index.php?list=1&path=link1 die index_1_seite_1.php includet werden. Leider bleibt aber auch die Indexseite vom Menü (index_1.php) geöffnet und das soll nicht so sein.

Ich hoffe, ich habe es verständlich geschrieben und ihr könnt mir auch helfen. ;)

Verfasst: 27.07.2004 22:03
von k-5
die ifs anders strukturieren wäre sinnvoll ..

Code: Alles auswählen

if ($_GET["list"] == "1")  { 

if ( $_GET["path"] == "link1") include("index_1_seite_1.php"); 
else if ( $_GET["path"] == "link2") include("index_1_seite_2.php"); 
else include("index_1.php"); 

}
ich erhebe aber keinerlei anspruch drauf das das die perfekte lösung ist ..

allgemein würd ich dazu sagen .. sau umständliche wartung .. extrem unkomfortabel .. aber wenn es fest bleiben kann .. lass es so ..

Verfasst: 28.07.2004 12:08
von exweised
Danke schön, jetzt funktioniert das. ;)

Weil das ja nun "Sau umständlich" ist, was kannst du mir denn für Tipps geben es besser oder ganz anders zu machen?

Verfasst: 28.07.2004 14:55
von Blutgerinsel
exweised hat geschrieben:Danke schön, jetzt funktioniert das. ;)

Weil das ja nun "Sau umständlich" ist, was kannst du mir denn für Tipps geben es besser oder ganz anders zu machen?
Zugegeben dein Code ist dermaßen unübersichtlich und teilweise auch unsinnig. Zu mal du dir durch einen ersteren Ausschluss bereits Zeit beim Parsen sparen kannst......

dein Bsp:

Code: Alles auswählen

if ($_GET["list"] == "1") include("index_1.php"); 

if ($_GET["list"] == "1" && $_GET["path"] == "link1") include("index_1_seite_1.php"); 
if ($_GET["list"] == "1" && $_GET["path"] == "link2") include("index_1_seite_2.php");
Wenn du hier bereits machst:

Code: Alles auswählen

if ($_GET["list"] == 1) 
  {
    if ($_GET["path"] == 40) include("index_1_seite_1.php"); 
    if ($_GET["path"] == 30) include("index_1_seite_2.php");
  }
elseif ($_GET["list"] == 2) 
  {
    if ($_GET["path"] == 40) include("index_1_seite_1.php"); 
    if ($_GET["path"] == 30) include("index_1_seite_2.php");
  }
Wäre hier $_GET["list"] == 2 würde bereits in der ersten if Bedingung am anfang der Zeiger auf $_GET['list'] == 2 springen!
Da in die weiteren Bedingungen in der IF nicht mehr interessieren!


Dennoch ist dieser Art und Weise zu Verzweigen für Seiten einbinden unübersichtlich.
Idealerweise könntest du Switch verwenden. Ist von der Zeitdauer noch schneller .

Sehr gut das du $_GET verwendest :wink:

Verfasst: 28.07.2004 14:58
von k-5
naja .. etwas allgemeiner formulieren z.b. ..
das du nicht für jeden neuen link .. den php code ändern darfst ..

so ähnlich mach ich des ..

if( isset($_GET['site'] ) include "dir/".$_GET['site'].'.php';
else include 'dir/home.php';

(die unterpunkte verlinke ich dann erst von der includierten seite ..)
(natürliche gehören noch paar sicherheitsabfragen dazu .. um nur vorhanden dateien einzubinden .. und auch nur die im verzeichnis zuzulassen)

Verfasst: 28.07.2004 15:08
von Blutgerinsel
k-5 hat geschrieben:naja .. etwas allgemeiner formulieren z.b. ..
das du nicht für jeden neuen link .. den php code ändern darfst ..

so ähnlich mach ich des ..

if( isset($_GET['site'] ) include "dir/".$_GET['site'].'.php';
else include 'dir/home.php';

(die unterpunkte verlinke ich dann erst von der includierten seite ..)
(natürliche gehören noch paar sicherheitsabfragen dazu .. um nur vorhanden dateien einzubinden .. und auch nur die im verzeichnis zuzulassen)
hab ich vergessen zu erwähnen :wink:

Nunja dein Bsp.: ist generell schlecht......
Da man Files nicht direkt über den kommen parameter included in diesem Fall sind sehr sehr weitreichende Prüfungen notwendig sonst kann ich mit Leichtigkeit den Server manipulieren....
Hoffe für dich das dies gut gemacht wurde :wink:

P.S.: Konstanten schreibt man i.R. gross aus übersichtsgründen und gemäß PHP Code Style Guide

Verfasst: 28.07.2004 15:10
von Blutgerinsel
Nachtrag: Für eine vernünftige Navigation sollte man DB Nested Sets verwenden.

Verfasst: 28.07.2004 15:16
von k-5
naja .. n check auf '/' .. und ein file_exists() .. sollte meiner ansicht nach reichen ..

nested sets sind natürlich auch ne lösung

Verfasst: 28.07.2004 17:21
von exweised
Blutgerinsel hat geschrieben:Sehr gut das du $_GET verwendest :wink:
Ist das jetzt Ironie?
Blutgerinsel hat geschrieben:Für eine vernünftige Navigation sollte man DB Nested Sets verwenden.
Kannst du mir mehr davon erzählen? Warum das (Vorteile)?
k-5 hat geschrieben:naja .. n check auf '/' .. und ein file_exists() .. sollte meiner ansicht nach reichen ..
Also, ein file_exists() ist mit drin. :wink: Was meinst mit '/'?

Verfasst: 28.07.2004 18:01
von Blutgerinsel
exweised hat geschrieben:Ist das jetzt Ironie?
Nein keineswegs sondern ein Lob ! :wink:
wenn magic_quotes_gpc off ist rappelt es an so gut wie überall da nicht jede Variabel vorneweg global ist! Und diese Array wurde nicht umsonst ins Leben gerufen. Macht das arbeiten ungemein einfacher.....
exweised hat geschrieben:Kannst du mir mehr davon erzählen? Warum das (Vorteile)?
Stell dir vor du möchtest eine tiefgehende Navigation mit Kategorien.Sub Kategorien. etc. Ein wesentlicher Vorteil ist das man dies die DB erledigen lassen kann. Gibt hierfür auch spezielle Klassen. Wobei man dies auch selbst nachbauen könnte sofern der Webhoster dieses Modul nicht bereitstellt. Weitere Infos findest hier oder in diesem Forum wenn du die Suchenfunktion benützst oder gezielt dann fragst
exweised hat geschrieben:Also, ein file_exists() ist mit drin. :wink: Was meinst mit '/'?
/ stellt den Root dar...Würde ich derartiges includen würde ich auf den Rootbereich des Servers gelangen.......Aber für solche bedient man sich regular Expressions