PHP Include mit relativen Pfadangaben

el dios

Ensign
Registriert
Mai 2008
Beiträge
162
Hallo zusammen,

ich versuche bei einer kleinen Website PHP einzusetzen. Auch nur in ganz einfacher Form, da sich alles andere nach meinem derzeitigen Kenntnissstand nicht lohnt. Leider gerate ich da an ein kleines Problem:

Ich versuche den Header(eine Grafik sowie ein Menü) über ein PHP-Include in meine jeweiligen Dateien einzubinden. Das klappt im Rootverzeichnis auch noch problemlos, führt jedoch zu Problemen, wenn ich in ein Unterverzeichnis wechsle. Dann nämlich stimmen meine relativen Pfadangaben aus der header.html nicht mehr.

Jetzt ist meine Frage, ob beispielsweise ein Tag existiert, das angibt in welcher Ebene ich mich befinde oder dies manipulieren kann. Nach dem Motto: "Ich befinde mich nun eine Ebene tiefer, also muss allen Pfadangaben ein '../' vorangestellt werden".

Oder ist mein Ansatz generell falsch und es gibt eine andere Lösung des Problems?

Ich hoffe, dass ich das Problem verständlich beschreiben konnte und ihr mir helfen könnt. Danke dafür schon mal im Voraus :)

Gruß
eL dios

HTML:
<div id="header">
<img src="grafiken/header.png" width="900" height="200" alt="Header" />
</div>



<div class="menu" >
<ul>
<li><a class="hide" href="#">Der Verein</a>

<ul>
<li><a href="verein/vorstand.php">Vorstand</a></li>
<li><a href="index.php">Einleitung</a></li>
<li><a href="verein/anlage.php">Unsere Anlage</a></li>
<li><a href="verein/schulbetrieb.php">Schulbetrieb</a></li>
<li><a href="verein/jugend.php">Jugendarbeit</a></li>
<li><a href="verein/casino.php">Casino</a></li>
<li><a href="verein/kosten.php">Kosten</a></li>
<li><a href="verein/hpf.php">Heilp&auml;d. F&ouml;rderung</a></li>
</ul>

</li>
<li><a class="hide" href="#">Termine</a>

<ul>
<li><a href="termine/veranstaltungen.php">Veranstaltungen</a></li>
<li><a href="termine/hallenplan.php">Hallenplan</a></li>
</ul>

</li>
<li><a class="hide" href="#">Downloads</a>

<ul>
<li><a href="downloads/downloads.php">Downloads</a></li>
</ul>
</li>

</ul>

</div>
 
Brauchst du die Pfade denn relativ?
Sonst würde ich einfach immer vom root Verzeichnis ausgehen und Pfade mit / beginnen.
Ansonsten gibts schon so sachen wie $_SERVER["DOCUMENT_ROOT"], $_SERVER['PHP_SELF'], $_SERVER['SCRIPT_NAME'], __FILE__ etc...

Musst du aber etwas aufpassen, das wird schnell genauso unübersichtlich, weil da einige auf andere Art zum selben Ergebnis führen und dann doch irgendwo nich tmehr funktionieren und du kannst damit auch Sicherheitslöcher in deine Seite bauen.
 
include() und require() ändern doch nix am Pfad... Relevant ist hier nicht der Ort, der inkludiert wird, sonder der Ort, von dem aus inkludiert wird. Wenn also die index.php ein include("inc/header.php") enthält, dann sind alle Pfade innerhalb der header.php immer noch relativ zum Docroot, nicht zu ../inc/
 
Danke schon mal für die schnellen Antworten.

@znrl: Ich hätte die Pfade gerne relativ, da ich dann offline testen kann mit den geänderten Dateien und mich durch die Pages klicken kann.

@Suxxess: Leider habe ich keine Ahnung wie man das anstellt, da ich dann dasselbe Problem vermute... Da ich mich mit der Materie aber auch nicht so gut auskenne, lasse ich mich da gerne eines Besseren belehren ;)

@Daaron: Ganz genau das ist mein Problem.
Mein root-Verzeichnis sieht in etwa (gekürzt) so aus:
  • downloads (Verzeichnis)
  • grafiken (Verzeichnis)
  • termine (Verzeichnis)
  • verein (Verzeichnis)
  • index.php
  • format.css
  • menue.css
  • header.html

Wenn ich nun aus der Header.html heraus verlinke und das in der index.php include, funktioniert es bestens. Wenn ich mich nun aber in verein/vorstand.php befinde, bin ich eben eine Ebene tiefer, d.h. meine Pfadangaben aus der header.html, welche im root liegt, klappen nicht mehr.
 
...so macht mans aber auch nicht....
Mach Nägel mit Köpfen, lass alles über die index.php laufen und fülle von ihr ausgehend den Kram mit Inhalt.
 
Wäre eine Variante, das ist richtig.

Schicker kann man das dann noch mit RewriteRules via mod_rewrite machen.
 
Wenn du lokal bspw. mit XAMPP die gleiche Verzeichnisstruktur hast sollte es auch mit Pfadangabe vom Root aus gehen (lässt sich zumindest recht problemlos so herrichten).

Ja so oder eben mit www.domainxyz.de/vorstand aufrufen, und über PHP oder .htaccess und mod rewrite Serverseitig auf www.domainxyz.de/index.php?page=vorstand umschreiben, dann hast du "schöne" urls

Vorteil ist, dass du nur den Inhalt in einer externen Datei oder Datenbank hast und sehr einfach globale Änderungen am Design vornehmen kannst ohne gleich bei 20 Seiten das selbe ändern zu müssen.

