2

私はデータベースにアクセスするために使用するfunctions.php1つの接続を持つファイルを持っています、そしてそれはこれです:PDO

$host = "localhost";
$db = "maindatabase";
$adminuser = "admin";
$adminpw = "123456";
global $connection;

$connection = new Connection($host,$adminuser,$adminpw,$db);

そしてrequire、データベースにアクセスする必要のあるすべてのファイルでこのスクリプトを実行します。場合によっては、からに変更したいのですが$db = "maindatabase";$db = "anotherdb";セッターだけで実行できることがわかっています。

$connection->setDatabase("anotherdb");

しかし、私requirefunctions.phpファイルを他のすべてのファイルに上書きするので、それ自体がデフォルトに上書きされるかどうかわかりません。誰かがそれを変更してそのままにする方法を知っていますか?

編集

コードを変更requirerequire_onceましたが、PHPのドキュメントには、ファイルがすでに必要である場合は再度追加されないと記載されているため、これで問題が解決すると思いますか?

4

3 に答える 3

2

データベースごとに2つの接続を確立できます

$host = "localhost";
$db1 = "maindatabase";
$db2 = "anotherdb";
$adminuser = "admin";
$adminpw = "123456";
global $connection1, $connection2;

$connection1 = new Connection($host,$adminuser,$adminpw,$db1);
$connection2 = new Connection($host,$adminuser,$adminpw,$db2);
于 2012-07-24T17:08:16.873 に答える
2

これは、グローバル変数の典型的な問題です。プログラムの状態は予測できません。参照しているデータベースを知ることはできません。

あなたの解決策は適切な依存性注入です。

ファクトリクラスを実装して、オンデマンドで正しいデータベース接続を生成し、グローバル変数を使用しないでください。それが正しい解決策です。

于 2012-07-24T17:24:01.630 に答える
1

きれいなコードに関しては、分析のレベルによっては醜くなる可能性がありますが、MySQLユーザーが両方のデータベースにアクセスできる場合は、クエリでデータベースプレフィックスを指定してみませんか?

例:

SELECT * FROM maindatabase.tablename WHERE this='that';

他の関数では、次のようにします。

SELECT * FROM anotherdb.tablename WHERE this='that';

次のこともできます。

$database_name = 'maindatabase';
$query = "SELECT * FROM {$database_name}.table";

$database_name = 'anotherdb';
$query = "SELECT * FROM {$database_name}.table";

$database_nameこのようにして、必要に応じて変数を切り替えることができます。

于 2012-07-24T17:18:24.677 に答える