PHPデータベースクラスを設計するには、単一のパターンを使用します.

5526 ワード

最近、サイトのデータベースの圧力が大きいと感じて、サイトの速度がひどく下がっています.かなりの部分のページがデータベースに直接接続してデータを読むので、この部分のページもデータベースの単例クラスを使って実現するように変更しました.データベースに接続するには、次のクラスを基本的に統一して使用します.
  • クラスの一意のインスタンスを保存する静的メンバー変数(通常$instanceはプライベート変数)
  • が必要です.
  • コンストラクション関数およびクローン関数は、外部プログラムnewクラスが単一のモード意味を失うことを防止するために、プライベートとして宣言する必要がある
  • .
  • は、このインスタンスにアクセスするための共通の静的方法を提供する必要があり、それによって、一意のインスタンスの参照
  • を返す.
    <?php
    class nmdb 
    {
    	private $link;
    	static private $_instance;
    	//      
    	private function __construct($host, $username, $password)
    	{
    		$this->link = mysql_connect($host, $username, $password);
    		$this->query("SET NAMES 'utf8'", $this->link);
    		//echo mysql_errno($this->link) . ": " . mysql_error($link). "n";
    		//var_dump($this->link);
    		return $this->link;
    	}
    	
    	private function __clone(){}
    	
    	public static function get_class_nmdb($host, $username, $password)
    	{
            //$connector = new nmdb($host, $username, $password);
            //return $connector;
    		
    		if( FALSE == (self::$_instance instanceof self) )
    		{
    			self::$_instance = new self($host, $username, $password);
    		}
    		return self::$_instance;
        }
    	
    	//      
    	public function select_db($database)
    	{
    		$this->result = mysql_select_db($database);
    		return $this->result;
    	}
    	
    	//   SQL  
    	public function query($query)
    	{
    		return $this->result = mysql_query($query, $this->link);
    	}
    	
    	//          
    	public function fetch_array($fetch_array)
    	{
    		return $this->result = mysql_fetch_array($fetch_array, MYSQL_ASSOC);
    	}
    	
    	//       
    	public function num_rows($query)
    	{
    		return $this->result = mysql_num_rows($query);
    	}
    	
    	//        
    	public function close()
    	{
    		return $this->result = mysql_close($this->link);
    	}
    	
    }
    ?>

    このクラスは次のように使用されます.
    $connector = nmdb::get_class_nmdb($host, $username, $password);
    $connector -> select_db($database);

    次のクラスも参照できます.
    <?php
    /*
    * mysql   
    */
    class mysql{
        private $host    ='localhost'; //     
        private $user     = 'root'; //      
        private $pwd     = ''; //        
        private $database = 'imoro_imoro'; //    
        private $charset = 'utf8'; //     ,GBK,UTF8,gb2312
        private $link;             //       ;
        private $rows;             //         
        static $_instance; //    
        /**
         *     
         *   
         */
        private function __construct($pconnect = false) {
            if (!$pconnect) {
                $this->link = @ mysql_connect($this->host, $this->user, $this->pwd) or $this->err();
            } else {
                $this->link = @ mysql_pconnect($this->host, $this->user, $this->pwd) or $this->err();
            }
            mysql_select_db($this->database) or $this->err();
            $this->query("SET NAMES '{$this->charset}'", $this->link);
            return $this->link;
        }
        /**
         *      
         *
         */
        private function __clone(){}
        public static function getInstance($pconnect = false){
            if(FALSE == (self::$_instance instanceof self)){
                self::$_instance = new self($pconnect);
            }
            return self::$_instance;
        }
        /**
         *   
         */
        public function query($sql, $link = '') {
            $this->result = mysql_query($sql, $this->link) or $this->err($sql);
            return $this->result;
        }
        /**
         *     
         */
        public function getRow($sql, $type = MYSQL_ASSOC) {
            $result = $this->query($sql);
            return @ mysql_fetch_array($result, $type);
        }
        /**
         *     
         */
        public function getRows($sql, $type = MYSQL_ASSOC) {
            $result = $this->query($sql);
            while ($row = @ mysql_fetch_array($result, $type)) {
                $this->rows[] = $row;
            }
            return $this->rows;
        }
        /**
         *       
         */
        protected function err($sql = null) {
            //        
            echo 'error';
            exit();
        }
    }
    //  
    $db = mysql::getInstance();
    $db2 = mysql::getInstance();
    $data = $db->getRows('select * from blog');
    //print_r($data);
    //          
    if($db === $db2){
        echo 'true';
    }
    ?>

    以下も参考になります
    <?php
    
    class Db {
    	static private $_instance;
    	static private $_connectSource;
    	private $_dbConfig = array(
    		'host' => '127.0.0.1',
    		'user' => 'root',
    		'password' => '',
    		'database' => 'video',
    	);
         // //       ,       new
    	private function __construct() {
    	}
    
    	static public function getInstance() {
    		if(!(self::$_instance instanceof self)) {
    			self::$_instance = new self();
    		}
    		return self::$_instance;
    	}
    
    	public function connect() {
    		if(!self::$_connectSource) {
    			self::$_connectSource = @mysql_connect($this->_dbConfig['host'], $this->_dbConfig['user'], $this->_dbConfig['password']);	
    
    			if(!self::$_connectSource) {
    				throw new Exception('mysql connect error ' . mysql_error());
    				//die('mysql connect error' . mysql_error());
    			}
    			
    			mysql_select_db($this->_dbConfig['database'], self::$_connectSource);
    			mysql_query("set names UTF8", self::$_connectSource);
    		}
    		return self::$_connectSource;
    	}
    }
    /*$connect = Db::getInstance()->connect();
    
    $sql = "select * from video";
    $result = mysql_query($sql, $connect);
    echo mysql_num_rows($result);
    var_dump($result);*/