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

Benutzer-Avatar
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:

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

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

    – BotMaster3000

    18. Januar 2018 um 12:36 Uhr

  • @BotMaster3000 hmmm: sandbox.onlinephpfunctions.com/code/…

    – Benutzer889030

    24. Januar 2018 um 4:54 Uhr

. = current directory
.. = parent directory

So ../ bekommt dich ein Verzeichnis zurück, nicht zwei.

Kette ../ so oft wie nötig, um 2 oder mehr Ebenen aufzusteigen.

Benutzer-Avatar
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.

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

Sie können mit dem folgenden Setup testen:

Erstellen Sie ein Layout wie dieses:

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

Im parent.phpstellen:

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

Im sub/included.phpstellen:

<?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 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.

Benutzer-Avatar
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:

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

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

Bei Verwendung von ‘BD’ oder meinem ‘Basisverzeichnis’ sieht es so aus:

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

definieren(); Hinweis

Benutzer-Avatar
Dippas

../../index.php 

../../../includes/boot.inc.php

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

1357900cookie-checkWie füge ich eine Datei über 2 Verzeichnisse zurück ein?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy