Der relative Pfad in require_once funktioniert nicht

103

Ich habe die folgende Struktur

otsg
 > class
   > authentication.php
   > database.php
   > user.php
 > include
   > config.inc.php
   > encryption.php
   > include.php
   > session.php
 > index.php
 > registration.php

Die Datei include.php enthält Folgendes

ini_set('display_errors', 1);
error_reporting(E_ALL);

ini_set('include_path',ini_get('include_path').':/Applications/MAMP/htdocs/otsg/:');
require_once 'config.inc.php';
require_once '../class/database.php';
require_once '../class/user.php';
require_once 'encryption.php';
require_once 'session.php';
require_once '../class/authentication.php';

und in die index.php Seite hatte ich aufgenommen

require_once 'include/include.php';

Wenn ich die Seite index.php öffne, erhalte ich die folgende Warnung und einen schwerwiegenden Fehler. Ich verstehe nicht, was diesen Fehler verursacht. Wenn ich den absoluten Pfad angegeben habe, funktioniert es. Aber absoluter Weg ist keine gute Idee, glaube ich.

Warning: require_once(../class/database.php) [function.require-once]: failed to open stream: No such file or directory in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

Fatal error: require_once() [function.require]: Failed opening required '../class/database.php' (include_path='.:/Applications/MAMP/bin/php5.3/lib/php:/Applications/MAMP/htdocs/otsg/include/:') in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

Danke im Voraus

user525146
quelle
Normalerweise mache ich Objective-C und versuche, PHP-Skripte in die Hände zu bekommen. Es ist traurig zu sehen, dass ich bereits 2 Stunden damit verbracht habe, herauszufinden, wie man Dateien korrekt in PHP einbindet. Mit X-Code ist das ganz einfach.
Rohan-Patel
Dieser Fehler tritt häufig auf, und um ihn schnell zu beheben, führen Sie die folgenden Schritte aus: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

Antworten:

216

Verwenden

__DIR__

um den aktuellen Pfad des Skripts abzurufen, sollte dies Ihr Problem beheben.

So:

require_once(__DIR__.'/../class/user.php');

Dies verhindert Fälle, in denen Sie ein PHP-Skript aus einem anderen Ordner ausführen können und daher die Pfade der Verwandten nicht funktionieren.

Bearbeiten: Schrägstrichproblem behoben

Auferstanden
quelle
42
Achtung! __DIR__ist neu in PHP 5.3. Wenn Sie dieses Skript für frühere Versionen von PHP benötigen, sollten Sie es dirname(__FILE__)stattdessen verwenden.
Charles
27
Beachten Sie, dass Sie den abschließenden Schrägstrich nachher manuell einfügen sollten __DIR__. Also: require_once(__DIR__.'/../class/user.php'); Gemäß der Dokumentation wird der abschließende Schrägstrich mit Ausnahme des Stammverzeichnisses weggelassen.
Ariel Allon
9
Danke für die Hilfe, aber ich verstehe immer noch nicht, warum __DIR__das notwendig ist. Die PHP-Dokumente scheinen zu sagen, dass PHP standardmäßig das Verzeichnis des aktuellen Skripts durchsucht. Kann jemand etwas Licht ins Dunkel bringen?
David
1
@ David Ich denke, dies wird benötigt, wenn Sie eine Datei von 2 Stellen gleichzeitig importieren. Zum Beispiel haben Sie eine Datei mit require "../a.php". Wenn diese Datei aus einer anderen Datei (x) in dir1/dir2/x.phpder enthaltenen Datei importiert wird, ist dies der Fall dir1/a.php, aber wenn x vorhanden ist dir1/dir2/dir3/x.php, ist die enthaltene Datei dir1/dir2/a.phpusw. Oder irre ich mich?
José Ramón
1
Es gibt jetzt eine Checkliste zur Fehlerbehebung für diesen häufigen Fehler hier: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew
17

für PHP Version 5.2.17 __DIR__wird nicht funktionieren, es wird nur mit PHP 5.3 funktionieren

Aber für ältere Version von PHP dirname(__FILE__)perfekt

Zum Beispiel so schreiben

require_once dirname(__FILE__) . '/db_config.php';
Mobile Tech.
quelle
1

In meinem Fall funktioniert es nicht, auch wenn __DIR__oder getcwd()es immer wieder den falschen Pfad auswählt. Ich habe das Problem gelöst, indem ich in jeder Datei, die ich benötige, einen Costant mit dem absoluten Basispfad des Projekts definiert habe:

if(!defined('THISBASEPATH')){ define('THISBASEPATH', '/mypath/'); }
require_once THISBASEPATH.'cache/crud.php';
/*every other require_once you need*/

Ich habe MAMP mit PHP 5.4.10 und meine Ordnerhierarchie ist ähnlich:

q.php 
w.php 
e.php 
r.php 
cache/a.php 
cache/b.php 
setting/a.php 
setting/b.php

....

linuxatico
quelle
0

Ich bin gerade auf dasselbe Problem gestoßen, bei dem alles gut funktioniert hat, bis zu dem Punkt, an dem ich ein Include in einem anderen Include hatte.

require_once '../script/pdocrud.php';  //This worked fine up until I had an includes within another includes, then I got this error:
Fatal error: require_once() [function.require]: Failed opening required '../script/pdocrud.php' (include_path='.:/opt/php52/lib/php')

Lösung 1. (unerwünschte Hardcodierung meines öffentlichen HTML-Ordnernamens, aber es funktioniert):

require_once $_SERVER["DOCUMENT_ROOT"] . '/orders.simplystyles.com/script/pdocrud.php';

Lösung 2. (unerwünschter Kommentar oben über DIR funktioniert erst seit PHP 5.3, aber es funktioniert):

require_once __DIR__. '/../script/pdocrud.php';

Lösung 3. (Ich kann keine Nachteile erkennen und es funktioniert perfekt in meinem PHP 5.3):

require_once dirname(__FILE__). '/../script/pdocrud.php';
hamish
quelle