0

従来の 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」というエラー メッセージで失敗します。

4

1 に答える 1

0

1: getInstance() で接続を確立する必要はありません。getInstance は何もする必要はありませんが、DB クラスのインスタンスを返します。

2: を実行するとself::$$dbname->connect(if (empty(self::$$dbname))次に呼び出すときに false が返されます。

シングルトンはここで説明されています: http://en.wikipedia.org/wiki/Singleton_pattern

あなたが持っているもの - それは単なる静的メソッドです。

于 2013-02-26T11:40:29.153 に答える