Da bist du dann auch schon beim ersten Schritt zum CMS.
 
Znrl schrieb:
Vorteil ist, dass du nur den Inhalt in einer externen Datei oder Datenbank hast und sehr einfach globale Änderungen am Design vornehmen kannst ohne gleich bei 20 Seiten das selbe ändern zu müssen.

Genau das ist der Grund, weshalb ich das so machen wollte. Müsste nämlich jetzt einen Menüpunkt anpassen und habe ehrlich gesagt keine Lust, das jetzt wieder in jeder einzelnen Datei zu machen. Da strukturiere ich das Ganze lieber einmal neu und spare mir später die Zeit...

Vielen Dank also, habt mir sehr geholfen :)
 
Ja, wenn man sich das selbst beibringt ist das der Weg.

Zur zentralen index.php kommst du dann eben, wenn du jetzt dann noch irgendwelche meta Daten bspw. ne zweite CSS Datei haben willst musst du wieder in 20 Seiten den HTML head ändern musst und merkst dann, dass du das ja schon bei der Navigation hattest und vtl. auch mal für den Footer brauchst.

Also wird alles was irgendwie mehrfach auf den Seiten vorkommt extra gespeichert. es bleibt quasi nurnoch:
HTML:
<!DOCTYPE html>
<html>

<head>

<?php include("head.php"); ?>

</head>

<body>
<?php include("nav.php"); ?>
<?php include("content.php"); ?>
<?php include("footer.php"); ?>
</body>
</html>

Etwas vereinfacht natürlich.
 
Na ja, das ist viel zu sehr vereinfacht. Dein Ansatz scheitert, sobald du (wie es sich gehört) für jede Seite einen eigenen <title> sowie Meta Description & Keywords, evtl. noch eigene OpenGraph-Tags, haben willst.

Ja, von der index.php per Parameterübergabe (und optionalem URL Rewriting) eine Datei pro "Unterseite" zu inkludieren ist sinnvoll, aber nicht indem man einfach den Inhalt in einen zentralen Content-Container inkludiert. Viel besser wäre ein Ansatz, wo die Unterseiten-PHP's verschiedene Variablen vorbelegen für Head, Content,... Wenn alle Variablen belegt sind baut die index.php daraus dann den endgültigen Code (z.B. über ne kleine selbstgeklimperte Template-Engine). Das ermöglicht es, dass eine Unterseite auch mal variable Heads, ne andere Navigation oder n speziellen Footer hat, nicht nur eigenen Content. Eine Unterseite könnte somit sogar einen Redirect Header setzen, was anders nicht machbar ist.
 
@Daaron
da muss ich dir widersprechen, denn innerhalb von head.php, incl. allen anderen includierten dateien, kannst du diese daten dynamisch generieren lassen - analog zu der weise wie du content.php unterschiedlich befuellen wuerdest.

persoenlich bevorzuge ich eine uri ohne parameter [sofern nicht erforderlich order sich dadurch gravierende vorteile dadurch ergeben - z.b. such caching].
wenn man lediglich mit 'pseudo'-pfaden wie z.b. www.domainxyz.de/vorstand arbeitet ist es meiner meinung nach die flexibelste weise. den vorteil geniesst man allerdings erst richtig wenn man sich eine art request-handler baut und dort, je nach anfrage, unterschiedlich agiert.
 
Wenn du das Erzeugen der SEO-Daten in der head.php machen willst, brauchst du ne zentrale "Anlaufstelle" für selbige Daten, also ne Datenbank. Mein Ansatz kommt hier noch ohne DB aus.
 
zwar waere eine datenbank von vorteil aber noetig ist sie definitiv nicht.

hier ein kurzes und vereinfachtes beispiel der head.php:
Code:
<?php
	switch(strtolower($_SERVER['REQUEST_URI'])){
		case '/vorstand':
		case '/vorstand/':
			$title = 'der vorstand';
			$siteName = 'og vorstand';
			echo '<link rel="stylesheet" type="text/css" href="/vorstand.css" />';
			break;
		case '/':
			$title = 'home';
			$siteName = 'og home';
			break;
	}
?>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="/layout.css" />
<meta property="og:site_name" content="<?php echo $siteName; ?>" />
<title><?php echo $title; ?></title>

natuerlich koennte man das beliebig verschachteln und/oder weiter auslagern.
 
Wird hochgradig unübersichtlich, spätestens wenn du noch etwas mehr als nur <title> füllen willst.
 
nein, genau das macht es doch uebersichtlich. gut, evtl. waere es besser gewesen das bspl auf basis des auslagern zu schreiben...also in etwa so:
Code:
<?php
	switch(strtolower($_SERVER['REQUEST_URI'])){
		case '/vorstand':
		case '/vorstand/':
			// innerhalb der einzelnen dateien wird $title etc gesetzt
			require_once $_SERVER['DOCUMENT_ROOT'].'/foo/bar/head/vorstand.php';
		case '/':
			require_once $_SERVER['DOCUMENT_ROOT'].'/foo/bar/head/default.php';
			break;
	}
?>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="/layout.css" />
<meta property="og:site_name" content="<?php echo $siteName; ?>" />
<title><?php echo $title; ?></title>
 
So etwas habe ich damals, als ich in PHP anfing, auch gemacht. Damals, als ich noch keine Ahnung hatte und mir nichts besseres einfiel erschien mir das noch als ideale Lösung. Ist es aber nicht. Für kleine Seiten mag es durchaus funktionieren, es wird aber schnell unübersichtlich und hässlich, je mehr Seiten dazukommen.
 
Zurück
Oben