zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden PHP: Der richtige Weg? (Seite-"include").

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 19.08.2008, 17:24
Benutzerbild von Crizzo
der mit dem Editor kämpft
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 17.10.2006
Ort: Ost-Hessen
Beiträge: 4.828
Crizzo ist ein sehr geschätzer MenschCrizzo ist ein sehr geschätzer MenschCrizzo ist ein sehr geschätzer MenschCrizzo ist ein sehr geschätzer Mensch
Standard PHP: Der richtige Weg? (Seite-"include").

Hallo, liebe XHTML-Forum-Mitglieder!

Ich bin aktuell ein wenig mit PHP am tüfteln. Ziel des ganzen ist es, dass ich im großen und ganzen eine Haupt-index-Datei habe, die die Inhalte einlädt und die Konstanten beinhaltet. Letztere werden bei Bedarf angepasst.

Das ganze sieht aktuell so aus: Blackhawk-Zone.de und soll bald meine aktuelle Seite (siehe Signatur) organisieren.

index.php:
PHP-Code:
<?php
    error_reporting
(E_ALL);
    include 
"inc/inc.config.php"// die Konfigurationsdateien lesen.
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <link rel="stylesheet" type="text/css" href="css/style.css" />
    <title>Blackhawk-Zone.de</title>
    <meta http-equiv="expires" content="0"/>
    <meta name="language" content="de" />
    <meta name="robots" content="all" />
    </head>
    <body>

   <h1>Blackhawk-Zone.de NEU</h1>
<?php 
    
// Inhaltabfrage
    
