Wie füge ich eine Datei über 2 Verzeichnisse zurück?

93

Wie fügen Sie eine Datei ein, die mehr als 2 Verzeichnisse enthält? Ich weiß, dass Sie ../index.phpeine Datei mit 2 Verzeichnissen zurückfügen können, aber wie machen Sie das mit 3 Verzeichnissen zurück? Macht das Sinn? Ich habe es versucht, .../index.phpaber es funktioniert nicht.

Ich habe eine Datei in /game/forum/files/index.phpund es verwendet PHP include, um eine Datei einzuschließen. Welches befindet sich in /includes/boot.inc.php; /das Stammverzeichnis sein.

hakre
quelle
1
Es ist eher wie PHP, nicht HTML ...
Kender
chdir ('' ../ '');
Maheshmnj

Antworten:

151

..wählt das übergeordnete Verzeichnis aus dem aktuellen aus. Dies kann natürlich verkettet werden:

../../index.php

Dies wären zwei Verzeichnisse.

Konrad Rudolph
quelle
1
@ Brian Nun, das ist Unsinn, du vergleichst Äpfel und Orangen. Sie haben Recht, dass hier ein defineverwendet wird, aber (1) das war hier nicht einmal die Frage. Und (2) Sie würden immer noch einen relativen Pfad in Ihrem verwenden define, es sei denn, Sie codieren tatsächlich den gesamten absoluten Serverpfad fest, und ich würde davon Abstand nehmen, da er nur Nachteile hat. Oder (die dritte Alternative) Sie können die Zeichenfolgenmanipulation verwenden, um das übergeordnete Verzeichnis aus dem (erweiterten) aktuellen Pfad zu extrahieren. Dies hat jedoch wiederum keine Vorteile für die Verwendung relativer Pfade.
Konrad Rudolph
Leider funktioniert dies möglicherweise auf einem Gerät und nicht auf einem anderen, /../funktioniert ../möglicherweise oder funktioniert möglicherweise nicht oder funktioniert auch nicht auf drei verschiedenen Computern mit genau derselben Umgebung
Douglas Gaskell,
@DouglasGaskell Nein, das ist falsch. Die relative Pfadnotation, einschließlich ../und ../../(Hinweis: kein führender Schrägstrich!), Funktioniert auf allen modernen Betriebssystemen. Es verwendete , um nicht arbeitet unter Windows und ( lange her) Mac , aber es funktioniert jetzt überall und hat zumindest in den letzten zehn Jahren. Wenn es irgendwo nicht funktioniert, liegt der Grund darin, dass die Dateistruktur unterschiedlich ist und / oder Sie sich in einem anderen Arbeitsverzeichnis befinden. Aber es hat nichts mit diesem Code zu tun.
Konrad Rudolph
Konrad, ich erwähne dies, da ich mich erst vor 10 Minuten mit diesem Problem befasst habe, nachdem ich ein Repository mit einem Kollegen mithilfe eines VM-Snapshots freigegeben hatte. Aus irgendeinem Grund mussten alle Wege /../statt ../auf seiner Umgebung haben.
Douglas Gaskell
@DouglasGaskell Und ich kann Ihnen mit Zuversicht sagen, dass der Fehler nichts damit zu tun hat. Tatsächlich /../macht der Pfad auf keinem System einfach Sinn (er entspricht /oder ist ein Fehler). Sind Sie sicher , dass Sie nicht einfügen etwas vor ihm?
Konrad Rudolph
51

Verwenden Sie, um eine Datei ein Verzeichnis zurück einzuschließen '../file'. Verwenden Sie für zwei Verzeichnisse zurück '../../file'. Und so weiter.

Realistisch gesehen sollten Sie jedoch keine Includes relativ zum aktuellen Verzeichnis ausführen. Was ist, wenn Sie diese Datei verschieben möchten? Alle Links würden brechen. Eine Möglichkeit, um sicherzustellen, dass Sie weiterhin Links zu anderen Dateien erstellen können, während Sie diese Links beibehalten, wenn Sie Ihre Datei verschieben, ist:

require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');

DOCUMENT_ROOT ist eine Servervariable, die das Basisverzeichnis darstellt, in dem sich Ihr Code befindet.

