2011-10-20 5 views
7

私は3つのファイルを持っています:home、failed_attempt、login。include_once、phpの相対パス

ファイルホームとfailed_attemptはすべてログインファイルを参照します。

迷惑なことに、ログインファイルが存在しないという誤った発言です。私がこれを行うと、家は例外をスローしますが、failed_attemptはありません。

include_once("../StoredProcedure/connect.php"); 

include_once( "../ untitled/sanitize_string.php");

と、私はこれを行う場合:反対が起こる

include_once("StoredProcedure/connect.php"); 
    include_once("untitled/sanitize_string.php"); 

は、failed_attemptは文句を言わない、例外が、ホームをスローします。私はこれをどのように修正すればよい。..

私は

... 1ページアップは、したがって、それはその例外をスロー移動する必要があり、この../を置くことによってページをアップして行くので、home.php doesntのために含ま教えてください。

どのように私はそれがそう両方のファイルは、それらが配置される場所からの相対おそらく..として有効なものをincluedsしない受け入れることができます。..すなわちその../

ディレクトリ構造を持たない:

PoliticalForum 
->home.php 
->StoredProcedure/connect.php 
->untitled/sanitize_string.php 
->And other irrelevant files 
+1

:単にあなたの相対パスに基づいて、次を使用します。 home、failed_attempt、およびloginファイルは同じディレクトリにありますか?ディレクトリ構造を投稿できますか? homeとfailed_attemptのページがログインファイルをどのように参照しているのですか?どのファイルに上記のコードが表示されますか? – megaflop

+0

storedProcedureは私のフォルダで、内部にファイルがあります。ログファイルには2つのファイルが含まれていますが、ロード先に応じて読み込みに失敗します... homepageまたはlogin_attemptの別のディレクトリにあるページ – Matrix001

答えて

7

次の3つの解決策があります。 2番目の方法は、絶対パスを巧みに使用する回避策です。

1:あなたのStoredProcedureのフォルダは、それが含まれているファイルをインクルードする必要がある場合があります任意のファイルの最上位ディレクトリにある場合にのみ動作することを正しいディレクトリにchdirの

<?php 

// check if the 'StoredProcedure' folder exists in the current directory 
// while it doesn't exist in the current directory, move current 
// directory up one level. 
// 
// This while loop will keep moving up the directory tree until the 
// current directory contains the 'StoredProcedure' folder. 
// 
while (! file_exists('StoredProcedure')) 
    chdir('..'); 

include_once "StoredProcedure/connect.php"; 
// ... 
?> 

は注意してください。

2:今絶対パスを使用

あなたは、これはポータブルではないと言う前に、それは実際にあなたがそれを実装する方法によって異なります。ここではApacheで動作例を示します

また
<?php 
include_once $_SERVER['DOCUMENT_ROOT'] . "/StoredProcedure/connect.php"; 
// ... 
?> 

、再びApacheで、ルートディレクトリに.htaccessファイルに次のように置く:

php_value auto_prepend_file /path/to/example.php 

次にexample.phpに:

<?php 

define('MY_DOC_ROOT', '/path/to/docroot'); 

?> 

最後にあなたのファイルに:

<?php 
include_once MY_DOC_ROOT . "/StoredProcedure/connect.php"; 
// ... 
?> 

3:セットのPHPのinclude_pathの

the manual entry for the include_path directiveを参照してください。あなたはphp.iniのへのアクセスを持っていない場合、これはApacheを使用している提供し、.htaccessファイルで設定することができ、PHPをCGIとしてインストールないので、のように:初心者のための

php_value include_path '/path/to/my/includes/folder:/path/to/another/includes/folder' 
+0

私は、最初の方法がどのように機能するかについて少し不明です。しかし、私は2番目と3番目の方法を試してみます – Matrix001

+0

私は最初の方法にコメントを追加しました。詳細については、[chdirのマニュアルページ](http://uk3.php.net/manual/en/function.chdir.php)を参照してください。 – megaflop

2

require(dirname(__FILE__) . '[RELATIVE PATH HERE]');ような何かを行います

+0

あなたは次のようなことをしますか:[コード] include_once (dirname(__ FILE__)) "../StoredProcedure/connect。 – Matrix001

+0

dirname(__ FILE__)は、インクルードコードを持つファイルが存在するカレントディレクトリを返します(ファイル名は__ FILE __FILE __ FILE __FILE __ FILE __ FILE __ FILE __) – Dev

+0

しかし、それはかなり正しく動作しません\t include_once(dirname(__ FILE __)。 "../ StoredProcedure/User /あなたがログインしたときに問題が発生する...あなたのコード行はうまく動作しない – Matrix001

7

PHPでパスを作成する場合、realpath()__DIR__はあなたの友人です。彼らはブラケットを必要としない含めると言語構造(というよりも機能)されている必要があるので

のrealpathhttp://php.net/manual/en/function.realpath.php

マジックはhttp://php.net/manual/en/language.constants.predefined.php

定数。一般に、includeには「テンプレート」(出力ファイル)を、requireにはクラスなどのPHPファイルを含めるとします。

ですから、のようなものを使用することができます

$sPath = realpath(__DIR__ . '/../relative/path/here'); 
if($sPath) { require_once $sPath; } 

(PHP < 5にdirname(__FILE__)代わりの__DIR__を使用)

それは場合はfalse realpath()リターンとしてファイルを要求しようとする前に、パスを評価する価値がありますファイルが存在しません。require false;はPHPエラーを引き起こします。オートローダ:他のみんなが正しくあなたの質問に答えている

require /home/www/mysite.com/htdocs/inc/somefile.php

+0

これはうまくいきません:include_once(realpath( "../ untitled/sanitize_string.php")); – Matrix001

+0

エラーを削除しました。しかし、もしrealpathがfalseを返したら?それはファイルが含まれていないことを意味しません.. realpathはfalseを返しますか? – Matrix001

+0

'realpath()'は、パラメータとして入力されたパスが存在しない場合にfalseを返します。たとえば 'realpath( 'this/file/does/not/exist');'はfalseを返します。 *存在すれば、 'realpath(__ DIR__。/ this/file/does/exist ');'は '/home/mysite.com/htdocs/this/fileのようなものを返すかもしれないので、/does/exist' - 例えば完全な実際のパス – CD001

1

、しかし私は、私が何かを貢献したいと思った:

は、別の方法としては、同じように絶対パスを使用することができます。

オートローダーを使用すると、クラスを使用しようとすると特定のファイルを自動的に含む機能を定義できます。

ドキュメントはここにあり、私ができるよりも良いそれを説明することができます:http://php.net/manual/en/language.oop5.autoload.php

は本当に、それらを使用することをお勧めしますあなたの時間を節約し、より良い習慣です。

+0

私はそれらについて知っています。ファイルがロードされたページを開始すると、あなたはそれらの内部にあなたのインクルードを入れます。しかし、それは私のquesitonに問題を解決しませんか? – Matrix001

3

この理解するのに役立ちます。あなたの質問は非常に明確ではありません

//include file directly from parent directory: 
include_once(dirname(__FILE__) . '/../connect.php'); 

OR

//include file from parent's child directory: 
include_once(dirname(__FILE__) . '/../StoredProcedure/connect.php'); 

OR

//include file from own child directory: 
include_once('StoredProcedure/connect.php'); 

OR

//include sibling files from same directory: 
include_once('connect.php');