Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] PHP-Datei auslesen und Inhalt auf der Seite wiedergeben
Niji-chan
29.05.2007, 07:01
Hi.
Ich habe folgendes Problem:
Ich habe mehrere PHP-Seiten, die jeweils den Inhalt meiner jeweiligen Seite ausmachen.
Dann habe ich meine start.php, die diese Seiten einlesen soll und nach einem Klick auf einen Link die entsprechende Seite anzeigen soll.
Wie mache ich das?
lg
zav
Spark Amandil
29.05.2007, 07:07
Am bequemsten wäre vermutlich in die start.php
<?php
$page=$_GET['page']; if($page=="") { include"xxx.php"; } if($page) { include($page); }
?> einzutragen.
Die links wären dann
<a href="start.php?page=xxx.php">
<a href="start.php?page=yyy.php">
<a href="start.php?page=zzz.php">
...
Ist zwar technisch nicht die sicherste Methode, für den Anfang dürfts aber eine der einfachsten sein.
Niji-chan
29.05.2007, 07:38
Jetzt habe ich nur noch das Problem, dass beim ersten Aufruf der start.php die Startseite nicht angezeigt wird. Bzw. der erste richtige Inhalt.
EDIT: funktioniert jetzt doch alles einwandfrei!
Vielen lieben Dank!
NPC Fighter
29.05.2007, 08:38
Grundsätzlich wäre es sinnvoll, das ganze noch zu erweitern und mit is_file() zu prüfen, ob die Datei existiert (im Ja-Fall die Datei einbinden, im Nein-Fall einen 404 zurückliefern).
Jetzt habe ich nur noch das Problem, dass beim ersten Aufruf der start.php die Startseite nicht angezeigt wird. Bzw. der erste richtige Inhalt.
Ungeachtet deines Edits: Wenn du genau im Überblick hast, welche Unterseiten du einbinden willst, kannst du auch mit einem Switch arbeiten und da dann als default Case die Willkommensseite includen.
Sinnvollerweise übergibt man die Dateierweiterung nicht über die Adresszeile, weil das ein Sicherheitsproblem darstellt.
Außerdem verstehe ich nicht, warum man diese Konstruktion so oft vorfindet:
$page=$_GET['page'];
Völlig sinnlos.
Ich schätze, er möchte damit Schreibarbeit sparen...
Was aber irgendwie sinnlos ist, imo, ob nun $page oder $_GET['page'], macht imo kaum Unterschiede, 5 Buchstaben gegen 13... naja, trotzdem irgendwie sinnlos. :rolleyes:
Außerdem verstehe ich nicht, warum man diese Konstruktion so oft vorfindet:
$page=$_GET['page'];
Völlig sinnlos.
Das hat schon seinen Sinn, zumindest wenn der Wert möglicherweise nachträglich verändert wird. Imo ist es nämlich schlechter Stil, die superglobalen Variablen zu verändern - wenn man die Daten verändern muss, macht man das mit einer Kopie. Und ansonsten spart man sich so Schreibarbeit und es sieht schöner aus :P
Das hat schon seinen Sinn, zumindest wenn der Wert möglicherweise nachträglich verändert wird. Imo ist es nämlich schlechter Stil, die superglobalen Variablen zu verändern - wenn man die Daten verändern muss, macht man das mit einer Kopie. Und ansonsten spart man sich so Schreibarbeit und es sieht schöner aus :P
Zur Weiterverarbeitung mag das ja nützlich sein. Ich würde einer Variable allerdings sofort die verarbeitete Version zuweisen. Außerdem meine ich, dadurch den Ursprung der Information besser nachvollziehen zu können.
Schreibarbeit? Tasten richtig belegen!
Ob es schöner aussieht ist wohl eher Geschmackssache. $page erinnert zu sehr an die register_globals-Zeit und damit schlechtem Stil. $_GET hebt sich davon majestätisch ab ;)
Crash-Override
30.05.2007, 13:55
include($page);
Bitte nicht, da könnte man ja _alles_ includen (also der User per Manipulation).
Besser wäre imho: include('./pages/'. stripsplashes($page).'.php');
So können nur php Seiten innerhalb des Unterverzeichnisses 'pages' aufgerufen werden. Bei den Links muss man nun halt die Endung weglassen. Also: <a href="?page=home">My Home</a> <!-- führt zu ./pages/home.php -->
Auch sachen wie <a href="?page=../../index">My Home</a> gehen nicht mit meiner Methode (dank stripsplashes).
Zusätzlich würde ich eine überprüfung auf vorhandensein einbauen:
if (file_exists('./pages/'. stripsplashes($page).'.php')) {
include('./pages/'. stripsplashes($page).'.php');
}
else {
echo "404: Unterseite nicht gefunden.";
echo "Bitte begeben Sie sich auf <a href='index.php'>die Hauptseite</a>";
}
Damit der User nicht eventuelle PHP Fehler sehen muss. :)
[...]
Mal ehrlich: Wenn man schön gecodet hat, kann man eine globale Variable sowieso nur einmal verwenden: Und zwar, wenn man sie per Value an einen einen Konstruktor übergibt.
Wenn es dann nicht mindestens eine selbst geschriebene Funktion ist, hat man bereits etwas falsch designed.
Somit ist es eigentlich nur Haarspalterrei, welcher Stil stilloser ist.
Ich persönlich halte es ja am angenehmsten, die Seiten in eine Tabelle in der Datenbank einzutragen und über die ID zu arbeiten: So kann man auch alles viel einfacher managen, und sortieren. Statistiken sind auch leichter zu erstellen, usw.
Mal ehrlich: Wenn man schön gecodet hat, kann man eine globale Variable sowieso nur einmal verwenden: Und zwar, wenn man sie per Value an einen einen Konstruktor übergibt.
Was hat der geschriebene Unterscheid zwischen $page und $_GET['page'] mit dem allgemeinen Programmierungs„stil“ zu tun?
Wenn es dann nicht mindestens eine selbst geschriebene Funktion ist, hat man bereits etwas falsch designed.
Wenn man, wie du gesagt hast, den Wert übergibt. Eine eigene Funktion bringt aber auch hier nichts, wenn man die globale Variable direkt verwendet, was bei den Superglobalen ja möglich ist.
Ich persönlich halte es ja am angenehmsten, die Seiten in eine Tabelle in der Datenbank einzutragen und über die ID zu arbeiten: So kann man auch alles viel einfacher managen, und sortieren. Statistiken sind auch leichter zu erstellen, usw.
Ich hoffe, dass das nicht bedeutet, dass du deinen Besuchern Nummern an den Kopf wirfst.
Was hat der geschriebene Unterscheid zwischen $page und $_GET['page'] mit dem allgemeinen Programmierungs„stil“ zu tun?
Wenn man, wie du gesagt hast, den Wert übergibt. Eine eigene Funktion bringt aber auch hier nichts, wenn man die globale Variable direkt verwendet, was bei den Superglobalen ja möglich ist.
Ich hoffe, dass das nicht bedeutet, dass du deinen Besuchern Nummern an den Kopf wirfst.
Es geht doch darum, das diese Diskussion auf einen allgemeinen schlechten Programmierstil zurück geht. Wenn man es elegant macht, dann sind alle funktionalitäten in Modulen untergebracht und man greift nur auf sie zu, wenn sie übergeben wurden. Ganz egal, ob sie superblobal sind, oder was auch immer. Da gibt es Designregeln.
Somit ist eine Kopie per Value sowieso /immer/ dabei, da man die superglobale Variable niemals ändert. Theoretisch kann man sie ja auch per Referenz übergeben, aber das ist nur sinnvoll, wenn es um große Arrays geht: Ob du den zahlenwert, oder die Adresse kopierst, ist egal. Nur dauert die Referenzmagie in PHP ewig, da wir den recht natürlichen Mechanismus auf höhere Ebene nachgebaut in Verwendung haben. Somit ist eine Übergabe per Value sinnvoller als Referenz.
Dh. hat man in seinem Modul immer eine Kopie mit einem anderen Namen:
function foo ( $IchBinEineGlobaleVariable ) { }
Somit arbeitet man im Modul sowieso mit einem anderen Namen. Wenn man es noch eleganter macht, ist die Seite ein riesiges Objekt. Somit hat sich die ganze Geschichte sowieso erledigt.
Es geht doch darum, das diese Diskussion auf einen allgemeinen schlechten Programmierstil zurück geht. Wenn man es elegant macht, dann sind alle funktionalitäten in Modulen untergebracht und man greift nur auf sie zu, wenn sie übergeben wurden. Ganz egal, ob sie superblobal sind, oder was auch immer. Da gibt es Designregeln.
Das ist klar, aber man kann nicht erwarten, dass jemand von der $page = $_GET['page']-Schreibweise auf eine modulare Anwendungsbasis wechselt. Gerade weil ersteres schon ein Schritt in eine ganz andere Richtung ist.
Dass Designregeln wichtig sind, musst du mir bestimmt nicht sagen. Es get mir nur mehr darum, dass ich bei der fraglichen Codezeile nicht denke: „Warum wird die Funktionalität nicht in einer Funktion / einem Objekt durchgeführt?“ sondern grunsätzlich mal „Warum so umständlich?“
Letztendlich sehe ich darin auch den Weg zu besserem Stil. Designregeln und Standards haben keinen Sinn, wenn sie nicht verstanden werden.
Somit arbeitet man im Modul sowieso mit einem anderen Namen. Wenn man es noch eleganter macht, ist die Seite ein riesiges Objekt. Somit hat sich die ganze Geschichte sowieso erledigt.
Volle Zustimmung.
Das ist klar, aber man kann nicht erwarten, dass jemand von der $page = $_GET['page']-Schreibweise auf eine modulare Anwendungsbasis wechselt.
Um ehrlich zu sein, erwarte ich das von jedem, der eine Scriptsprache lernt. :P So schwierig ist das doch nicht, wenn man das Andere ein wenig kann. ;)
Vergiss nicht, das man im Normalfall eben genau damit anfängt.
Vergiss nicht, das man im Normalfall eben genau damit anfängt.
Ja, hab ich leider versäumt >.<
Um ehrlich zu sein, erwarte ich das von jedem, der eine Scriptsprache lernt. :P So schwierig ist das doch nicht, wenn man das Andere ein wenig kann.
Nein, meine auch den direkten Sprung zur besseren Variante.
Niji-chan
08.06.2007, 12:03
Wie frage ich am besten ab, ob eine URL, bzw. ein Pfad existiert, bzw. in einem Ordner überhaupt etwas enthalten ist?
drunken monkey
08.06.2007, 12:16
Wie frage ich am besten ab, ob eine URL, bzw. ein Pfad existiert, bzw. in einem Ordner überhaupt etwas enthalten ist?
$datei = "filename.ext";
$datei_existiert = file_exists($datei);
// true, falls die Datei existiert
$dir = "foo/bar";
$verzeichnis_ist_leer = (count(scandir($dir)) < 3);
// true, falls das Verzeichnis leer ist
Ich hoffe, dass zweiteres immer funktioniert, alternativ kannst du noch prüfen, ob scandir($dir) als 1. und 2. Element wirklich nur "." und ".." enthält.
Niji-chan
08.06.2007, 12:25
thx!
Darf ich noch einen Stilistischen Tipp geben?
Nutzt doch bitte bei sowas switches. Wesentlich komfortabler, sicherer und weiß der geier was nicht noch alles...
switch(TRUE) {
case(file_exists($_GET['page'])):
include($_get['page']);
break;
default:
include("404.php");
break;
}
Sieht schöner aus, ist stilistisch besser und vorallem kürzer.
Sieht schöner aus, ist stilistisch besser und vorallem kürzer.
include ( file_exists($_GET['page']) )? $_GET['page'] : "bar.php";
Diese Variante braucht ein paar tausend Sprünge weniger, und ist zu bevorzugen. Mit ein paar Tausend meine ich tatsächlich eine ganz kleine Anzahl, die wirklich minimal ist.
Schon. Aber der Trinitätsoperator ist nicht so bekannt. Außerdem wollte ich bei der Switchmöglichkeit eigentlich nur noch Möglichkeiten geben bestimmte Werte auch eifnach durch bestimtme Seiten zu ersetzen. Wenn beispielsweise einfach nur eine ID angegeben wurde, die einen ebstimmten Zweck erfüllen soll.
Verschachtelte Trinitätsoperatoren werden nämlich leicht unübersichtlich.^^
Aber in einem gebe ich dir vollkommen Recht: Bei nur dieser einen Überprüfung ist es schneller und besser.
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.