0

現在、データベース駆動型の Web サイトの多くの更新に取り組んでいます。

したがって、すべてのページに含まれる db.php と呼ばれる webroot にファイルがあります。これには、SQL データベースへの接続の詳細が含まれています。これは、ライブ データベースにデフォルト設定されます。

db.local.php というファイルもあります。ここで、このファイルが存在する場合、その中の接続の詳細がデフォルト値を上書きします。したがって、このファイルは各セットアップに固有であるため、ソース管理下に置かれません。

次のようにして、ファイルが存在するかどうかを確認します。

if(file_exists(getcwd().'/db.local.php')) {
    require_once('db.local.php'); 
} else {
//default database details
}

問題は、webroot だけでなく、複数のフォルダーからこのファイルを使用することです (たとえば、webroot/admin から呼び出されるスクリプトの cwd は、webroot ではなく webroot/admin になります)。したがって、db.php が別のフォルダーのスクリプトから呼び出された場合、現在の作業ディレクトリは webroot ではないため、db.local.php は表示されません。間違ったデータベースを使用しているため、これは悪いことです。

これを回避する方法はありますか?(スクリプトが実行されている場所ではなく、プルされたファイルのディレクトリを確認する方法のようなものです)。または、この問題に対して、実装されているものよりも優れたアプローチがありますか?

4

3 に答える 3

2

私はこれをします:

switch (gethostname()) {
  case 'dev-local':
    define('SITE_URL', ....);
    define('TRIM_REQUEST_URI', '');

    require CONFIG . '/VM/database.php';
    break;

    ......
}

各サーバーには異なるホスト名があります。

于 2012-08-14T00:12:23.103 に答える
1

スクリプトからの相対パスがわかっている場合は、db.local.php を含めることができます。これは、スクリプト実行時の現在の作業ディレクトリに関係なく機能します。たとえば、あなたが持っているとしましょう

/foo/bar/www/db.php
/foo/bar/www/db.local.php
/foo/bar/www/index.php

/foo/bar/scripts/cleanup.php

cleanup.php 内で、次のように db.local.php を確認して含めることができます。

$APPROOT = __DIR__ . DIRECTORY_SEPARATOR . '..';
$DBLOCAL = $APPROOT . DIRECTORY_SEPARATOR . 'www' . DIRECTORY_SEPARATOR . 'db.local.php';
if(file_exists($DBLOCAL)) {
  require_once($DBLOCAL);
}

これを行うスクリプトが多数ある場合は、それらの変数を設定する初期化ファイルを作成し、それをすべてのスクリプトに含めることができます (同じ__DIR__方法を使用します)。

于 2012-08-14T00:23:12.357 に答える
0

関数を使用して、ファイルを検索する絶対パスを指定できます set_include_path

http://php.net/manual/en/function.set-include-path.php

<?php
ini_set('include_path', '/usr/lib/pear');
/*
// On Windows: 
ini_set('include_path', 'c:\sites\config');
*/
?>

編集: その後、使用するだけ require 'db.php'; で、PHP パーサーは ini_set コマンドで指定したディレクトリを参照することを認識します。

ファイルへのパスを追加することもできphp.iniます...

于 2012-08-14T00:08:49.690 に答える