PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Include aus verschieden tiefen Unterordnern



peschmae
15-02-2006, 19:06
Guten Abend,

erst mal gleich zum voraus: Ich habe null Plan von PHP (und eigentlich auch nicht wirklich vor das zu ändern ;)).

Das Problem: Ich habe eine Webseite in der sich wie überall gewisse Elemente wiederholen. Entsprechend hab ich die Sachen in separate Dateien ausgelagert und via php-Includes eingebunden.

Nicht sehr praktisch ist aber dass die relativen Pfade je nach dem wo ich bin im Ordnerpfad verschieden sind. Aber das geht noch so, hab ich halt angepasst.

Allerdings möchte ich jetzt in meiner footer.php-Datei jeweils n paar so kleine Icons einbinden. Die liegen in /banner:


<a href="http://validator.w3.org/check/referer">
<img src="banners/xhtml11.png"/>
</a>


nur passt das natürlich nicht wenn ich mich in /bla/zeugs befinde denn von dort aus währe der Pfad ../../banners/xhtml11.png.

Das schlauste was ich bisher gefunden habe ist ein Script was mir einfach .. an den Pfad anhängt bis es nicht mehr weitergeht. Aber das ist blöd.

MfG Peschmä

peschmae
15-02-2006, 19:09
Ich dödel, ist ja ganz einfach. Jetzt wo ich /banner geschrieben habe hab ich gerade festgestellt dass das ja geht und diese absoluten Pfade absolut zum Webserverroot sind. :D

Vielen Dank an Peschmae und das Forum für die tatkräftige Hilfe ;)

Und bei php kann man einfach den include_path setzen. Soso. Nett. :)

Hmm, aber so einfach geht das in Php irgendwie nicht. Tipps?
Also den Include-Path um den obersten Ordner erweitern der erreicht werden kann (halt document-root oder wie man dem sagt)


MfG Peschmä

Romanday
15-02-2006, 19:37
Vielen Dank an Peschmae und das Forum für die tatkräftige Hilfe ;)

Und bei php kann man einfach den include_path setzen. Soso. Nett. :)

Hmm, aber so einfach geht das in Php irgendwie nicht. Tipps?


MfG Peschmä

include_path wird glaube ich in den Apache configs gesetzt.
Ich versteh dein Problem noch nicht so richtig. Du kannst doch
includieren was du willst, und bekommst auch noch einen
Rückgabewert, ob der include erfolgreich war.

http://www.php.net/manual/en/function.include.php

peschmae
15-02-2006, 19:54
Ja ich geb zu es ist n bisschen wirr ich versuchs noch mal ;)

Ordnerstruktur:

/webseite
/webseite/includes
/webseite/bla
/webseite/bla/blubb

Nun hab ich in jedem dieser Ordner eine index.php-Datei die einige Dateien aus dem Include-Ordner includen möchte. Das gibt dann Dinge wie
include("../../../../../include/include.php")
was recht unschön ist.

Ich möchte einfach
include("include.php") oder include("/include/include.php") machen können. (Für Bilder und Stylesheets geht das offenbar - der Browser weiss wo gucken; aber bei php geht das so nicht)

Die Serverconfig kann ich nicht ändern (bei mir schon natürlich aber nicht dort wo die Seite online ist).

MfG Peschmä

Romanday
15-02-2006, 20:18
Ja ich geb zu es ist n bisschen wirr ich versuchs noch mal ;)

Ordnerstruktur:

/webseite
/webseite/includes
/webseite/bla
/webseite/bla/blubb

Nun hab ich in jedem dieser Ordner eine index.php-Datei die einige Dateien aus dem Include-Ordner includen möchte. Das gibt dann Dinge wie
include("../../../../../include/include.php")
was recht unschön ist.

Ich möchte einfach
include("include.php") oder include("/include/include.php") machen können. (Für Bilder und Stylesheets geht das offenbar - der Browser weiss wo gucken; aber bei php geht das so nicht)

Die Serverconfig kann ich nicht ändern (bei mir schon natürlich aber nicht dort wo die Seite online ist).

MfG Peschmä

include("../../../../../include/include.php")

Also, wenn sich dort eine Datei befindet, und die Rechte Okay sind,
sollte Sie includiert werden können. Ansonsten mal die Fehlermeldung posten.

Anonsten gibt auch noch die Funktion file_exists() um zu überprüfen,
ob die Datei auch im Pfad vorhanden ist.

http://www.php.net/manual/en/function.file-exists.php


Günstig auch mal <?phpinfo();?> aufzurufen um zu sehen wo du gerade bist
(in welchem Verzeichnis)

Ich würde das aber später etwas einfacher lösen z. B. mit:

define("PATH","webseite");
define("BILDER","pics");
define("FUNKTIONEN","includes");

Dann kannst Du dir bequem deinen Pfad zusammensetzen mit z. B.

include(PATH.'/'.FUNKTIONEN.'/datei.php');

peschmae
15-02-2006, 20:46
include("../../../../../include/include.php")

Also, wenn sich dort eine Datei befindet, und die Rechte Okay sind,
sollte Sie includiert werden können. Ansonsten mal die Fehlermeldung posten.

Wie ich geschrieben habe: Es funktioniert, aber es gefällt mir überhaupt ganz und gar nicht. Ich möchte lieber egal wo ich bin einfach include("include/include.php") hinschreiben können.

MfG Peschmä

Turbohummel
15-02-2006, 20:51
Pfade und Verzeichnisse

Tabelle G-5. Konfigurations-Optionen für Pfade und Verzeichnisse

