| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
PhP0Kid Profi-Benutzer
Anmeldedatum: 05.01.2007 Beiträge: 404 Wohnort: Ellwangen (nahe Aalen) Programmiersprachen: PHP, CSS, (X)HTML, SQL, JavaScript, C++ (nach Erfahrung von links nach rechts)
|
Verfasst am: 14.01.2007, 21:11 Titel: [PHP] Möglichkeiten zur dynamischen Darstellung (includes) |
|
|
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. _________________ http://www.Julian-Stier.de | T-REx 2.2
Fertiges ( 16.7.08 ):
* Julian-Stier.de, Blog - Juli/August 2008
Aktuelles ( 16.7.08 ):
* T-REx 2.3.0 - release 2008/2009
* GlobalIndustry - release 2008/2009 |
|
| Nach oben |
|
 |
synapsis Administrator

Anmeldedatum: 15.10.2006 Beiträge: 387 Wohnort: Nahe München Programmiersprachen: C/C++, VB, (Java), php, JS, AJAX, (Python) Compiler: MS VS2005 SE
|
Verfasst am: 15.01.2007, 18:44 Titel: |
|
|
Nicht schlecht dein Tutorial.
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.  _________________ Pssst... Syncom.org Relaunch im Herbst 2008... bitte weitersagen  |
|
| Nach oben |
|
 |
PhP0Kid Profi-Benutzer
Anmeldedatum: 05.01.2007 Beiträge: 404 Wohnort: Ellwangen (nahe Aalen) Programmiersprachen: PHP, CSS, (X)HTML, SQL, JavaScript, C++ (nach Erfahrung von links nach rechts)
|
Verfasst am: 16.01.2007, 17:44 Titel: |
|
|
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 außerdem, wenn register_globals off ist, funktioniert das meines Wissens ned ^^
lg _________________ http://www.Julian-Stier.de | T-REx 2.2
Fertiges ( 16.7.08 ):
* Julian-Stier.de, Blog - Juli/August 2008
Aktuelles ( 16.7.08 ):
* T-REx 2.3.0 - release 2008/2009
* GlobalIndustry - release 2008/2009 |
|
| Nach oben |
|
 |
thorn Benutzer

Anmeldedatum: 23.09.2007 Beiträge: 49 Wohnort: Niederried b.K. (CH) Programmiersprachen: PHP, MySQL, (X)HTML, CSS, JS, C, VB
|
Verfasst am: 10.11.2007, 21:44 Titel: |
|
|
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 |
|
 |
synapsis Administrator

Anmeldedatum: 15.10.2006 Beiträge: 387 Wohnort: Nahe München Programmiersprachen: C/C++, VB, (Java), php, JS, AJAX, (Python) Compiler: MS VS2005 SE
|
Verfasst am: 11.11.2007, 12:31 Titel: |
|
|
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.
Übrigens Top-Posts von dir! (leider hat das Forum noch keine Karma-Funktion) _________________ Pssst... Syncom.org Relaunch im Herbst 2008... bitte weitersagen  |
|
| Nach oben |
|
 |
PhP0Kid Profi-Benutzer
Anmeldedatum: 05.01.2007 Beiträge: 404 Wohnort: Ellwangen (nahe Aalen) Programmiersprachen: PHP, CSS, (X)HTML, SQL, JavaScript, C++ (nach Erfahrung von links nach rechts)
|
Verfasst am: 11.11.2007, 14:48 Titel: |
|
|
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  _________________ http://www.Julian-Stier.de | T-REx 2.2
Fertiges ( 16.7.08 ):
* Julian-Stier.de, Blog - Juli/August 2008
Aktuelles ( 16.7.08 ):
* T-REx 2.3.0 - release 2008/2009
* GlobalIndustry - release 2008/2009 |
|
| Nach oben |
|
 |
thorn Benutzer

Anmeldedatum: 23.09.2007 Beiträge: 49 Wohnort: Niederried b.K. (CH) Programmiersprachen: PHP, MySQL, (X)HTML, CSS, JS, C, VB
|
Verfasst am: 22.03.2008, 02:45 Titel: |
|
|
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:
Theoretisch wird nach dem ersten Include von someone.php die foreach-Schleife abgebrochen! |
|
| Nach oben |
|
 |
PhP0Kid Profi-Benutzer
Anmeldedatum: 05.01.2007 Beiträge: 404 Wohnort: Ellwangen (nahe Aalen) Programmiersprachen: PHP, CSS, (X)HTML, SQL, JavaScript, C++ (nach Erfahrung von links nach rechts)
|
Verfasst am: 22.03.2008, 08:56 Titel: |
|
|
und wenn das gewollt ist bzw. das Kindelement volle "Macht" haben soll?  _________________ http://www.Julian-Stier.de | T-REx 2.2
Fertiges ( 16.7.08 ):
* Julian-Stier.de, Blog - Juli/August 2008
Aktuelles ( 16.7.08 ):
* T-REx 2.3.0 - release 2008/2009
* GlobalIndustry - release 2008/2009 |
|
| Nach oben |
|
 |
thorn Benutzer

Anmeldedatum: 23.09.2007 Beiträge: 49 Wohnort: Niederried b.K. (CH) Programmiersprachen: PHP, MySQL, (X)HTML, CSS, JS, C, VB
|
Verfasst am: 22.03.2008, 13:01 Titel: |
|
|
Na, in diesem Fall den Block weglassen
Soll eher ein Hinweis sein, als eine Aufforderung, es so zu machen... |
|
| Nach oben |
|
 |
|
|
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.
|
|