114

How do you include a file that is more than 2 directories back. I know you can use ../index.php to include a file that is 2 directories back, but how do you do it for 3 directories back? Does this make sense? I tried .../index.php but it isn't working.

I have a file in /game/forum/files/index.php and it uses PHP include to include a file. Which is located in /includes/boot.inc.php; / being the root directory.

4

19 に答える 19

175

.. selects the parent directory from the current. Of course, this can be chained:

../../index.php

This would be two directories up.

于 2008-10-02T15:10:07.637 に答える
53

ファイルを 1 つ前のディレクトリに含めるには、'../file'. 2 つのディレクトリを戻すには、'../../file'. 等々。

ただし、現実的には、現在のディレクトリに対してインクルードを実行するべきではありません。そのファイルを移動したい場合はどうしますか? すべてのリンクが壊れます。ファイルを移動した場合にそれらのリンクを保持しながら、他のファイルにリンクできるようにする方法は次のとおりです。

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

DOCUMENT_ROOTコードが配置されているベース ディレクトリを表すサーバー変数です。

于 2008-10-02T15:14:17.003 に答える
31
. = current directory
.. = parent directory

したがって、2つではなく1つのディレクトリ../が返されます

../2 つ以上のレベルを上げるために必要な回数連鎖します。

于 2008-10-02T15:12:13.933 に答える
23
include dirname(__FILE__).'/../../index.php';

ここでの最善の策であり、他のソリューションで発生する可能性のある相対パスのバグのほとんどを回避できます。

実際、インクルードは、このコードが配置されている現在のスクリプトの位置に対して常に相対的になるように強制されます (アプリケーションのアーキテクチャを定義するため、この位置はおそらく安定しています)。include '../../index.php' これは、実行中の (「呼び出し」とも呼ばれる) スクリプトに対して相対的にインクルードし、現在の作業ディレクトリに対して相対的にインクルードすることとは異なります。これは、インクルードされたスクリプトのパスから解決するのではなく、スクリプトを含む親スクリプトを指します。 .

PHPドキュメントから:

ファイルは、指定されたファイル パスに基づいてインクルードされます。何も指定されていない場合は、指定された include_path に基づいてインクルードされます。ファイルが include_path に見つからない場合、include は失敗する前に呼び出しスクリプト自身のディレクトリと現在の作業ディレクトリを最終的にチェックインします。

そして、このトリックを引用している私が見つけた最も古い投稿は、Tapken による 2003 年にさかのぼります。

次のセットアップでテストできます。

次のようなレイアウトを作成します。

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

parent.php、次のように入力します。

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

sub/included.php、次のように入力します。

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

アクセス時の結果parent.php:

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

ご覧のとおり、最初のケースでは、パスは呼び出し元のスクリプトから解決されますが、トリックparent.phpを使用して、コードが配置されているスクリプトからインクルードが行われます。dirname(__FILE__).'/path'included.php

他の場所で読むことができるものとは対照的に、次のトリックは上記のトリックと同等ではないことに注意してください。

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

実際、プリペンドは機能しますが、呼び出しスクリプトと/同じように解決されます (違いは、失敗した場合に後で検索されないことです)。PHPドキュメントからinclude ../../index.phpinclude_path

絶対パス (Windows ではドライブ文字または \、Unix/Linux システムでは / で始まる) または現在のディレクトリに対する相対パス (. または .. で始まる) が定義されている場合、include_path は完全に無視されます。

于 2012-08-23T15:29:17.760 に答える
16

../は 1 つのディレクトリです。2 つのディレクトリ../../または 3 つのディレクトリについても繰り返します:../../../など。

定数を定義すると、ディレクトリを順方向と逆方向にドリルダウンするため、混乱が軽減される場合があります。

次のようにいくつかの定数を定義できます。

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

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

「BD」または「ベースディレクトリ」を使用すると、次のようになります。

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

定義(); 参照

于 2012-08-14T13:57:08.553 に答える
15
../../index.php 

       

于 2008-10-02T15:09:51.803 に答える
12
../../../includes/boot.inc.php

Each instance of ../ means up/back one directory.

于 2008-10-02T15:10:54.763 に答える
9

これを試して

この例は 1 つ前のディレクトリです

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

この例は 2 つのディレクトリを戻します

require_once('../../images/yourimg.png');
于 2019-04-03T06:51:41.753 に答える
9

以下は、異なるディレクトリにアクセスする方法です:-

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
于 2013-11-13T05:51:14.947 に答える
7

You can do ../../directory/file.txt - This goes two directories back.

../../../ - this goes three. etc

于 2008-10-02T15:10:05.560 に答える
7
../../../index.php

         

于 2008-10-02T15:10:38.120 に答える
7

php7 を使用している場合は、次のように level パラメータを 2 にして dirname 関数を使用できます。

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

2番目のパラメーター「2」は、レベルアップの数を示します

ディレクトリ名参照

于 2016-12-06T06:34:33.027 に答える
6

ただし、ユーザーにファイルを選択させることには十分注意してくださいたとえば、次のようなファイルを取得することを本当に許可したくない

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

またはその他の重要なシステム ファイル。

(申し訳ありませんが、私が Linux のシステム管理者になってからしばらく経ちました。覚えている限り、これは機密ファイルだと思います)

于 2008-10-02T15:13:17.147 に答える
5
../../../includes/boot.inc.php
于 2008-10-02T15:10:07.183 に答える
3

プロキシファイルで処理できるオーバーディレクトリを含む

  • .....|__ウェブ
  • .....|............|_requiredDbSettings.php
  • .....|
  • .....|___デシベル
  • .....|.......|_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';
    
于 2014-04-10T21:07:06.280 に答える
2

インクルード/の先頭に を含めると、インクルードはサイトのルートからのパスとして取得されます。

サイトがhttp://www.example.com/game/forum/files/index.phpの場合、/includes/boot.inc.php にインクルードを追加すると、http://www.example.comに解決されます。 /includes/boot.inc.php .

..一部の Web サーバーではトラバーサルが無効になっているため、トラバーサルには注意する必要があります。また、サイトを新しいマシン/ホストに移動する必要があり、構造が少し異なる場合にも問題が発生します。

于 2008-10-02T15:15:58.153 に答える
2

試してみてください../../。2 つのディレクトリに戻るため、適宜変更できます。最初にルート ディレクトリに到達し、次に必要なディレクトリにアクセスします。

例: あなたは にいて、root/inc/usr/ap別のディレクトリがありroot/2nd/pathます。次のよう にpathディレクトリにアクセスできます。まず、目的のディレクトリよりもルートに移動します。機能しない場合は、共有してください。ap../../2nd/path

于 2012-09-15T13:04:48.343 に答える
1

私はあなたの答えを見て、構文でインクルードパスを使用しました

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

http サーバー (Apache 2.4.3) が内部エラー 500 を返しました。

パスを変更したとき

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

すべて順調。

于 2012-09-05T20:57:45.573 に答える