3

私はdb、ほぼすべてのクラスが拡張しているクラスを持っています:

class db {

    protected $db;

    public function __construct() {
        $this->connect();
    }

    protected function connect() {
        $this->db = new MySQLi(db_host, db_user, db_pass, db_name) or die($this->db->error); (line 22)
        $this->db->set_charset('utf8');
    }

}

ここにページクラスがあります

class page extends db {
    var $common;

    public function __construct() {
        parent::__construct();
        $this->common = new common();

class common extends db {

    public function __construct() {
       parent::__construct();
    }

私は得ています

警告: mysqli::mysqli() [mysqli.mysqli]: (42000/1203): ユーザー管理者は、オンラインの /home/tural/public_html/incl/classes/class.db.php で、既に 'max_user_connections' を超えるアクティブな接続を持っています22

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

5

インスタンス化したものから継承するすべてのクラスdbは、新しいデータベース接続を確立します。DB クラス インスタンスを 1 つだけ持つ必要があります。とすべてpagecommon継承する必要はなく、dbインスタンスを渡すだけです。

于 2012-06-30T22:42:13.163 に答える
0

db クラスを拡張すると、各インスタンスの生成後に mysqli 接続が作成されます。class db を singleton として定義した方が良いと思います

コードは次のとおりです。

class db {

    private static $_db; // db instance
    protected $connection;

    private function __construct() {
        $this->connection = new MySQLi(db_host, db_user, db_pass, db_name) or die($this->connection->error); 
        $this->connection->set_charset('utf8');
    }

    public function get_instance()
    {
        if( isset( self::$_db) )
        {
           return self::$_db;
        }
        else
        {
           self::$_db = new db();            
        }

        return self::$_db;
    }

}

この方法では、1 つの mysql 接続しか作成できません。

次の方法でdbクラスに到達できますdb::get_instance()->do_something();

共通クラスは次のようになります。

class page  {
    var $common;
    var $db;    

    public function __construct() {
        parent::__construct();
        $this->db = db::get_instance();
        $this->common = new common();
    }
}

このデザインの方が良いと思います。

于 2012-06-30T22:48:52.457 に答える