2

Windows上のphpの奇妙な問題...私のアプリケーションは、設定ファイルをロードし、自動ロードを登録し、初期化などを行う「コア」ファイルをコアファイルの上部にロードします。これは、別のディレクトリからコアファイルをインクルードすると、現在のディレクトリ内のすべてに対して正常に機能しますが、構成ファイルのインクルードは黙って無視されます... 誰かがこれを前に見たことがありますか?

/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") は core.php に相対的なファイルを選択すべきではありませんか? このコードは、Mac または Linux では期待どおりに機能しますが、Windows ではまったく機能しません (完全なパスまたは ../ を使用するように要件を変更すると、機能します)。

本当の狂気は、require_once("config.php") がエラーをスローしないのに、内部のコードが実行されないことです!

4

3 に答える 3

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

そして、あなたはに含めconfig.phpたいindex.php

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

core.php含めるには、次のconfig.phpようになります。

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

等々。

ファイルシステムの絶対パスを使用すると、あいまいさがなくなります。

于 2009-08-16T07:18:56.973 に答える
2

インクルードを行うファイルへの相対パスを使用してファイルをインクルードする場合は、次のようにフル パスを先頭に追加する必要があります。

<?php
require_once(dirname(__FILE__) . "/config.php");
?>
于 2009-08-16T07:46:49.420 に答える
1

おそらく、PHP のopen_basedir制限に遭遇していますか? 一部の悪意のあるスクリプトを阻止しようとするために、PHP には「セーフ モード」があり、とりわけ、ファイルをどこからロードできるかを制限します。xampp でこれがデフォルトでオンになっている場合は、それに遭遇した可能性があります。

Web サーバーのエラー ログをチェックして、そこに障害の兆候がないかどうかを確認することもできます (問題が解決されるまで、できれば E_ALL へのエラー レポートをオンにしてください)。

于 2009-08-16T07:05:05.527 に答える