2009-08-16 14 views
2

Windows上のPHPで奇妙な問題が発生しました...私のアプリケーションは、設定ファイルを読み込み、autoloadsを登録し、初期化などを行うコアファイルを読み込みます。include_once( "config.php ");私は別のディレクトリからコアファイルをインクルードすると、現在のディレクトリ内の何にでもうまく動作しますが、設定ファイルのインクルードを無視します。require_onceが無視されました

/webroot/core.php

<?php 
    require_once "config.php"; 
    //register autoloads 
    //do some initialization... standard stuff 
?> 

/webroot/config.php

<?php 
    define("WEB_ROOT","/webroot"); 
    define("DB_USER","root"); 
    // ... more stuff... 
?> 

/webroot/admin/index.php

<?php 
    require_once("../dbconnect.php"); 
    echo WEB_ROOT; 
    // print string literal WEB_ROOT rather than value in config.php 
?> 

私の理解では、そのファイルです操作は、要求を行っているファイルのディレクトリに相対的ですが、require_once( "config.php")でファイルを選択してはいけませんlative to core.php?このコードは、私がMacやLinuxで期待していたように動作しますが、Windows上ではまったく動作しません(完全なパスを使用するように変更した場合や、動作します)。

本当の狂気はrequire_once( "config.php")はエラーをスローしませんが、内部のコードは実行されません!

+0

誰もがindex.phpのがロードされていることに気づきましたconfig.phpまたはcore.phpではなくdbconnect.php?あなたもdbconnect.phpの内容を表示する必要があります... –

答えて

7

PHPは黙ってエラーを無視した場合、要求されたファイルの先頭に入れてみてください:

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

これで、すべてのエラーが表示されるはずです。

次に、(私によると)ベストプラクティスは、インクルードされたファイルではなく、要求されている(インクルードされていないファイルでも)アプリケーションルートの完全なファイルシステムパスで定数を定義することです。だから、index.phpでアプリケーションルートは/webroot/adminの場合:その後

define('APP_DIR', dirname(__FILE__)); 

あなたが何か、この定数を使用するが含まれている場合。

/webroot/ 
    admin/ 
     index.php 
    config.php 
    core.php 

そして、あなたはindex.phpconfig.phpを含める:ディレクトリ構造がある場合config.phpを含めるように

core.php
require_once APP_DIR . '/../config.php'; 

それは次のようになります。

require_once APP_DIR . '/../config.php'; 

のように。

絶対ファイルシステムパスを使用すると、あいまいさを防ぐことができます。

+0

dirname(__ FILE__)を使用すると、絶対パスを定義することができます。残念ながら私が取り組んでいるアプリケーションは、これを設定ファイルに手作業で設定し、これを 'APP_DIR'として使います。私は本当に理由を知らない! – Michael

1

PHPのopen_basedirの制限に遭遇している可能性がありますか?いくつかの悪意のあるスクリプトを防ぐために、PHPには、とりわけ、ファイルがどこから読み込まれるかを制限する「セーフモード」があります。もしxamppがこれをデフォルトで有効にしていれば、それを実行している可能性があります。

Webサーバーのエラーログを確認して、そこに障害の兆候がないかどうかを確認することもできます(エラーの報告は、E_ALLにすることをお勧めします)。

+0

私はsafemodeがオンかどうかを調べるためにiniをチェックしましたが、これはケースではなく素晴らしい提案です! エラー報告は、単に通知を無視するように設定されますが、バニラE_ALLで私はこの取得した お知らせ:未定義の定数FILE_ROOTの使用 - Cに「FILE_ROOT」仮定:行87 の\ Webルート\ core.phpのさえをアンロードされた設定ファイルの通知が出されます! – Michael

2

あなたは含めることをやって、ファイルへの相対パスを使用してファイルを含める場合は、フルパスを付加する必要があります、このように:

<?php 
require_once(dirname(__FILE__) . "/config.php"); 
?> 
+1

nixesではない...その奇妙なことに、この場合は黙ってrequireを無視します! – Michael

+0

この行は実際に私がLinuxで特別に開発したスクリプトのものです。サイレント無視ビットは本当に奇妙で、私は恐れていることであなたを助けることはできません。私はちょうど前に私がベストプラクティスとして適応したものを投稿した。 – Thorarin

関連する問題