FAQ Suchen Synapsis Wiki Projekte Mitgliederliste Benutzergruppen Profil Einloggen, um private Nachrichten zu lesen Registrieren Login

[PHP] Möglichkeiten zur dynamischen Darstellung (includes)

 
Neues Thema eröffnen   Neue Antwort erstellen    Syncom.org Foren-Übersicht -> Interpretersprachen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
PhP0Kid
Profi-Benutzer


Anmeldedatum: 05.01.2007
Beiträge: 403
Wohnort: Ellwangen (nahe Aalen)
Programmiersprachen: PHP, CSS, (X)HTML, SQL, JavaScript, C++ (nach Erfahrung von links nach rechts)

BeitragVerfasst am: 14.01.2007, 21:11    Titel: [PHP] Möglichkeiten zur dynamischen Darstellung (includes) Antworten mit Zitat

So, da es in so vielen Foren oft vorkommt, dass immer das gleiche gefragt wird, hier einmal ein

kleines "Tutorial" über die nette Möglichkeit der dynamischen Einbindung von Inhalten:

1. Was bedeutet dynamisches Einbinden?
Dynamisches Einbinden von Inhalten bedeutet, dass in eine Website durch eine Änderung einer

Variable (in der URL: index.php?site=news) ein anderer Inhalt als zuvor eingebunden wird, ohne

dass die ganze Website neu geladen werden muss.

Realisierung
Dies wird durch die Funktion include() ermöglicht. Nun gibt es vielerlei Methoden eine Seite zu

includen.
Grundgedanke:
Code:

include('datei.php');

Diese Funktion sagt aus, dass in die aktuelle Datei eine andere included werden soll. Wenn nun

Datei "A" den Inhalt
Code:

echo 'Hallo ihr!<br>';
include('B.php');
echo 'Test';

hat und Datei "B.php" den Inhalt
Code:

echo 'Hier ist noch ein Text!';


Dann hat die Datei am Ende folgenden Inhalt:

Code:

echo 'Hallo ihr!<br>';
echo 'Hier ist noch ein Text!';
echo 'Test';


Wie realisiere ich nun aber ein dynamisches Einbinden?
Dazu haben wir die Globalen $_GET[] Variablen.
Bsp:
URL: index.php?site=news
Dann ist unsere Globale Variable $_GET['site'] und diese hat den Inhalt "news". Damit können wir

folgendes realisieren:
Code:

include($_GET['site'].'.php');

Das sagt aus, dass es nun news.php includen soll, wenn die URL index.php?site=news heißt. Heißt

diese aber z.B. index.php?site=test dann included es die test.php
Nun haben wir aber das Problem, dass es die test.php gar nicht geben muss. Also müssen wir

festlegen, welche Seiten included werden dürfen. Dafür gibt es jetzt verschiedene Varianten:

Code:

switch($_GET['site']){
case "news": include('news.php'); break;
case "test": include('test.php'); break;

default: include('fehler.php');break;
}


Wenn nun jmd index.php?site=news aufruft, erscheint die news.php! Wird aber index.php?site=hallo

aufgerufen, so wird die Seite fehler.php included, weil der Wert "hallo" in der Switch-Schleife

nicht festgelegt wurde.

Nun muss man aber alle Seiten von Hand eintragen. Viel praktischer wäre es noch dynamischer zu

gestalten:

Code:

if(!isset($_GET['site'])) $_GET['site'] = "news"; //wenn $_GET['site'] nicht festgelegt ist,

bekommt es den wert "news"
 
$invalide = array('/','/\/',':','.'); //damit niemand in der URL-Zeile Sonderzeichen eingibt,

werden diese hier ausgefiltert
$_GET['site'] = str_replace($invalide,' ',$_GET['site']);

if(!file_exists($_GET['site'].'.php')) $_GET['site'] = "news"; //damit man keine nicht

vorhandenen Seiten aufruft

include($_GET['site'].'.php');


Damit wird jede vorhandene Seite aufgerufen, wenn sie angegeben ist. Nun muss aber die Seite

news.php grundsätzlich vorhanden sein (als Startseite).

Verschachtelte Includes
Nun wäre es aber toll Unterseiten zu haben. Schließlich ist es nervig immer nur

index.php?site=IRGENDWAS zu haben oder immer das gleiche Verzeichnis zu haben.

Daher gibt es nun mehrere Möglichkeiten, die ich nur als Konzepte darlege:

1. Verschachtelte if-Anweisungen
Code:

