2012-04-10 4 views
0

Das ist im Grunde genommen soweit ich weiß. Ich kann einschließen oder require_once ein Skript, das keine hat includes/require_once, aber wenn es der Fall ist, dann wirft PHP mir diesen Fehler:PHP löst einen schwerwiegenden Fehler aus, wenn man versucht, ein Skript einzuschließen/zu benötigen, das ein anderes Skript enthält/benötigt

Warning: require_once(../constants/constants.php) [function.require-once]: failed to open stream: No such file or directory in C:\Home\Workspace\PHP\DD\src\log\test.php on line 7

Fatal error: require_once() [function.require]: Failed opening required '../constants/constants.php' (include_path='.;C:\Program Files\Xampp 1.7.7\php\PEAR') in C:\Home\Workspace\PHP\DD\src\log\test.php on line 7

Der Weg ist richtig. Ich fürchte, ich habe vielleicht eine Konfigurationsdatei des Apache-Webservers durcheinander gebracht (ich habe eine .htaccess-Datei erstellt, um mod_rewrite zu verwenden, um bessere URLs zu erstellen). Die .htaccess-Datei Inhalt ist gerade dies:

Options +FollowSymLinks

RewriteEngine on

RewriteRule !.(gif|jpg|png|css)$ index.php

Meine Apache Document-Root ist "C:/Home/Arbeitsbereich/PHP"


UPDATE: Ich fand heraus, dass eine absolute Verwendung Pfad funktioniert, wie folgt:

require_once $_SERVER['DOCUMENT_ROOT']."/DD/src/constants/constants.php";

Ich denke, ich werde nur relative Pfade dann nicht verwenden.

+2

Dies hat nichts mit Apache zu tun. Die Dateien, die das verschachtelte Include enthalten, müssen beim Einfügen die richtigen Pfade relativ zu sich selbst haben. '../ constants/constants.php' ist nicht an der richtigen Stelle basierend auf der Include-Datei. –

+0

@Michael Sie sollten dies als Antwort setzen. ;-) Verwenden Sie 'dirname (__ FILE __)', um das aktuelle Verzeichnis der php-Datei zu erhalten, unabhängig vom aktuellen Arbeitsverzeichnis, das für alle php-Dateien gleich ist, auch wenn sie sich in verschiedenen Verzeichnissen befinden. – Basti

Antwort

3

Der Grund dafür ist, dass die relativen Pfade aus der Datei mit dem ersten Require/Include stammen. wenn ich eine Gruppe von Dateien hatte zum Beispiel, die wie folgt aussah:

|--bar 
| |--foo 
| | |--foo.php 
| |--bar.php 
|--test.php 

wenn test.php hatte

require("./bar/bar.php") 

und bar.php hatte

require("./foo/foo.php") 

Dann würde dies nicht gelingen weil die relativen URLs relativ zum Arbeitsverzeichnis sein müssen (die oberste Datei, die das require/include genannt hat). Wenn ich bar.php zu require("./bar/foo/foo.php") änderte, würde das Programm erfolgreich abschließen. Der beste Weg, um sicherzustellen, dass dies nicht geschieht, ist, wie Basti sagte, keine relativen URLs zu verwenden. Es ist im Allgemeinen ratsam, verschiedene Funktionen wie dirname(__FILE__) zu verwenden, um die URLs zu erstellen.

Eine letzte Sache, die Rewrite-Regel in der .htaccess-Datei wird nichts tun, es manipuliert nur clientseitige URLs. Ich hoffe, das macht jede Verwirrung zunichte.

+0

Ich denke, ich habe es. Ich dachte, relative Pfade zu benutzen, war eine gute Übung, aber es scheint, dass ich mich geirrt habe. Ich habe versucht, mit dirname (__ FILE__), aber es hat nicht funktioniert. $ _SERVER ['DOCUMENT_ROOT'] scheint es jedoch zu tun. Danke für die Hilfe! :) – drakenation

+0

'dirname (__ DATEI __)'. Achten Sie auf die beiden "_". Weitere Informationen finden Sie im [PHP-Handbuch zu magischen Konstanten] (http://php.net/manual/en/language.constants.predefined.php). – Basti

+0

Ab 5.3 PHP hat '__DIR__' was äquivalent zu 'dirname (__ FILE __)' ist. – Maerlyn

Verwandte Themen