Wie füge ich eine Datei über 2 Verzeichnisse zurück ein?
Lesezeit: 6 Minuten
Wie bindet man eine Datei ein, die mehr als 2 Verzeichnisse zurück liegt. Ich weiß, dass Sie verwenden können ../index.php um eine Datei einzuschließen, die 2 Verzeichnisse zurück liegt, aber wie macht man das für 3 Verzeichnisse zurück? Macht das Sinn? Ich habe es versucht .../index.php aber es funktioniert nicht.
Ich habe eine Datei drin /game/forum/files/index.php und es verwendet PHP include, um eine Datei einzuschließen. Welches befindet sich in /includes/boot.inc.php; / das Root-Verzeichnis sein.
chdir(”../”);
– Mahesh Jamdade
20. März 2019 um 8:47 Uhr
.. wählt das übergeordnete Verzeichnis aus dem aktuellen aus. Natürlich kann dies verkettet werden:
../../index.php
Dies wären zwei Verzeichnisse weiter oben.
@Brian Nun, das ist Unsinn, du vergleichst Äpfel und Birnen. Du hast Recht, dass a define würde hier verwendet werden, aber (1) das war hier nicht einmal im Entferntesten die Frage. Und (2) Sie würden immer noch einen relativen Pfad in Ihrer verwenden define, es sei denn, Sie codieren tatsächlich den gesamten absoluten Serverpfad und ich würde davon absehen, da es nur Nachteile hat. Oder (die dritte Alternative) Sie könnten die String-Manipulation verwenden, um das übergeordnete Verzeichnis aus dem (erweiterten) aktuellen Pfad zu extrahieren, aber dies ist wiederum nicht der Fall irgendein Vorteile der Verwendung relativer Pfade.
– Konrad Rudolf
20. August 2012 um 9:24 Uhr
Leider kann dies auf einem Gerät funktionieren und auf einem anderen nicht. /../ kann funktionieren bzw ../ kann funktionieren, oder beides funktioniert möglicherweise nicht auf drei verschiedenen Computern mit genau derselben Umgebungskonfiguration
– Douglas Gaskell
4. Oktober 2017 um 17:23 Uhr
@DouglasGaskell Nein, das ist falsch. Die relative Pfadnotation, einschließlich ../ und ../../ (Hinweis: nein führenden Schrägstrich!), funktioniert auf allen modernen Betriebssystemen. Es gewöhnt an funktioniert nicht unter Windows und (lang vor) Macintosh, aber es funktioniert jetzt überall, und das seit mindestens zehn Jahren. Wenn es irgendwo nicht funktioniert, liegt das daran, dass die Dateistruktur anders ist und/oder Sie sich in einem anderen Arbeitsverzeichnis befinden. Aber es hat nichts mit diesem Code zu tun.
– Konrad Rudolf
4. Oktober 2017 um 17:31 Uhr
Konrad, ich erwähne dies, da ich mich erst vor nicht einmal 10 Minuten mit diesem Problem befasst habe, nachdem ich ein Repository mit einem Kollegen geteilt habe, indem ich einen VM-Snapshot verwendet habe. Aus irgendeinem Grund mussten alle Pfade haben /../ Anstatt von ../ auf sein Umfeld.
– Douglas Gaskell
4. Oktober 2017 um 18:07 Uhr
@DouglasGaskell Und ich kann Ihnen mit Zuversicht sagen, dass der Fehler nichts damit zu tun hat. Eigentlich der Weg /../ macht einfach auf keinem System Sinn (es ist äquivalent zu /, oder ein Fehler). Bist du sicher, dass du es nicht bist einfügen etwas davor?
– Konrad Rudolf
4. Oktober 2017 um 18:59 Uhr
Dan Hulton
Um eine Datei ein Verzeichnis zurück einzufügen, verwenden Sie '../file'. Verwenden Sie für zwei Verzeichnisse zurück '../../file'. Usw.
Realistischerweise sollten Sie jedoch keine Includes relativ zum aktuellen Verzeichnis ausführen. Was wäre, wenn Sie diese Datei verschieben wollten? Alle Verbindungen würden brechen. Eine Möglichkeit, um sicherzustellen, dass Sie immer noch auf andere Dateien verlinken können, während diese Links beibehalten werden, wenn Sie Ihre Datei verschieben, ist:
DOCUMENT_ROOT ist eine Servervariable, die das Basisverzeichnis darstellt, in dem sich Ihr Code befindet.
Hey Dan kurze Frage: Du sagst “Realistischerweise sollten Sie keine Includes relativ zum aktuellen Verzeichnis ausführen“. Was ist mit all den relativen Pfaden, die in den meisten HTML-Dokumenten verstreut sind? Wenn ich meine Datei verschieben würde, würden diese nicht auch kaputt gehen? Gibt es einen Standard, wann relative vs. absolute Links zu verwenden sind? Vielen Dank im Voraus!
– Govind Rai
10. November 2016 um 1:21 Uhr
Ich denke, es fehlt ein Schrägstrich, es sollte sein: require_once($_SERVER[‘DOCUMENT_ROOT’] . ‘/Verzeichnis/Verzeichnis/Datei’);
– Benutzer889030
6. Dezember 2017 um 18:46 Uhr
@ user889030 Soweit ich weiß, wird dieser Schrägstrich zumindest in den meisten Fällen nicht benötigt
So ../ bekommt dich ein Verzeichnis zurück, nicht zwei.
Kette ../ so oft wie nötig, um 2 oder mehr Ebenen aufzusteigen.
gierig
include dirname(__FILE__).'/../../index.php';
ist hier die beste Wahl, und es vermeidet die meisten relativen Pfadfehler, auf die Sie bei anderen Lösungen stoßen können.
In der Tat wird das Include dazu gezwungen, immer zu sein relativ zur Position des aktuellen Skripts wo dieser Code platziert wird (welcher Ort höchstwahrscheinlich stabil ist, da Sie die Architektur Ihrer Anwendung definieren). Das ist anders als nur zu tun include '../../index.php'die relativ zum ausführenden (auch “aufrufenden”) Skript und dann relativ zum aktuellen Arbeitsverzeichnis enthaltendas auf das übergeordnete Skript verweist, das Ihr Skript enthält, anstatt aus dem Pfad Ihres enthaltenen Skripts aufzulösen.
Aus der PHP-Dokumentation:
Dateien werden basierend auf dem angegebenen Dateipfad oder, falls keiner angegeben ist, dem angegebenen include_path eingeschlossen. Wenn die Datei nicht im include_path gefunden wird, checkt include schließlich das eigene Verzeichnis des aufrufenden Skripts und das aktuelle Arbeitsverzeichnis ein, bevor es fehlschlägt.
WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php
Wie wir sehen können, wird im ersten Fall der Pfad vom aufrufenden Skript aufgelöst parent.phpwährend durch die Verwendung der dirname(__FILE__).'/path' Trick, das Einbinden erfolgt aus dem Skript included.php wo der Code eingefügt wird.
Achtung, das Folgende entspricht NICHT dem obigen Trick, im Gegensatz zu dem, was an anderer Stelle gelesen werden kann:
include '/../../index.php';
In der Tat vorangestellt / wird funktionieren, aber es wird genauso gelöst include ../../index.php aus dem aufrufenden Skript (der Unterschied besteht darin, dass include_path wird nicht nachgesehen, wenn es fehlschlägt). Aus PHP-Dokument:
Wenn ein Pfad definiert ist – ob absolut (beginnend mit einem Laufwerksbuchstaben oder \ auf Windows- oder / auf Unix/Linux-Systemen) oder relativ zum aktuellen Verzeichnis (beginnend mit . oder ..) – wird include_path vollständig ignoriert.
im_brian_d
../ ist ein Verzeichnis, Wiederholen Sie dies für zwei Verzeichnisse ../../ oder sogar drei: ../../../ usw.
Das Definieren von Konstanten kann die Verwirrung verringern, da Sie in Verzeichnissen vorwärts und rückwärts vordringen
Sie könnten einige Konstanten wie folgt definieren:
chdir(”../”);
– Mahesh Jamdade
20. März 2019 um 8:47 Uhr