it-swarm.com.de

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

Wie füge ich eine Datei hinzu, die mehr als 2 Verzeichnisse zurück hat? Ich weiß, du kannst ../index.php, um eine Datei einzuschließen, die 2 Verzeichnisse zurückliegt, 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 in /game/forum/files/index.php und verwendet PHP include, um eine Datei einzuschließen. Die Datei befindet sich in /includes/boot.inc.php; / ist das Stammverzeichnis.

82
Marcus

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

../../index.php

Dies wären zwei Verzeichnisse.

137
Konrad Rudolph

Verwenden Sie '../file', Um eine Datei einzufügen, die ein Verzeichnis zurückliegt. Verwenden Sie für zwei Verzeichnisse zurück '../../file'. Und so weiter.

Realistisch gesehen sollten Sie 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 Verknüpfungen zu anderen Dateien herstellen können, während Sie diese Verknüpfungen 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.

49
Dan Hulton
. = current directory
.. = parent directory

So ../ holt Sie ein Verzeichnis zurück, nicht zwei .

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

27
Joe Skora
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 zu der Position des aktuellen Skripts zu sein, an der sich dieser Code befindet (welcher Ort wahrscheinlich stabil ist, da Sie definieren die Architektur Ihrer Anwendung. Dies unterscheidet sich von der Ausführung von include '../../index.php'das relativ zum ausführenden (auch "aufrufenden") Skript und dann relativ zum aktuellen Arbeitsverzeichnis ausgeführt wird , das auf das übergeordnete Skript verweist Das schließt Ihr Skript ein, anstatt es vom Pfad Ihres eingeschlossenen 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, prüft include schließlich das 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 dieses:

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

Geben Sie in parent.php Folgendes ein:

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

Geben Sie in sub/included.php Folgendes ein:

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

Ergebnis beim Zugriff auf 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 parent.php Aufgelöst, während mit dem Trick dirname(__FILE__).'/path' das Include aus dem Skript included.php wo der Code eingefügt wird.

Beachten Sie, dass das Folgende NICHT dem obigen Trick entspricht, im Gegensatz zu dem, was an anderer Stelle gelesen werden kann:

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

Das Voranstellen von / Funktioniert zwar, wird jedoch genauso wie include ../../index.php Aus dem aufrufenden Skript aufgelöst (der Unterschied besteht darin, dass include_path Nicht nachgeschaut wird, wenn es fehlschlägt). Von PHP doc :

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

17
gaborous

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

Das Definieren von Konstanten kann die Verwirrung verringern, da Sie in Verzeichnisversen rückwärts vorwä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');

define (); reference

15
../../index.php 

14
bdukes
../../../includes/boot.inc.php

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

11
leek

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

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

Du kannst tun ../../directory/file.txt - Dies geht zwei Verzeichnisse zurück.

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

6
Ólafur Waage
../../../index.php

6
MazarD
../../../includes/boot.inc.php
5
HAXEN

Aber seien Sie [~ # ~] sehr [~ # ~] vorsichtig, wenn Sie einen Benutzer die Datei auswählen lassen. Sie möchten nicht wirklich zulassen, dass sie eine Datei mit dem Namen "Zum Beispiel" erhalten.

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

oder andere vertrauliche Systemdateien.

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

5
ZombieSheep

Ich empfehle, __DIR__ Zu verwenden, um aktuelles PHP-Dateiverzeichnis anzugeben. Überprüfen Sie hier für den Grund.

__DIR__ . /../../index.php
4
Kris Roofe

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, um wie viele Stufen es sich handelt

dirname referance

3
ron

wenn Sie das / Am Anfang des Includes wird das Include als Pfad vom Stammverzeichnis der Site verwendet.

wenn Ihre Site http://www.example.com/game/forum/files/index.php ist, können Sie ein Include zu /includes/boot.inc.php hinzufügen, das sich zu - auflöst. http://www.example.com/includes/boot.inc.php .

Du musst vorsichtig sein mit .. Traversal, da einige Webserver es deaktiviert haben; Es verursacht auch Probleme, wenn Sie Ihre Site auf einen neuen Computer/Host verschieben möchten und die Struktur ein wenig anders ist.

2
Mauro

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

Z.B. Sie sind in root/inc/usr/ap und es gibt ein anderes Verzeichnis root/2nd/path. Sie können auf das Verzeichnis path über ap wie folgt zugreifen: ../../2nd/path Gehen Sie zuerst in das Stammverzeichnis als das gewünschte Verzeichnis. Wenn nicht funktioniert bitte teilen.

2
khan

einschließlich über Verzeichnisse kann von Proxy-Datei verarbeitet werden

  • root
  • ..... | __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';
    
2
allenn

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

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

und der http-Server (Apache 2.4.3) hat den internen Fehler 500 zurückgegeben.

Als ich den Pfad zu änderte

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

alles ist gut.

1
Bronek

Versuchen Sie 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');
0
rajpoot rehan