Seite 1 von 1

PHP includes und relative Pfade

Verfasst: 07.10.2006, 11:24
von wuschba
Hallo!

Habe folgendes Problem: Ich möchte ein Script relativ anlegen, also dass es in jedem Verzeichnis läuft.

datei1.php4 soll also z.B. datei2.php includen:
hauptverzeichnis
- verzeichnis1
-- datei1.php4

- verzeichnis2
-- datei2.php4


Dazu schreibe ich in datei1.php4:
include "../verzeichnis2/datei2.php4".

Dann erhalten ich aber:
Warning: main(../verzeichnis2/datei.php4): failed to open stream: No such file or directory in [pfad]\hauptverzeichnis\verzeichnis1\datei1.php4 on line 2

Wieso funktioniert das nicht und wie mache ich es richtig? Der php-include-path enthält auch ".", also müßte es meiner Meinung nach oben funktionieren...

Verfasst:
von

Verfasst: 07.10.2006, 12:02
von Mr Omega
Wenn Deine index Datei in Deinem Hauptverzeichnis liegt und Du Deine datei1.php von dort includest musst Du die datei2.php in der datei1.php so includen
include("../../verzeichnis2/datei2.php");


hauptverzeichnis
*verzeichnis1
**datei1.php
*verzeichnis2
**datei2.php
*index.php

Verfasst: 07.10.2006, 12:21
von wuschba
Danke für Deine Antwort!

Huch, d.h. ich muß immer relativ zum Script, das eigentlich ausgeführt wird, includen?

Aber ich weiß ja in datei1.php4 gar nicht, ob datei1.php von /hauptverzeichnis/index.php included wurde oder von /hauptverzeichnis/wasweißich/nocheinpfad/ichbraucheauchdatei2.php

Verfasst: 07.10.2006, 12:25
von mcchaos
Du könntest es so machen:
include realpath(dirname(__FILE__)."/../verzeichnis2/datei2.php4");

Aber vielleicht hat ja jemand noch eine einfachere Lösung?!

Verfasst: 07.10.2006, 12:41
von Mr Omega
Sorry ich hatte da einen kleinen Denkfehler

Falsch --> include("../../verzeichnis2/datei2.php");

Richtig --> include("verzeichnis2/datei2.php");

Du musst immer von der obersten eben aus gehen.

Es Sei denn Du führst die Datei von hauptverzeichnis/verzeichnis1/datei1.php direkt aus, dann wäre include("../verzeichnis2/datei2.php"); richtig

Verfasst: 07.10.2006, 17:03
von net(t)worker
zur Not den include-path um "../", "../../" und "../../../" erweitern und

include("verzeichnis2/datei2.php");

verwenden..... :wink:

Verfasst: 08.10.2006, 17:20
von fornex
lol, oder am besten mit "../../../../../../../../" erweitern


chdir( $HTTP_SERVER_VARS["DOCUMENT_ROOT"] );

include 'verzeichnis2/datei2.php';
include 'verzeichnis1/datei1.php';

usw.

Verfasst: 08.10.2006, 18:01
von net(t)worker
fornex hat geschrieben: chdir( $HTTP_SERVER_VARS["DOCUMENT_ROOT"] );

include 'verzeichnis2/datei2.php';
include 'verzeichnis1/datei1.php';

usw.
könnte bei einigen scripten zu Probleme führen wenn du das aktuelle verzeichnis änderst....

Verfasst: 08.10.2006, 20:03
von fornex
net(t)worker hat geschrieben:könnte bei einigen scripten zu Probleme führen wenn du das aktuelle verzeichnis änderst....
es sollen grundsätzlich nur relative pfade angegeben werden. Falls man nen Brei im Script hat, werden immer Tausende Probleme auftauchen. chdir ist kein Allzweckmittel, nur ist die Verwendung logischer und resourcensparender.

Verfasst: 09.10.2006, 11:45
von twitch
Bei manchen Projekten regle ich das so:

define ('twg_pfad', $_SERVER['DOCUMENT_ROOT'].'/'); // steht in der Config-Datei

if (!defined('INCLUDED')) {
// relativen Pfad für jedes Document setzten
$ebene = strlen(substr(__FILE__, 0, strlen(__FILE__) - strlen(basename(__FILE__)) - 1));
if($ebene > strlen(twg_pfad)) {
$tmp_ebene = str_replace(twg_pfad,'',substr(__FILE__, 0, strlen(__FILE__) - strlen(basename(__FILE__)) - 1));
$tmp_ebene = explode('/',$tmp_ebene);
for($i=0;$i<sizeof($tmp_ebene);$i++) {
$pfad .= '../';
}
define('pfad',$pfad);
}else{
define('pfad', './');
}

// Verhindere Doppelte Includes
define ('INCLUDED', true);
}

Damit habe ich mit der Konstanten "pfad" immer den richtigen Pfad...
Kann auch umständlich sein :-)