従来の Web サイトは、データベース接続で予期しない動作を示しています。アプリケーションは同じサーバー上の複数の MySQL データベースに接続し、元の開発者はそれぞれの接続オブジェクトを保持する「シングルトン」クラスを作成しました。
最近、クラスで奇妙な動作に遭遇しています: をwww
作成した後に への接続が作成されるとextra
、 のインスタンスを取得すると、 でextra
表示すると正しいパラメータを持つ接続が返されますが、var_dump()
実際にはwww
データベースに接続されています。
何が原因でしょうか? コードは、ある段階で以前に機能していました。呼び出しごとに新しい接続を作成しgetInstance()
て問題を解決しますが、可能であれば正しい方法で解決したいと思います。
<?php
class DBConnection
{
private static $default;
private static $extra;
private static $intra;
private static $www;
public static function getInstance($dbname = "default")
{
global $db; // This is an array containing database connection parameters
if(!($dbname == "default" || $dbname == "extra" || $dbname == "www" || $dbname == "intra"))
{
$dbname = "default";
}
if (empty(self::$$dbname)) // Making this pass every time fixes the problem
{
try
{
self::$$dbname = ADONewConnection('mysqlt');
if(isset($db[$dbname]))
{
self::$$dbname->connect(DBHOSTNAME, $db[$dbname]["dbusername"], $db[$dbname]["dbpassword"], $db[$dbname]["dbname"]);
}
else
{
// fallback
self::$$dbname->connect(DBHOSTNAME, DBUSERNAME, DBPASSWORD, DBNAME);
}
self::$$dbname->SetFetchMode(ADODB_FETCH_ASSOC);
self::$$dbname->execute("SET NAMES utf8");
return self::$$dbname;
}
catch(Exception $e)
{
exit("DB connection failed");
}
}
else
{
return self::$$dbname;
}
}
}
クラスの誤動作の簡単な例を次に示します。
$cn = DBConnection::getInstance("extra");
$cn->debug = true;
$rs = $cn->execute("SELECT * FROM messages WHERE id = ".$this->id);
最後の行は、「Table www.messages does not exist」というエラー メッセージで失敗します。