Name Standard Änderbar
include_path PHP_INCLUDE_PATH PHP_INI_ALL
doc_root PHP_INCLUDE_PATH PHP_INI_SYSTEM
user_dir NULL PHP_INI_SYSTEM
extension_dir PHP_EXTENSION_DIR PHP_INI_SYSTEM
cgi.fix_pathinfo "0" PHP_INI_SYSTEM
cgi.force_redirect "1" PHP_INI_SYSTEM
cgi.redirect_status_env "" PHP_INI_SYSTEM
fastcgi.impersonate "0" PHP_INI_SYSTEM
cgi.rfc2616_headers "0" PHP_INI_SYSTEM


Hier eine kurze Erklärung der Konfigurationsoptionen:



include_path string
Hier können Sie eine Liste von Verzeichnissen angeben, in dem die Funktionen require(), include() und fopen_with_path() nach Dateien suchen. Das Format ist ähnlich zur PATH-Umgebungsvariablen des jeweiligen Systems: Eine Liste von Verzeichnissen, getrennt durch einen Doppelpunkt unter UNIX oder ein Semikolon unter Windows.

Beispiel G-1. include_path unter UNIX
include_path=".:/php/includes"

Beispiel G-2. include_path unter Windows
include_path=".;c:\php\includes"

Ein . in dieser Option ermöglicht, Dateien relativ zum aktuellen Verzeichnis einzubinden.

Dementsprechend den Pfad zum include-Verzeichnis angeben. Fertig.

undefined
15-02-2006, 20:55
/** In der Obesrten Ebene Von Document_Root Definiert! */
$r = realpath( __FILE__ );
$s = dirname( $r );
define( 'DOCROOT', $s . "/" );
unset( $r, $s );
ini_set( 'include_path', DEFAULT_INCLUDE_PATH . DOCROOT . "MeinBasisKlassenPfad" );


Siehe auch Globale Konstanten! get_defined_constants()

peschmae
16-02-2006, 07:49
@Turbohummel: Das ist schon klar. Die Frage ist auch: Wie mache ich das ohne (1) den Pfad ganz absolut anzugeben - der kann ja von System zu System ändern (2) ohne den immer ganz relativ anzugeben weil ../../../../.. einfach blöd ist

@undefined: Ja. Aber wie gehts dann weiter - ich meine ich tue das in die index.php in meinem DOCROOT. Wie kriege ich php dazu den include_path auch für andere php-Dateien so beizubehalten?
Insbesondere sollte der natürlich auch passen wenn man direkt zu einer Unterseite geht und gar nie die Seite im DOCROOT lädt.

MfG Peschmä

Romanday
16-02-2006, 08:22
@Turbohummel: Das ist schon klar. Die Frage ist auch: Wie mache ich das ohne (1) den Pfad ganz absolut anzugeben - der kann ja von System zu System ändern (2) ohne den immer ganz relativ anzugeben weil ../../../../.. einfach blöd ist

@undefined: Ja. Aber wie gehts dann weiter - ich meine ich tue das in die index.php in meinem DOCROOT. Wie kriege ich php dazu den include_path auch für andere php-Dateien so beizubehalten?
Insbesondere sollte der natürlich auch passen wenn man direkt zu einer Unterseite geht und gar nie die Seite im DOCROOT lädt.

MfG Peschmä

include_path ist eine Variable die Global gesetzt wird und somit auch in
jeder Datei verfügbar ist, ebenso wie __FILE__ + __LINE__.

Es gibt keine universellen Lösungen sondern nur individuelle in Abhängigkeit
von deinen Rechten.

gibt doch mal die einzelnen Variablen und Konstanten mit echo aus, von
@undefineds Script.

Der Rest ist Konkatenation.

undefined
16-02-2006, 08:26
Du hast ein Projekt Model Fehler.
In einer einzigen Datei auf der Root Ebene sagen wir mal sie heist Env.php
Stehen deine Umgbungsvariablen/Konstanten und Header Informationen.
Die Datei ziehst du in der Index auf die Zweite Zeile so das alle weiteren include Anweisungen erst von Env.php erben.
Wenn du aber aber jetzt eine Externe PHP Datei aus deinem Projekt aufrufen möchtest die nicht von Index.php included wird kannst du auch nicht diese Informationen erben. Weil ini_set() oder Konstanten immer vor dem Parsen des Dokumenten-baumes erstellt werden.
Du hast hier mehrere Möglichkeiten.
1) Du erlaubst in der apache.config das Setzen von Umbebungsvariablen mit php_value in der .htaccess und Konfigurierst in dieser deine gnazen Umgebungs-Variablen (siehe FILES Match)
2) Du verwendet in der apache.conf ein php_admin value und legst die Umgebungsvariablen fest.
3) Du legst in der apache.config das php.ini Value auto_prepend_file mit php_admin_value fest ( nicht zu empfehlen weil ob_handler dann keine Errors mehr ausgibt).
4) Du verwendest die Superglobale Konstante DOCUMENT_ROOT und ziehst in jeder Datei die Env.php aus dem DOCUMENT_ROOT Pfad.

Letzeres ist zu empfehlen weil es Plattform Übergreifend ist und keine Administrative eingriffe erfordert.

undefined
16-02-2006, 08:41
[Nachtrag]
Sagen wir mal deine Env.php liegt geschützt im Verzeichnis lib.



<document_root>
<lib> mit .htaccess geschützt (Order allow,deny Deny from all) nur local groups duerfen lesen!
<scripte>
<css>
<html>
<mypage>


Damit kannst du jetzt auf Lokaler Ebene innerhalb deines VirtualHost auf diese Datei Zugreifen.
Allen Anderen Hosts bleibt der Zugriff verweigert.


<?php
include_once( $_SERVER['DOCUMENT_ROOT'] . "/lib/Env.php" );
?>

peschmae
16-02-2006, 11:26
Danke, DOCUMENT_ROOT war genau das Ding was ich gesucht hatte. Das passt! :)

MfG Peschmä