if(!isset($_GET['sub1']) AND !isset($_GET['sub2'])){
//Include der site-Variablen

switch($_GET['site']){
case "news": include('news.php'); break;
case "test": include('test.php'); break;

default: include('fehler.php');break;
}

}
elseif(!isset($_GET['sub2'])){
//Include der sub1-Variablen

switch($_GET['sub1']){
case "Unterkategorie": include('unterkategorie.php'); break;
case "test2": include('test2.php'); break;

default: include('fehler.php');break;
}

}
elseif(isset($_GET['sub2'])){
//Include der sub2-Variablen
switch($_GET['site']){
case "sub2": include('sub2.php'); break;
case "test3": include('test3.php'); break;

default: include('fehler.php');break;
}
}
else{
//Include der Startseite
include('startseite.php');
}



Der Rest ist Einfallsreichtum.

Beispiele:
* Auslesen von Ordnern, welche dann in eine switch-Variable eingebettet werden
* Variable "sub" legt fest, welcher Unterordner includet werden soll - dadurch kann man gleiche

Namen benutzen, aber in verschiedenen Ordnern die Dateien ablegen


Es gibt zig Beispiele, die man aufzählen könnte. Wichtig ist aber, auf Sicherheit zu gehen. Die

Globalen Variablen können von Usern manipuliert werden, also sollte man sie stets überprüft

werden, ob Sonderzeichen drin sind etc. Includes, die nicht mehr verändert werden müssen, also

z.B. Unterordner auslesen oder derlei sind natürlich gefährlicher, da User so auf Dateien

zurückgreifen, die sie festlegen. Festgelegte Includes machen mehr Arbeit sind demnach aber wohl

eher sicher.

Das ganze ist letztendlich ein Streitpunkt. Wichtig ist ein leichtes, schnelles und sicheres

System zu nutzen, das einem selber genügt.

_________________
PHP-Programmierer aus Leidenschaft.
_________________


http://www.Julian-Stier.de | T-REx 2.2
Aktuelles ( 5.5.08 ):
* CMS, Julian-Stier.de - September 2008
* T-REx 2.3.0 - 2. Quartal 2008
* GlobalIndustry - release 2009
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
synapsis
Administrator


Anmeldedatum: 15.10.2006
Beiträge: 384
Wohnort: Nahe München
Programmiersprachen: C/C++, VB, (Java), php, JS, AJAX, (Python)
Compiler: MS VS2005 SE

BeitragVerfasst am: 15.01.2007, 18:44    Titel: Antworten mit Zitat

Nicht schlecht dein Tutorial. Smile

Allerdings würde ich noch darauf hinweisen, dass man statt $_GET[] auch gleich $_REQUEST[] nehmen kann, um sowohl POST als auch GET-Anfragen bearbeiten zu können. (Ist praktisch $_GET[], $_POST[] und $_COOKIE[] zusammen)

Es sind außerdem noch n paar kleine Schreibfehler drin,
aber sonst echt gut. Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PhP0Kid
Profi-Benutzer


Anmeldedatum: 05.01.2007
Beiträge: 403
Wohnort: Ellwangen (nahe Aalen)
Programmiersprachen: PHP, CSS, (X)HTML, SQL, JavaScript, C++ (nach Erfahrung von links nach rechts)

BeitragVerfasst am: 16.01.2007, 17:44    Titel: Antworten mit Zitat

Naja, hab mir von der Gestaltung und i.A. nich so viel Mühe gegeben, nur ma so um ne Diskussion vllt zu starten, wie ihr eure Includes bearbeitet ^^

Außerdem:

Ich arbeite nicht mit REQUEST (außer im $_REQUEST['url']-fall), da meines Wissens das unsicher ist, da du ja dann per $_GET zugreifen kannst Wink außerdem, wenn register_globals off ist, funktioniert das meines Wissens ned ^^


lg

_________________
PHP-Programmierer aus Leidenschaft.
_________________


http://www.Julian-Stier.de | T-REx 2.2
Aktuelles ( 5.5.08 ):
* CMS, Julian-Stier.de - September 2008
* T-REx 2.3.0 - 2. Quartal 2008
* GlobalIndustry - release 2009
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
thorn
Benutzer


Anmeldedatum: 23.09.2007
Beiträge: 48
Wohnort: Niederried b.K. (CH)
Programmiersprachen: PHP, MySQL, (X)HTML, CSS, JS, C, VB

BeitragVerfasst am: 10.11.2007, 21:44    Titel: Antworten mit Zitat

Request ist wie ein register_globals = on
Alle Variablen aus Cookie, Post und Get sind ohne gruppierung in einem Array zusammen...
Sicherheitsnachteil: gleichnamige Parameter werden überschrieben!
Dies kann zwar in der Einstellung eingestellt werden, welche zuerst eingelesen werden.
Vorteil: Man kann schnell unterscheiden, ob es eine Formularvariable ist oder eine URL Variable (Ja, man kann ein Formular auch über GET senden, habe es mir aber angewöhnt, alles von einem Formular als sepparaten Teil zu senden, da die URL meines wissens in der Länge begrenzt ist...)
Ein weiteres, man muss weniger schreiben *g*

