require_onceの相対パスが機能しない


103

私は次の構造を持っています

otsg
 > class
   > authentication.php
   > database.php
   > user.php
 > include
   > config.inc.php
   > encryption.php
   > include.php
   > session.php
 > index.php
 > registration.php

include.phpファイルには以下が含まれます

ini_set('display_errors', 1);
error_reporting(E_ALL);

ini_set('include_path',ini_get('include_path').':/Applications/MAMP/htdocs/otsg/:');
require_once 'config.inc.php';
require_once '../class/database.php';
require_once '../class/user.php';
require_once 'encryption.php';
require_once 'session.php';
require_once '../class/authentication.php';

そして私が含めたindex.phpページに

require_once 'include/include.php';

index.phpページを開くと、次の警告と致命的なエラーが表示されます。このエラーの原因がわかりません。私が絶対パスを与えたとき、それは機能します。しかし、絶対パスは良い考えではないと私は信じています。

Warning: require_once(../class/database.php) [function.require-once]: failed to open stream: No such file or directory in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

Fatal error: require_once() [function.require]: Failed opening required '../class/database.php' (include_path='.:/Applications/MAMP/bin/php5.3/lib/php:/Applications/MAMP/htdocs/otsg/include/:') in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

前もって感謝します


私は通常Objective-Cを行っており、phpスクリプトを手に入れようとしていますが、PHPにファイルを正しく含める方法を理解するのに2時間も費やしているのを見て悲しいです。Xコードを使用すると、物事はとても簡単です。
rohan-patel 14年

多くの場合、このエラーが発生し、すばやくトラブルシューティングするには、次の手順に従います
。stackoverflow.com/a/36577021/2873507

回答:


216

使用する

__DIR__

スクリプトの現在のパスを取得すると、問題が解決します。

そう:

require_once(__DIR__.'/../class/user.php');

これにより、PHPスクリプトを別のフォルダーから実行できる場合があり、相対パスが機能しなくなります。

編集:スラッシュの問題を修正


42
気を付けて! __DIR__PHP 5.3の新機能です。このスクリプトを以前のバージョンのPHPで実行する必要がある場合は、dirname(__FILE__)代わりに使用する必要があります。
Charles

27
後にスラッシュを手動で含める必要があることに注意してください__DIR__。だから:ドキュメントrequire_once(__DIR__.'/../class/user.php'); よると、ルートディレクトリを除いて末尾のスラッシュは省略されています。
Ariel Allon

9
助けてくれてありがとう、でもなぜ__DIR__必要なのか分からない。PHPのドキュメントによると、PHPはデフォルトで現在のスクリプトのディレクトリを検索します。誰かが光を当てることはできますか?
デビッド

1
@Davidこれは、2つの場所から同時にファイルをインポートするときに必要になると思います。たとえば、のファイルがありますrequire "../a.php"。このファイルが別のファイル(x)からインポートされた場合、インクルードされdir1/dir2/x.phpたファイルはになりますdir1/a.phpが、xがインされたdir1/dir2/dir3/x.php場合、インクルードされたファイルはになりますdir1/dir2/a.php。または、間違っていますか?
ホセ・ラモン

1
この頻繁なエラーのトラブルシューティングチェックリストがここにあります:stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

17

PHPバージョン5.2.17 __DIR__では機能しません。php5.3でのみ機能します。

しかし、PHPの古いバージョンでは dirname(__FILE__)完全に

たとえば、次のように書きます

require_once dirname(__FILE__) . '/db_config.php';

1

私の場合、それが機能しない、__DIR__またはgetcwd()間違ったパスを選択し続けても、プロジェクトの絶対ベースパスを使用して、必要なすべてのファイルにCostantを定義することで解決しました。

if(!defined('THISBASEPATH')){ define('THISBASEPATH', '/mypath/'); }
require_once THISBASEPATH.'cache/crud.php';
/*every other require_once you need*/

私はphp 5.4.10でMAMPを使用しており、フォルダ階層は基本的です:

q.php 
w.php 
e.php 
r.php 
cache/a.php 
cache/b.php 
setting/a.php 
setting/b.php

....


0

私はちょうど同じ問題に遭遇しましたが、別のインクルード内にインクルードが含まれるようになるまで、すべて問題なく機能していました。

require_once '../script/pdocrud.php';  //This worked fine up until I had an includes within another includes, then I got this error:
Fatal error: require_once() [function.require]: Failed opening required '../script/pdocrud.php' (include_path='.:/opt/php52/lib/php')

解決策1.(私の公開htmlフォルダー名の望ましくないハードコーディングですが、機能します):

require_once $_SERVER["DOCUMENT_ROOT"] . '/orders.simplystyles.com/script/pdocrud.php';

解決策2(上記のDIRに関する望ましくないコメントは、php 5.3以降でのみ機能しますが、機能します):

require_once __DIR__. '/../script/pdocrud.php';

解決策3(欠点は見られず、php 5.3で完全に機能します):

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