web-dev-qa-db-ja.com

2つのディレクトリにまたがるファイルを含めるにはどうすればよいですか?

3つ以上のディレクトリに戻るファイルをどのように含めますか。 ../index.phpを使用して2ディレクトリ前のファイルをインクルードできることを知っていますが、3ディレクトリ前のファイルをどのように戻しますか?これは理にかなっていますか? .../index.phpを試しましたが、機能しません。

/game/forum/files/index.phpにファイルがあり、PHP includeを使用してファイルをインクルードします。 /includes/boot.inc.php;にあります/はルートディレクトリです。

82
Marcus

..は、現在から親ディレクトリを選択します。もちろん、これは連鎖させることができます:

../../index.php

これは、2つ上のディレクトリになります。

137
Konrad Rudolph

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

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

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

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

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

だから../はあなたを2つではなく1つのディレクトリに戻します

チェーン../を2レベル以上上げるのに必要な回数だけ。

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

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

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

PHPドキュメントから:

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

そして、私がこのトリックを引用して見つけた最も古い投稿 2003年に遡る、Tapkenによる

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

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

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';

実際、/を先頭に追加しても機能しますが、呼び出しスクリプトのinclude ../../index.phpと同様に解決します(違いは、include_pathが失敗した場合、後で検索されないことです)。 PHP docから

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

17
gaborous

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

定数を定義すると、ディレクトリを逆方向にドリルダウンするため、混乱を減らすことができます。

次のような定数を定義できます。

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

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

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

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

define();参照

15
../../index.php 

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

../の各インスタンスは、1つのディレクトリのアップ/バックを意味します。

11
leek

以下は、さまざまなディレクトリにアクセスする方法です。

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

../../directory/file.txtを実行できます-これは2つのディレクトリに戻ります。

../../../-これは3つあります。等

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

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

ただし、VERYに注意して、ユーザーにファイルを選択させるようにしてください。たとえば、次のようなファイルを取得することを許可したくありません。

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

または他の機密システムファイル。

(申し訳ありませんが、私はLinuxのシステム管理者だったのでしばらくしており、私はthinkこれは私が覚えているものから、機密ファイルです)

5
ZombieSheep

__DIR__を使用して 現在のphpファイルディレクトリ を指定することをお勧めします。理由について here を確認してください。

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

php7を使用している場合、たとえば、levelパラメーターが2のdirname関数を使用できます。

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

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

ディレクトリ名の参照

3
ron

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

サイトが http://www.example.com/game/forum/files/index.php の場合、インクルードを/includes/boot.inc.phpに追加して解決できます- http://www.example.com/includes/boot.inc.php .

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

2
Mauro

../../を試してください。 2つのディレクトリに戻るため、それに応じて変更できます。最初にルートディレクトリにアクセスしてから、必要なディレクトリにアクセスします。

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

2
khan

オーバーディレクトリを含むプロキシファイルによって処理することができます

  • 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

あなたの答えを見て、構文にパスを含める

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

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

にパスを変更したとき

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

すべて順調。

1
Bronek

これを試してみてください

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

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

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

require_once('../../images/yourimg.png');
0
rajpoot rehan