http://ch2.php.net/manual/de/reserved.variables.php
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
synapsis
Administrator


Anmeldedatum: 15.10.2006
Beiträge: 384
Wohnort: Nahe München
Programmiersprachen: C/C++, VB, (Java), php, JS, AJAX, (Python)
Compiler: MS VS2005 SE

BeitragVerfasst am: 11.11.2007, 12:31    Titel: Antworten mit Zitat

Mittlerweile hab ich mir auch angewöhnt Request nicht mehr zu benutzen. Wenns um die Sicherheit geht, sollte ja eigentlich so ein bischen mehr Schreibarbeit gerechtfertigt sein. Wink

Übrigens Top-Posts von dir! (leider hat das Forum noch keine Karma-Funktion)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PhP0Kid
Profi-Benutzer


Anmeldedatum: 05.01.2007
Beiträge: 403
Wohnort: Ellwangen (nahe Aalen)
Programmiersprachen: PHP, CSS, (X)HTML, SQL, JavaScript, C++ (nach Erfahrung von links nach rechts)

BeitragVerfasst am: 11.11.2007, 14:48    Titel: Antworten mit Zitat

Habe mir nie angewöhnt $HTTP_*_VARS oder $_REQUEST genau aus diesem Grund zu verwenden. Am besten auch immer Anbieter mit register_globals = off suchen rein aus der Sicherheit. Letztendlich sollte man aber auch so programmieren, dass das Script mit beiden Varianten laufen kann Smile
_________________
PHP-Programmierer aus Leidenschaft.
_________________


http://www.Julian-Stier.de | T-REx 2.2
Aktuelles ( 5.5.08 ):
* CMS, Julian-Stier.de - September 2008
* T-REx 2.3.0 - 2. Quartal 2008
* GlobalIndustry - release 2009
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
thorn
Benutzer


Anmeldedatum: 23.09.2007
Beiträge: 48
Wohnort: Niederried b.K. (CH)
Programmiersprachen: PHP, MySQL, (X)HTML, CSS, JS, C, VB

BeitragVerfasst am: 22.03.2008, 02:45    Titel: Antworten mit Zitat

Zum eigentlichen Thema ist mir noch was eingefallen...

Wenn Dateien includet werden, insbesondere weitere Skripte, "sollte" man den include-Befehl in einen Block { } setzen...

Dies aus dem Grund, weil man in einem includeten Skript einen Abbruch herbeiführen kann, der unter Umständen das Elternskript ebenfalls zu einem Teil abbrechen kann...

Beispiel:
Code:
foreach(...){
 if(...)
  include...someone.php
}


someone.php:
Code:
echo ...
break;


Theoretisch wird nach dem ersten Include von someone.php die foreach-Schleife abgebrochen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PhP0Kid
Profi-Benutzer


Anmeldedatum: 05.01.2007
Beiträge: 403
Wohnort: Ellwangen (nahe Aalen)
Programmiersprachen: PHP, CSS, (X)HTML, SQL, JavaScript, C++ (nach Erfahrung von links nach rechts)

BeitragVerfasst am: 22.03.2008, 08:56    Titel: Antworten mit Zitat

und wenn das gewollt ist bzw. das Kindelement volle "Macht" haben soll? Mr. Green
_________________
PHP-Programmierer aus Leidenschaft.
_________________


http://www.Julian-Stier.de | T-REx 2.2
Aktuelles ( 5.5.08 ):
* CMS, Julian-Stier.de - September 2008
* T-REx 2.3.0 - 2. Quartal 2008
* GlobalIndustry - release 2009
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
thorn
Benutzer


Anmeldedatum: 23.09.2007
Beiträge: 48
Wohnort: Niederried b.K. (CH)
Programmiersprachen: PHP, MySQL, (X)HTML, CSS, JS, C, VB

BeitragVerfasst am: 22.03.2008, 13:01    Titel: Antworten mit Zitat

Na, in diesem Fall den Block weglassen Wink

Soll eher ein Hinweis sein, als eine Aufforderung, es so zu machen...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Syncom.org Foren-Übersicht -> Interpretersprachen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Anhänge in diesem Forum nicht anhängen.
Du kannst Dateien in diesem Forum nicht herunterladen.


Powered by php B. B. © 2001, 2005 php B. B. Group
Template xabbBlue für php B. B. Foren - created by php b. b. styles
Modified by synapsis
Protected by CTracker