Dan Hulton
quelle
2
Hey Dan, kurze Frage: Sie sagen " realistisch gesehen 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 für die Verwendung von relativen und absoluten Links? Vielen Dank im Voraus!
Govind Rai
2
Ich denke, es fehlt ein Schrägstrich, es sollte sein: require_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ directory / directory / file');
user889030
@ User889030 Soweit ich weiß, ist dieser Schrägstrich zumindest in den meisten Fällen nicht erforderlich
BotMaster3000
1
@ BotMaster3000 hmmm: sandbox.onlinephpfunctions.com/code/…
user889030
27
. = current directory
.. = parent directory

So ../bekommt man ein Verzeichnis zurück nicht zwei .

Kette ../so oft wie nötig, um 2 oder mehr Level zu erreichen.

Joe Skora
quelle
21
include dirname(__FILE__).'/../../index.php';

ist hier die beste Wahl und vermeidet die meisten relativen Pfadfehler, die bei anderen Lösungen auftreten können.

In der Tat wird das Include gezwungen, immer relativ zur Position des aktuellen Skripts zu sein, an der dieser Code platziert ist (welcher Speicherort höchstwahrscheinlich stabil ist, da Sie die Architektur Ihrer Anwendung definieren). Dies unterscheidet sich von include '../../index.php' der einfachen Ausführung , die sich relativ zum ausführenden (auch als "aufrufend" bezeichneten) Skript und dann relativ zum aktuellen Arbeitsverzeichnis bezieht , das 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, überprüft include schließlich das eigene Verzeichnis des aufrufenden Skripts und das aktuelle Arbeitsverzeichnis, bevor ein Fehler auftritt.

Und der älteste Beitrag, den ich unter Berufung auf diesen Trick gefunden habe, stammt aus dem Jahr 2003 von Tapken .

Sie können mit folgendem Setup testen:

Erstellen Sie ein Layout wie folgt:

htdocs
¦   parent.php
¦   goal.php
¦
+---sub
    ¦   included.php
    ¦   goal.php

In parent.php, setzen Sie:

<?php
include dirname(__FILE__).'/sub/included.php';
?>

In sub/included.php, setzen Sie:

<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>

Ergebnis beim Zugriff parent.php:

WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php

Wie wir sehen können, wird der Pfad im ersten Fall aus dem aufrufenden Skript aufgelöst parent.php, während mit dem dirname(__FILE__).'/path'Trick das Einschließen aus dem Skript erfolgt, included.phpin dem der Code platziert ist.

Beachten Sie, dass das Folgende NICHT dem obigen Trick entspricht, der an anderer Stelle gelesen werden kann:

include '/../../index.php';

In der Tat funktioniert /das Voranstellen , aber es wird genau wie include ../../index.phpim aufrufenden Skript aufgelöst (der Unterschied besteht darin, dass include_pathes nicht nachgeschaut wird, wenn es fehlschlägt). Aus dem PHP-Dokument :

Wenn ein Pfad definiert ist - ob absolut (beginnend mit einem Laufwerksbuchstaben oder \ unter Windows oder / auf Unix / Linux-Systemen) oder relativ zum aktuellen Verzeichnis (beginnend mit. Oder ..) - wird der include_path vollständig ignoriert.

gaborous
quelle
@diEcho: darf ich wissen warum es "völlig falsch ist"? Ich verwende es für mehrere professionelle Anwendungen und diese Methode ist tatsächlich die einzige, die in jeder Situation funktioniert hat. Es ist auch im PHP-Handbuch beschrieben : Es kann nicht so falsch sein.
gaborous
Die erste Zeile ist völlig falsch. Sie können keine ..Mitte des Pfades hinzufügen (relativ / absolut).
DiEcho
@diEcho Ich sollte Sie auch auf das PHP-Handbuch verweisen
gaborous
Sagen Sie mir ein einziges Beispiel, in dem ..die Mitte des Includes verwendet wird. es sollte immer der erste Teil von include sein
diEcho
github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… Ein professionelles Modul für ein professionelles ERP / CRM. Sie, Sir, sollten nicht sprechen, wenn Sie nicht wissen, was Sie sagen.
gaborous
16

../ist ein Verzeichnis, Wiederholen Sie dies für zwei Verzeichnisse ../../oder sogar drei:../../../ und so weiter.

Das Definieren von Konstanten kann die Verwirrung verringern, da Sie vorwärts in Verzeichnisverse und rückwärts bohren

Sie könnten einige Konstanten wie folgt definieren:

define('BD', '/home/user/public_html/example/');

