2つのディレクトリを超えるファイルを戻すにはどうすればよいですか?


94

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

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


chdir( '' ../ '');
maheshmnj

回答:


152

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

../../index.php

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


1
@ブライアンまあ、それはナンセンスです、あなたはリンゴとオレンジを比較しています。defineここでa が使用されるのは正しいですが、(1)これはリモートでの質問ではありませんでした。(2)define絶対パスのハードパスを実際にハードコード化しない限り、引き続きで相対パスを使用しますが、欠点があるだけなので、それを控えます。または(3番目の選択肢)文字列操作を使用して(展開された)現在のパスから親ディレクトリを抽出することもできますが、これも相対パスを使用する利点がありません。
Konrad Rudolph

悲しいことに、これは1つのデバイスで機能し、別のデバイスでは機能しない/../可能性があります。../動作したり、まったく同じ環境設定を持つ三つの異なるコンピュータ上で動作しないことがあり、どちらも
ダグラスガスケル

@DouglasGaskellいいえ、不正解です。../and ../../(注記:先頭にスラッシュはありません!)を含む相対パス表記は、すべての最新のオペレーティングシステムで機能します。以前はWindowsや(ずっと前に)Macintosh では機能ませんでしたが、今ではどこでも機能し、少なくとも過去10年間は​​機能しています。それがどこかで機能しない場合、その理由はファイル構造が異なるか、または別の作業ディレクトリにいるためです。しかし、それはこのコードとは無関係です。
コンラッドルドルフ

Konrad、私は、VMスナップショットを使用して、同僚とリポジトリを共有してから10分前にこの問題に対処したばかりなので、これについて言及しました。何らかの理由/../../、彼の環境ではなくすべてのパスが必要でした。
Douglas Gaskell 2017年

@DouglasGaskellそして、私はエラーが無関係であることを自信を持ってあなたに伝えることができます。実際、このパス/../はどのシステムでも意味がありません(これは/、またはエラーと同じです)。その前に何かを貼り付けていませんか?
Konrad Rudolph、

51

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

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

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

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


2
ちょっとダン簡単な質問:あなたは「現実的には、現在のディレクトリに対してインクルードを実行すべきではない」と言います。ほとんどのHTMLドキュメントに散らばっているすべての相対パスはどうですか?ファイルを移動した場合、それらも壊れませんか?相対リンクと絶対リンクを使用する基準はありますか?前もって感謝します!
Govind Rai

2
スラッシュが1つ欠けていると思います。次のようにしてください。require_once($ _ SERVER ['DOCUMENT_ROOT']。 '/ directory / directory / file');
user889030

@ user889030私が知る限り、少なくともほとんどの場合、スラッシュは必要ありません
BotMaster3000

1

27
. = current directory
.. = parent directory

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

../2つ以上のレベルに上がるために必要な回数だけ連鎖してください。


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

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

実際、これにより、インクルードは常に、このコードが配置されている現在のスクリプトの位置(アプリケーションのアーキテクチャを定義しているため、この位置が最も安定している可能性が高い)に対して相対的になります。これは、実行中の( "calling"とも呼ばれる)スクリプトに相対的に、現在の作業ディレクトリに相対的に含めるだけの場合とは異なり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.phpdirname(__FILE__).'/path'トリックを使用することによりincluded.php、コードが配置されているスクリプトからインクルードが行われます。

次の点は、他の場所で読み取れるものとは異なり、上記のトリックと同等ではありません。

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

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

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


@diEcho:なぜそれが「完全に間違っている」のか知っていてもいいですか?私はいくつかのプログレードのアプリケーションでそれを使用しており、この方法は実際にはあらゆる状況で機能した唯一のものです。また、phpのマニュアルにも詳細が記載されてい ます。これは間違いではありません。
12

最初の行は完全に間違っています。..パスの中間(相対/絶対)を追加することはできません。
diEcho 2012年

@diEchoまた、PHPマニュアルを参照する必要があります。php.net
過激な

..インクルードの途中で使用される単一の例を教えてください。常にインクルードの最初の部分である必要があります
diEcho 2012年

github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/…プロ仕様のERP / CRM用のプロ仕様のモジュール。あなたは、あなたが言っていることが分からないときには話してはいけません。
12

16

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

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

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

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

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

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

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

define(); 参照



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

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


9

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

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

7

あなたがすることができます../../directory/file.txt-これは2つのディレクトリに戻ります。

../../../-これは3つです。等



6

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

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

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

(申し訳ありませんが、私がLinuxのシステム管理者だったので、久しぶりですこれは私が覚えている限りでは、機密ファイルだと思います)




4

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

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

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

dirname参照


3

ディレクトリを含むをプロキシファイルで処理できます

  • ルート
  • ..... | __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

試す ../../。2つのディレクトリが必要になるため、適宜変更できます。最初にルートディレクトリにアクセスしてから、必要なディレクトリにアクセスします。

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


2

インクルードの/先頭にインクルードする場合、インクルードはサイトのルートからのパスと見なされます。

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

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


2

これを試して

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

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

この例は、2つのディレクトリに戻ります

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

まったく同じです;-) 2つ目の「../../images/yourimg.png」という意味ですか?
エドウィン

私の間違いを
覆す

1

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

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

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

パスを次のように変更したとき

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

すべて順調。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.