if(isset($_GET['section']) AND isset($dateien[$_GET['section']])) { // Prüft ob section definiert und vorhanden ist.
        
echo $dateien[$_GET['section']][1]; //Wenn nein: Nimmt Unter-Array Pos 1 und fügt es ein.
    
} else {
        echo 
$dateien['news'][1]; // Ansonsten Pos 1 von News.

?>
    <div id="content">
<?php 
    
// Inhaltabfrage 
    
if(isset($_GET['section']) AND isset($dateien[$_GET['section']])) { // Prüft ob section definiert und vorhanden ist.
        
include $dateien[$_GET['section']][0]; // Wenn ja: Fügt Inhalt der gewählten Section ein
    
} else {
        include 
$dateien['news'][0]; // Ansonsten von News-Inhalt
    
}
?>
    </div>
    <div id="sidebar">
    Sidebar
<?php 
    
// Inhaltabfrage
    
if(isset($_GET['section']) AND isset($dateien[$_GET['section']])) { // Prüft ob section definiert und vorhanden ist.
        
echo $dateien[$_GET['section']][2]; //Wenn nein: Nimmt Unter-Array Pos 2 und fügt es ein.
    
} else {
        echo 
$dateien['news'][2]; // Ansonsten Pos 2 von News.
    

?>
    
    </div>
    <div id="search">Suche: <input name="search" type="text" /></div>
    <div id="secsidebar">Second Sidebar
<?php 
    
// Inhaltabfrage
    
if(isset($_GET['section']) AND isset($dateien[$_GET['section']])) { // Prüft ob section definiert und vorhanden ist.
        
echo $dateien[$_GET['section']][3]; //Wenn nein: Nimmt Unter-Array Pos 3 und fügt es ein.
    
} else {
        echo 
$dateien['news'][3]; // Ansonsten Pos 3 von News.
    

?>
    
    </div>
    <div id="siteinfo">Siteinfo</div>
  
    </body>
    </html>
inc.config.php:
PHP-Code:
<?php 
    
$dateien 
= array(
"news" => array ("news.html",
                 
"<ul>
                 <li><strong>Startseite</strong></li>
                 <li><a href=\"?section=other\">Artikel</a></li>
                 <li>Kontakt</li>
                 <li>Links</li>
                 </ul>"

                 
"<br />news Sidebar"
                 
"<br />untere Sidebar News",),
"other" => array ("other.html",
                  
"<ul>
                   <li><a href=\"index.php\">Startseite</a></li>
                   <li><strong>Artikel</strong></li>
                   <li>Kontakt</li>
                   <li>Links</li>
                   </ul>"

                  
"<br />other Sidebar"
                  
"<br />untere Sidebar other",)
);
?>
Den Rest könnt ihr im Online-Beispiel einsehen.

Nun meine Frage, ist das in Ordnung, zu kompliziert oder zu unvariable? Immerhin muss ich jede Menge Zeilen zusätzlich in die inc.config.php schreiben, wenn weitere Seiten dazu kommen.

Gruß
__________________
Ohne Quelltext gibts selten Hilfe. Also: Onlinebeispiel hochladen und Link bereitstellen!
Foren-FAQ

Geändert von Crizzo (19.08.2008 um 17:33 Uhr)
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 19.08.2008, 18:02
Benutzerbild von Unsk1ll3d
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 03.01.2006
Beiträge: 206
Unsk1ll3d befindet sich auf einem aufstrebenden Ast
Standard

Warum includest du nicht einfach normale .html-Files in einem content Ordner?
Wäre doch eigentlich am einfachsten, oder etwa nicht?

Außerdem würde ich die globalen $_POST und $_GET nicht verwenden, sondern mit ini_set("register_globals","off"); setzen und so verfügbar machen:

PHP-Code:
import_request_variables("g","variablenname"); # $für _GET[variablenname]
import_request_variables("p","variablenname"); # $für _POST[variablenname] 
Außerdem kann ich dir eine andere Methode des URL-Handlings empfehlen, und zwar über ein einfaches Query:
index.php?projects:hello

und dann via switch/case vergleichen:
PHP-Code:
<?php
  $query
=explode(":",$_SERVER['QUERY_STRING']);

switch(
$query[0]){
 case 
"projects":
 case 
"tutorials":
  include 
"./content/".$query[0].".php";
  break;

 default:
 case 
"home":
  include 
"./content/home.php";
 break;
}
# Naja, dementsprechend noch weiter ausbaufähig.
# Ich würde dann in der -Überdatei- projects.php $query[1] (also hello im Bsp.) vergleichen und dementsprechend den content returnen.
?>
PS: Hoffentlich kein Fähla drin

Außerdem: Für isset() würde ich lieber is_file($pfad); nehmen, returned auch true || false.

Grüßel,
Unsk1ll3d
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 19.08.2008, 18:10
Benutzerbild von heiko_rs
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 18.09.2005
Ort: Berlin
Beiträge: 9.854
heiko_rs ist ein wunderbarer Anblickheiko_rs ist ein wunderbarer Anblickheiko_rs ist ein wunderbarer Anblickheiko_rs ist ein wunderbarer Anblickheiko_rs ist ein wunderbarer Anblickheiko_rs ist ein wunderbarer Anblickheiko_rs ist ein wunderbarer Anblick
Standard

Man muss lange nicht jede Einzelseite in der config nennen. Ich hole fast alle variablen Werte für die index.php (Titel, Überschrift, Body-ID etc.) aus dem array, der die Werte für die Navi liefert, sowie aus dem jeweiligen Dateinamen. Ganz selten muss ich zusätzlich z.B. eine individuelle Überschrift definieren.

Um Missbrauch (z.B. durch manuelle Eingabe nicht existierender Dateinamen) zu verhindern, prüfe ich nach folgendem Prinzip:

PHP-Code:
$seite $_GET['seite'];
$inhalt 'inhalte/'.$seite.'.inc.php';

if(
file_exists($inhalt)) {
... 
Wenn die aufgerufene Datei nicht existiert, kommt die Fehlerseite und sendet 404 (man kann sich zusätzlich absichern, indem man Punkte innerhalb der aufgerufenen Dateinamen verbietet). Dadurch bleibt meine config relativ klein, da eben nicht jede Einzelseite explizit genannt werden muss.

Geändert von heiko_rs (19.08.2008 um 18:14 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 19.08.2008, 18:13
Benutzerbild von inta
free as in freedom
XHTMLforum-Kenner
 
Registriert seit: 04.12.2006
Ort: Berlin
Beiträge: 5.035
inta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz sein
Standard

Zitat:
Zitat von Unsk1ll3d Beitrag anzeigen
Außerdem würde ich die globalen $_POST und $_GET nicht verwenden, sondern mit ini_set("register_globals","off"); setzen und so verfügbar machen:

PHP-Code:
import_request_variables("g","variablenname"); # $für _GET[variablenname]
import_request_variables("p","variablenname"); # $für _POST[variablenname] 
Zitat:
import_request_variables — Import GET/POST/Cookie variables into the global scope
Damit machst du genau das, was eigentlich register_globals tut und was man vermeiden sollte. Ich würde auf jeden Fall bei den Superglobalen $_GET und $_POST bleiben.

@Blackhawk
Deine Methode den Inhalt aus einem Array zu holen, finde ich unschön. Ich würde entweder Dateien einbinden, oder den Inhalt gleich aus einer Datenbank holen. Bei einer Seite mit etwas mehr Umfang hast du schnell eine unübersichtliche Riesenconfig (Inhalt hat in einer Config eigentlich auch nichts verloren).

(Das erstmal nur auf den ersten Blick.)
Mit Zitat antworten
  #5 (permalink)  
Alt 19.08.2008, 18:17
Benutzerbild von Crizzo
der mit dem Editor kämpft
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 17.10.2006
Ort: Ost-Hessen
Beiträge: 4.828
Crizzo ist ein sehr geschätzer MenschCrizzo ist ein sehr geschätzer MenschCrizzo ist ein sehr geschätzer MenschCrizzo ist ein sehr geschätzer Mensch
Standard

Zitat:
Zitat von Unsk1ll3d Beitrag anzeigen
Warum includest du nicht einfach normale .html-Files in einem content Ordner?
Wäre doch eigentlich am einfachsten, oder etwa nicht?
Du meinst statt dem Code im Array einfach nur eine weitere Datei, die per "include" eingeladen wird?
Zitat:
Außerdem würde ich die globalen $_POST und $_GET nicht verwenden, sondern mit ini_set("register_globals","off"); setzen und so verfügbar machen:

PHP-Code:
import_request_variables("g","variablenname"); # $für _GET[variablenname]
import_request_variables("p","variablenname"); # $für _POST[variablenname] 
Außerdem kann ich dir eine andere Methode des URL-Handlings empfehlen, und zwar über ein einfaches Query:
index.php?projects:hello

und dann via switch/case vergleichen:
PHP-Code:
<?php
  $query
=explode(":",$_SERVER['QUERY_STRING']);

switch(
$query[0]){
 case 
"projects":
 case 
"tutorials":
  include 
"./content/".$query[0].".php";
  break;

 default:
 case 
"home":
  include 
"./content/home.php";
 break;
}
# Naja, dementsprechend noch weiter ausbaufähig.
# Ich würde dann in der -Überdatei- projects.php $query[1] (also hello im Bsp.) vergleichen und dementsprechend den content returnen.
?>
PS: Hoffentlich kein Fähla drin
Vorteil?
Zitat:
Außerdem: Für isset() würde ich lieber is_file($pfad); nehmen, returned auch true || false.
Ist "issed()" hier falsch oder übertrieben?
Zitat:
Zitat von heiko_rs Beitrag anzeigen
Man muss lange nicht jede Einzelseite in der config nennen. Ich hole fast alle variablen Werte für die index.php (Titel, Überschrift, Body-ID etc.) aus dem array, der die Werte für die Navi liefert, sowie aus dem jeweiligen Dateinamen. Ganz selten muss ich zusätzlich z.B. eine individuelle Überschrift definieren.
D.h. du ermittelst welche Navi benötig wird an Hand von was? Deine Navi ist immer noch so:http://xhtmlforum.de/46488-navi-incl...tml#post337712 ?
Und mit dem Ergebnis lädst du die anderen Seiten ein und verändert verschiedene Variablen in der index.php?
Zitat:
Um Missbrauch (z.B. durch manuelle Eingabe nicht existierender Dateinamen) zu verhindern, prüfe ich nach folgendem Prinzip:

PHP-Code:
$seite $_GET['seite'];
$inhalt 'inhalte/'.$seite.'.inc.php';

if(
file_exists($inhalt)) {
... 
Wenn die aufgerufene Datei nicht existiert, kommt die Fehlerseite und sendet 404. Dadurch bleibt meine config relativ klein, da eben nicht jede Einzelseite explizit genannt werden muss.
Wenn ich jetzt in der Sidebar was verändern will, lädst du dann komplett die Sidebar ein oder nur deren Inhalt?

Ich verstehe nicht, wie man sowas dann regelt?

@inta:
Meine Seite ist ja bekannt. Also was meinst du zu der Größe?
__________________
Ohne Quelltext gibts selten Hilfe. Also: Onlinebeispiel hochladen und Link bereitstellen!
Foren-FAQ

Geändert von Crizzo (19.08.2008 um 18:36 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 19.08.2008, 18:23
Benutzerbild von Unsk1ll3d
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 03.01.2006
Beiträge: 206
Unsk1ll3d befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von inta Beitrag anzeigen
Damit machst du genau das, was eigentlich register_globals tut und was man vermeiden sollte. Ich würde auf jeden Fall bei den Superglobalen $_GET und $_POST bleiben.

(Das erstmal nur auf den ersten Blick.)
moep. nein...damit macht man nur die variablen, die man benötigt, zur globalen. Beispielsweise häte index.php?anderevariable=hello keinen Effekt auf mein PHP file, auch kann man so im script genutzte Variablen (z.B. $file) nicht "manipulieren"...

@ BlackHawk:
Vorteil ist, dass man keine Arrays braucht, nicht dauernd " oder ' escapen muss - und ne HTML-file hat, die auch jeder Editor von der Syntax her highlighten kann
switch/case ist meiner Meinung nach die logischste / einfachste Methode, Dateien zu includen. Sonst könnte jemand auch mit hello.php?datei=index_dens_nich_gibt.inc.php auch irgendwelche nicht existenten Dateien includen. Dann bekommt der nen Fehler (ist zwar selbst Schuld), aber behauptet, dein Script sei buggy (ja, es gibt so welche...)

Grüßel,
Unsk1ll3d

PS: Beispiel für ein solches "URL-System" findest du hier: http://unsk1ll3d.de/portfolio
Mit Zitat antworten
  #7 (permalink)  
Alt 19.08.2008, 18:33
Benutzerbild von Crizzo
der mit dem Editor kämpft
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 17.10.2006
Ort: Ost-Hessen
Beiträge: 4.828
Crizzo ist ein sehr geschätzer MenschCrizzo ist ein sehr geschätzer MenschCrizzo ist ein sehr geschätzer MenschCrizzo ist ein sehr geschätzer Mensch
Standard

Zitat:
Zitat von Unsk1ll3d Beitrag anzeigen
@ BlackHawk:
Vorteil ist, dass man keine Arrays braucht, nicht dauernd " oder ' escapen muss - und ne HTML-file hat, die auch jeder Editor von der Syntax her highlighten kann
switch/case ist meiner Meinung nach die logischste / einfachste Methode, Dateien zu includen. Sonst könnte jemand auch mit hello.php?datei=index_dens_nich_gibt.inc.php auch irgendwelche nicht existenten Dateien includen. Dann bekommt der nen Fehler (ist zwar selbst Schuld), aber behauptet, dein Script sei buggy (ja, es gibt so welche...)
Eigentlich kann er nichts anderes "includen", da im Falle, dass der Name nicht existiert die Startseite ausgegeben wird.

Edit: Bitte Edit in meinem zweiten Beitrag beachten.
__________________
Ohne Quelltext gibts selten Hilfe. Also: Onlinebeispiel hochladen und Link bereitstellen!
Foren-FAQ

Geändert von Crizzo (19.08.2008 um 18:38 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 19.08.2008, 18:36
Benutzerbild von inta
free as in freedom
XHTMLforum-Kenner
 
Registriert seit: 04.12.2006
Ort: Berlin
Beiträge: 5.035
inta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz sein
Standard

Zitat:
Zitat von Unsk1ll3d Beitrag anzeigen
moep. nein...damit macht man nur die variablen, die man benötigt, zur globalen. Beispielsweise häte index.php?anderevariable=hello keinen Effekt auf mein PHP file, auch kann man so im script genutzte Variablen (z.B. $file) nicht "manipulieren"...
PHP: import_request_variables - Manual
Lies dir das doch bitte mal durch. Der zweite Parameter ist nicht der Variablenname, sondern ein Prefix für alle Variablen die du importierst. Wenn du "g" für GET angibst, dann holt er dir alle GET-Variablen in den globalen Scope und setzt das Prefix davor. Bei POST werden übrigens auch alle FILE-Informationen importiert.

Du gewinnst dadurch nichts an Sicherheit, wahrscheinlich eher im Gegenteil.

Zitat:
Zitat von BlackHawk Beitrag anzeigen
Meine Seite ist ja bekannt. Also was meinst du zu der Größe?
Wie schon gesagt, ich halte von der Array-Lösung nichts. Deine Seite ist schon recht umfangreich und wird sicher noch weiter wachsen.
Mit Zitat antworten
  #9 (permalink)  
Alt 19.08.2008, 18:53
Benutzerbild von Crizzo
der mit dem Editor kämpft
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 17.10.2006
Ort: Ost-Hessen
Beiträge: 4.828
Crizzo ist ein sehr geschätzer MenschCrizzo ist ein sehr geschätzer MenschCrizzo ist ein sehr geschätzer MenschCrizzo ist ein sehr geschätzer Mensch
Standard

Mal zu heiko_rs' Idee.
PHP-Code:
$seite $_GET['seite'];
$inhalt 'inhalte/'.$seite.'.inc.php';

if(
file_exists($inhalt)) {
... 
Er verlinkt jetzt z.B. auch so: http://seite.de/index.php?seite=inhalt

Das "inhalt" wird in $seite gespeichert.

Ergibt dann den pfad inhalte/inhalt.inc.php, der in $inhalt gespeichert und überprüft wird, ob es existiert, falls nicht kommt ein Fehler 404.

Wenn es existiert kommt der Befehl "include $inhalt;".

Andere Inhalte kann man einfach per "$inhaltfuersidebar" in die zu "includierende" Datei packen, die es dann in "index.php" einsetzt.

Doch wie steuert man damit jetzt die Navigation?

Edit: Ich hab jetzt mal so gelöst, allerdings ohne Navi:
index.php:
PHP-Code:
<div id="content">
    <?php
    
if(file_exists($inhalt)) {
    include 
$inhalt;
    } 
    else {
    echo 
"<h2>Fehler 404!</h2>";
    echo 
"Die Datei konnte nicht gefunden werden."
    };
    
?>
    </div>
inc.config.php
PHP-Code:
<?php
if(isset($_GET['section'])) {
$seite $_GET['section'];
$inhalt /*'inhalte/ '.*/$seite.'.html';
}
else {
$inhalt "news.html";
};
?>
__________________
Ohne Quelltext gibts selten Hilfe. Also: Onlinebeispiel hochladen und Link bereitstellen!
Foren-FAQ

Geändert von Crizzo (19.08.2008 um 19:50 Uhr)
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 19.08.2008, 19:24
Benutzerbild von Unsk1ll3d
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 03.01.2006
Beiträge: 206
Unsk1ll3d befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von inta Beitrag anzeigen
PHP: import_request_variables - Manual
Lies dir das doch bitte mal durch. Der zweite Parameter ist nicht der Variablenname, sondern ein Prefix für alle Variablen die du importierst. Wenn du "g" für GET angibst, dann holt er dir alle GET-Variablen in den globalen Scope und setzt das Prefix davor. Bei POST werden übrigens auch alle FILE-Informationen importiert.
Sorry, ich meinte, man nutzt import_request_variables zur Deklaration der temporären Variablen, danach kann man das array einfach walken und aussortieren. Habe mal ein Beispiel gemacht, damit man versteht, was ich meine:

Aufruf-Beispiel für _GET:
test.php?input[eins]=hallo&input[zwei]=hallo&dummevar=damdidum&asd=test

Inhalt der test.php:
PHP-Code:
<?php
function setvars(&$array$key$prefix) {
 if(!
preg_match("~(".$prefix.")~Uis",$key)){
   unset(
$_GET[$key]);
 }
}

$filter="input|hello|asd";
array_walk($_GET'setvars',$filter);

print_r($_GET);
?>

Geändert von Unsk1ll3d (19.08.2008 um 19:26 Uhr)
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP Kontaktforumlar allgemeiner aufbau Krulle Serveradministration und serverseitige Scripte 15 17.06.2010 12:44
Element ausserhalb seite positionieren, so daß keine scrollbar entsteht st-SaHiB CSS 5 20.07.2009 08:49
Layout der Seite mit PHP sumica Serveradministration und serverseitige Scripte 24 30.06.2009 22:00
IE6 - Seite rutscht weg Tom29 CSS 2 24.11.2007 13:24
csss seite in frame horiz. scrollbar Holger (HMR) CSS 0 15.09.2005 15:05


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:20 Uhr.