單例模式 封裝PHP的mysql類

<?php
    /*
     *describe:單例模式 數據庫類
    單例模式的必要條件
    (1)私有的構造方法-爲了防止在類外使用new關鍵字實例化對象
    (2)私有的成員屬性-爲了防止在類外引入這個存放對象的屬性
    (3)私有的克隆方法-爲了防止在類外通過clone成生另一個對象
    (4)公有的靜態方法-爲了讓用戶進行實例化對象的操作
    */
    header("content-type:text/html;charset=utf-8");
    final class DB{
        private $charset = "utf8";         //字符串編碼
        private $link = NULL;              //數據庫連接
        private static $instance = NULL;   //存儲對象

        //初始化
        private function __construct($hostfield,$userfield,$password,$datebase){
            $this->link = mysqli_connect($hostfield,$userfield,$password,$datebase);
            if(!$this->link){
                die("連接失敗: " . mysqli_connect_error());
            }
            mysqli_query($this->link,"SET fieldS ".$this->charset);
            return $this->link;
        }

        //防止克隆
        private function __clone(){}

        //靜態公共接口
        public static function getInstance($hostfield,$userfield,$password,$datebase){
            if(!self::$instance instanceof self){
                self::$instance = new DB($hostfield,$userfield,$password,$datebase);
            }
            return self::$instance;
        }

        /*
         *describe:查詢單個字段
         *@param $field        type:string  傳入需要篩選的字段
         *@param $table_name   type:string  需要查詢的表名
         *@param $where        type:array   需要篩選的where條件
        */
        public function getField($field="",$table_name="",$where=""){
            $where_string = "";
            //where條件
            $where_string = $this->getWhere($where);
            if(is_string($field)){
                //組裝sql
                $sql = "SELECT {$field} FROM {$table_name} WHERE {$where_string}";
                $result = mysqli_query($this->link,$sql);
                while($res = mysqli_fetch_array($result,MYSQL_ASSOC)){
                    $info[] = $res;
                }
                //若只有一個數組,則返回一維數組
                if(count($info)==1){
                    return $info[0];
                }else{
                    return $info;
                }
            }

        }

        /*
         *describe:查詢單條語句
         *@param $sql 查詢語句
         *@param $type 返回數組的類型
         *        MYSQL_ASSOC - 關聯數組(默認)
         *        MYSQL_NUM - 數字數組
         *        MYSQL_BOTH -同時產生關聯和數字數組
        */
        public function getRow($sql,$type=MYSQL_ASSOC){
            $result = mysqli_query($this->link,$sql);
            $res = mysqli_fetch_array($result,$type);
            return $res;
        }

        /*
         *describe:查詢多條語句
         *@param $sql 查詢語句
         *@param $type 返回數組的類型
         *        MYSQL_ASSOC - 關聯數組(默認)
         *        MYSQL_NUM - 數字數組
         *        MYSQL_BOTH -同時產生關聯和數字數組
        */
        public function getRows($sql,$type=MYSQL_ASSOC){
            $result = mysqli_query($this->link,$sql);
            while($rows = mysqli_fetch_array($result,$type)){
                $res[] = $rows;
            }
            return $res;
        }

        /*
         *describe:增加語句
         *@param type:array or string $info 傳入的值  
                     若爲數組則進行拼接SQL語句,並新增 返回新增的ID
                     若傳入的爲SQL語句則直接執行,返回新增的ID
         *@param $table_name  爲需要新增的表名(可選)
        */
        public function add($info,$table_name = ""){
            //判斷是否爲數組,進行SQL拼接
            if(is_array($info)){
                $field = "";
                $val ="";
                $fields = "";
                $vals ="";
                foreach($info as $k=>$v){
                    $field .= "`".$k."`,";
                    $val .= "'".$v."',";
                }
                //$fields =  substr($field,0,strlen($field)-1);
                //$vals = substr($val,0,strlen($val)-1);
                $fields = trim($field,",");
                $vals = trim($val,",");
                $sql = "INSERT INTO {$table_name} ({$fields}) VALUES ({$vals})";
                if(mysqli_query($this->link,$sql)){
                    return mysqli_insert_id($this->link);
                }else{
                    echo "error:".$sql."<br/>".mysqli_error($this->link);
                }
            //判斷是否爲SQL語句
            }else if(is_string($info)){
                if(mysqli_query($this->link,$info)){
                    return mysqli_insert_id($this->link);
                }else{
                    echo "error:".$info."<br/>".mysqli_error($this->link);
                }
            }else{
                echo "error";
            }
        }

        /*
         *describe:更新
         *@param type:array            $info       傳入的修改的數組
         *@param type:string           $table_name 需修改的表名
         *@param type:array            $where      修改的where條件,傳入數組
        */
        public function update($info,$table_name = "",$where=""){
            //判斷是否是數組,進行SQL拼接
            if(is_array($info)){
                $field = "";
                $fields = "";
                //拼接修改語句
                foreach($info as $k=>$v){
                    $field .= "`{$k}`='{$v}',";
                }
                $fields = trim($field,",");
                //拼接where條件
                $where_string = "";            
                $where_string = $this->getWhere($where);
                //拼接SQL
                $sql = "UPDATE {$table_name} SET {$fields} where {$where_string}";
                echo $sql;
                die();
                if(mysqli_query($this->link,$sql)){
                    return mysqli_affected_rows($this->link);
                }else{
                    echo "error:".$sql."<br/>".mysqli_error($this->link);
                }
            }else{
                echo "error";
            }
        }

        /*
         *describe:刪除
         *@param $where        type:array   傳入需要刪除的where條件  爲數組
         *@param $table_name   type:string  需要刪除的表名
        */
        public function del($where,$table_name=""){
            if(is_array($where)){
                $where_string ="";
                //拼接where條件
                $where_string = $this->getWhere($where);
                $sql = "DELETE FROM {$table_name} WHERE {$where_string}";
                if(mysqli_query($this->link,$sql)){
                    return mysqli_affected_rows($this->link);
                }else{
                    echo "error:".$sql."<br/>".mysqli_error($this->link);
                }
            }else{
                echo "error";
            }
        }

        /*
         *describe:執行原生sql
         *@param $sql  type:string 需要執行的sql
        */
        public function query($sql){
            if(mysqli_query($this->link,$sql)){
                return mysqli_affected_rows($this->link);
            }else{
                echo "error:".$sql."<br/>".mysqli_error($this->link);
            }
        }

        /*
         *describe:拼接where條件
         *@param $where type:array  傳入where爲數組的條件
         */
         private function getWhere($where){
            $where_string = "";
            if(is_array($where)){
                foreach($where as $k=>$v){
                    if(is_array($v)){
                        foreach($v as $kk=>$vv){
                            $where_string .= "`{$k}` {$kk} '{$vv}' AND ";
                        }
                    }else{
                        $where_string .= "`{$k}`='{$v}' AND ";
                    }
                }
            }
            return rtrim($where_string,"AND ");
         }
    }


    //測試 mysql類
    $class = DB::getInstance("localhost","root","123456","test");
    $data = array(
        "city_name"=>"test12222222",
        "pid"=>"111111",
    );
    $where = array(
        "id"=>"438",
        "city_name"=>array("like"=>"%test%"),
    );
    //var_dump($class->query("DELETE FROM city WHERE `city_name` LIKE '%test%'"));
    //var_dump($class->add($data,"city"));
    //var_dump($class->del($where,"city"));
    //var_dump($class->update($data,"city",$where));
    //var_dump($class->getField("city_name,pid","city",$where));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章