define('HTMLBD', 'http://example.com/');

Wenn Sie 'BD' oder mein 'Basisverzeichnis' verwenden, sieht es so aus:

file(BD.'location/of/file.php');

definieren(); Referenz

Brian Dillingham
quelle
15
../../index.php 

       

bdukes
quelle
12
../../../includes/boot.inc.php

Jede Instanz von ../bedeutet ein Verzeichnis hoch / zurück.

Lauch
quelle
9

Es gibt folgende Möglichkeiten, auf Ihre verschiedenen Verzeichnisse zuzugreifen:

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
user2951753
quelle
7

Sie können tun ../../directory/file.txt- Dies geht zwei Verzeichnisse zurück.

../../../- das geht drei. etc

Ólafur Waage
quelle
7
../../../index.php

         

MazarD
quelle
6

Seien Sie jedoch SEHR vorsichtig, wenn Sie einen Benutzer die Datei auswählen lassen. Sie möchten nicht wirklich zulassen, dass sie eine Datei mit dem Namen "z.

../../../../../../../../../../etc/passwd

oder andere vertrauliche Systemdateien.

(Entschuldigung, es ist schon eine Weile her, seit ich ein Linux-Systemadministrator war, und ich denke, dies ist eine vertrauliche Datei, soweit ich mich erinnere)

ZombieSheep
quelle
5
../../../includes/boot.inc.php
HAXEN
quelle
4

Wenn Sie PHP7 verwenden, können Sie die Dirname-Funktion mit dem Level-Parameter 2 verwenden, zum Beispiel:

dirname("/usr/local/lib", 2);

Der zweite Parameter "2" gibt an, wie viele Stufen höher sind

Referenzname Referenz

Ron
quelle
3

Einschließen von Over-Verzeichnissen kann per Proxy-Datei verarbeitet werden

  • Wurzel
  • ..... | __web
  • ..... | ......... | _requiredDbSettings.php
  • ..... |
  • ..... | ___ db
  • ..... | ......... | _dbsettings.php
  • ..... |
  • ..... | _proxy.php

    dbsettings.php:
    $host='localhost';
    $user='username':
    $pass='pass';
    
    proxy.php:
    include_once 'db/dbsettings.php
    
    requiredDbSettings.php:
    include_once './../proxy.php';
allenn
quelle
2

Versuchen Sie es ../../. Sie können es entsprechend ändern, da Sie zwei Verzeichnisse zurückerhalten. Greifen Sie zuerst zum Stammverzeichnis und greifen Sie dann auf das gewünschte Verzeichnis zu.

ZB Sie sind in root/inc/usr/apund es gibt ein anderes Verzeichnis root/2nd/path. Sie können wie folgt auf das pathVerzeichnis zugreifen ap: ../../2nd/pathGehen Sie zuerst zum Stammverzeichnis als gewünscht. Wenn nicht funktioniert, bitte teilen.

Khan
quelle
2

Wenn Sie das Include /zu Beginn des Includes einschließen, wird das Include als Pfad vom Stammverzeichnis der Site verwendet.

Wenn Ihre Website http://www.example.com/game/forum/files/index.php lautet , können Sie /includes/boot.inc.php ein Include hinzufügen, das in http://www.example.com aufgelöst wird /includes/boot.inc.php .

Sie müssen beim ..Durchlaufen vorsichtig sein, da es auf einigen Webservern deaktiviert ist. Dies führt auch zu Problemen, wenn Sie Ihre Site auf einen neuen Computer / Host verschieben möchten und die Struktur etwas anders ist.

Mauro
quelle
2

Versuche dies

Dieses Beispiel ist ein Verzeichnis zurück

require_once('../images/yourimg.png');

Dieses Beispiel ist zwei Verzeichnisse zurück

require_once('../../images/yourimg.png');
Rajpoot Rehan
quelle
Es ist genau das gleiche ;-) Ich denke du meinst '../../images/yourimg.png' auf dem zweiten?
Edwin
opps es ist mein Fehler
Rajpoot Rehan
1

Ich habe Ihre Antworten gesehen und den Include-Pfad mit Syntax verwendet

require_once '../file.php'; // server internal error 500

und http server (Apache 2.4.3) haben den internen Fehler 500 zurückgegeben.

Als ich den Pfad zu geändert habe

require_once '/../file.php'; // OK

alles ist gut.

Bronek
quelle