PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : include() immer vom main verzeichniss?


Distructive
04.01.2007, 23:01:59
Es gibt 2 Arten den Pfad einer Datei beim einzubinden anzugeben

1:

"../../sites/index.php" // also direkt

2:

"/sites/index.php" // also vom root-verzeichniss aus.

Ich bevorzuge die zweite Methode und es funktioniert immer. Nur bei PHP in der funktion

include() nicht. Dort funktioniert immer nur die erste Variante, also so:

include("../../sites/index.php");

aber so findet er es nicht:

include("/sites/index.php");


weis jemand wie ich das hinbekomme?

BenniG.
04.01.2007, 23:05:52
wo funktioniert das denn "immer"?
include-Pfade absolut zu machen ist quatsch, wenn kannst du eine Konstante definieren, die den Pfad zu deinem DocumentsRoot-Verzeichnis enthält und damit arbeiten..
Wie der absolute Pfad zu deinem Script ist bekommst du z.B. mit

echo __FILE__;

raus.

Beispiel:

define('DOC_ROOT',"/home/webusers/webx/html");

include DOC_ROOT . "/pfad/zur/datei.php";


Falls du mal auf einen anderen Provider wechselst, dein Provider etwas umstellt, oder du das Script jemand anderem geben willst hast du nämlich großen aufwand, wenn du die includes absolut machst.
Bei includes wird vom Dateisystem des Servers ausgegangen, NICHT von dem Verzeichnis das der Provider als dein DocumentRoot angegeben hat.

Bei Strato musst du zudem noch aufpassen, weil man sich auf $_SERVER['DOCUMENT_ROOT'] nicht verlassen kann..

Distructive
18.01.2007, 21:30:44
Ok das ist grundsätzlich eine super idee. die sache ist einfach das ich viele templates verwende und die in unterschiedliche seiten einbinde, daher muss ich immer vom main verzeichniss aus arbeiten, da die templates sonst nicht unterschiedlich eingebunden werden. Wie würdet ihr dann die DOC_ROOT Variable in jeder seite einbinden?

Ich habe mir überlegt es über ne session zu machen, doch dann geht dies nur bei usern die Cookies erlaubt haben. Ich würde es eben gerne so machen, dass ich das DOC ROOT nicht auf jeder seite neu einbinden muss. Also das ich das DOC_ROOT auch irgendwo in einem template anlege und das dann für alle seiten übernommen wird. Ich kann natürlich in jede seite direkt einmal das Template einbinden.

ABer einfach mal als Frage ob jemand eine vllt elegantere Lösung kennt.

meikel (†)
18.01.2007, 23:43:18
include-Pfade absolut zu machen ist quatsch,
1. sollte man tunlichst require verwenden. Dann gibt es wenigstens einen Fehler, wenn das File nicht gefunden wird.
2. ist es eben kein Quatsch, absolute Pfade zu verwenden. Natürlich definiert man die nicht in jedem require neu, sondern man setzt eine Konstante, die den "physikalischen" Pfad zum Document Root enthält. Leider liefert PHP bei großen Providern bisweilen unbrauchbare Angaben zum Document_root. Hier sollte man es mit $_SERVER['PATH_TRANSLATED'] versuchen.

Egal wie: die Aktion, den korrekten absoluten Pfad rauszukriegen, macht man einmal. Jut, wenn der Server explodieren sollte... dann fängt man eben von vorn an.

Ich habe es da einfacher, weil ich nur mit index.php
inkl. GET Parametern
/index.php?mode=tolles_script
oder PATH_INFO
/index.php/tolles_script/4711.html
arbeite.

Mir reicht also das aus, ...
define('PATH', dirname(__file__) . '/inc/');
... für ...
require(PATH . 'tolles_script.php');
... oder
set_include_path('.' . PATH_SEPARATOR . PATH);

rambi
19.01.2007, 15:44:14
Ich stimme Meikel uneingeschränkt zu!
Möchte es allerdings um einen praktischen Vorschlag erweitern...

Aus meiner Wühlkiste:
define('HOME_PATH',$_SERVER["DOCUMENT_ROOT"].dirname($_SERVER['PHP_SELF']).'/'); // Vorsicht: Siehe Beitrag von meikel

$pathArray = explode( PATH_SEPARATOR, get_include_path() );
$pathArray[] = HOME_PATH .'include/';
$pathArray[] = HOME_PATH .'include/tools/';
$pathArray[] = HOME_PATH .'include/classes/';
$pathArray[] = HOME_PATH .'include/classes/controller';
set_include_path(implode(PATH_SEPARATOR,$pathArray));

Und damit sind die include Pfade, ohne Schaden, absolut!!