1. 程式人生 > >封裝自己DB

封裝自己DB

自動 更新 遍歷 time 函數 日誌文件 mys 選中 tchar

DB.class.php

<?php
/**
 * Created by PhpStorm.
 * User: brady.wang
 * Date: 2017/11/10
 * Time: 18:00
 */

    //封裝一個DB類,用來專門操作數據庫,以後凡是對數據庫的操作,都由DB類的對象來實現
    class DB{
        //屬性
        private $host;
        private $port;
        private $user;
        private $pass;
        private $dbname;
        private $charset;
        private $prefix;            //表前綴
        private $link;                //連接資源(連接數據庫,一般會返回一個資源,所以需要定義一個link屬性)

        //構造方法(作用:為了初始化對象的屬性),會被自動調用
        /*
         * @param1 array $arr,默認為空,裏面是一個關聯數組,裏面有7個元素
         * array(‘host‘ => ‘localhost‘,‘port‘ => ‘3306‘);
         */
        public function __construct($arr = array()){
            //初始化
            $this->host = isset($arr[‘host‘]) ? $arr[‘host‘] : ‘localhost‘;//先判斷是否有自己的host,如果有就用自己的host,否則就使用默認的localhost
            $this->port = isset($arr[‘port‘]) ? $arr[‘port‘] : ‘3306‘;
            $this->user = isset($arr[‘user‘]) ? $arr[‘user‘] : ‘root‘;
            $this->pass = isset($arr[‘pass‘]) ? $arr[‘pass‘] : ‘root‘;
            $this->dbname = isset($arr[‘dbname‘]) ? $arr[‘dbname‘] : ‘test‘;
            $this->charset = isset($arr[‘charset‘]) ? $arr[‘charset‘] : ‘utf8‘;
            $this->prefix = isset($arr[‘prefix‘]) ? $arr[‘prefix‘] : ‘‘;

            //連接數據庫(類是要操作數據庫,因此要連接數據庫)
            $this->connect();

            //設置字符集
            $this->setCharset();

            //選擇數據庫
            $this->setDbname();
        }

        /*
         * 連接數據庫
        */
        private function connect(){
            //mysql擴展連接
            $this->link = mysql_connect($this->host . ‘:‘ . $this->port,$this->user,$this->pass);

            //判斷結果
            if(!$this->link){
                //結果出錯了
                //暴力處理,如果是真實線上項目(生產環境)必須寫入到日誌文件
                echo ‘數據庫連接錯誤:<br/>‘;
                echo ‘錯誤編號‘ . mysql_errno() . ‘<br/>‘;
                echo ‘錯誤內容‘ . mysql_error() . ‘<br/>‘;
                exit;
            }
        }

        /*
         * 設置字符集
        */
        private function setCharset(){
            //設置
            $this->db_query("set names {$this->charset}");
        }

        /*
         * 選擇數據庫
        */
        private function setDbname(){
            $this->db_query("use {$this->dbname}");
        }

        /*
         * 增加數據
         * @param1 string $sql,要執行的插入語句
         * @return boolean,成功返回是自動增長的ID,失敗返回FALSE
        */
        public function insert($sql){
            //發送數據
            $this->db_query($sql);

            //成功返回自增ID
            return mysql_affected_rows() ? mysql_insert_id() : FALSE;
        }

        /*
         * 刪除數據
         * @param1 string $sql,要執行的刪除語句
         * @return Boolean,成功返回受影響的行數,失敗返回FALSE
        */
        public function delete($sql){
            //發送SQL
            $this->db_query($sql);

            //判斷結果
            return mysql_affected_rows() ? mysql_affected_rows() : FALSE;
        }

        /*
         * 更新數據
         * @param1 string $sql,要執行的更新語句
         * @return Boolean,成功返回受影響的行數,失敗返回FALSE
        */
        public function update($sql){
            //發送SQL
            $this->db_query($sql);

            //判斷結果
            return mysql_affected_rows() ? mysql_affected_rows() : FALSE;
        }

        /*
         * 查詢:查詢一條記錄
         * @param1 string $sql,要查詢的SQL語句
         * @return mixed,成功返回一個數組,失敗返回FALSE
        */
        public function get_row($sql){
            //發送SQL
            $res = $this->db_query($sql);

            //判斷返回
            return mysql_num_rows($res) ? mysql_fetch_assoc($res) : FALSE;
        }

        /*
         * 查詢:查詢多條記錄
         * @param1 string $sql,要查詢的SQL語句
         * @return mixed,成功返回一個二維數組,失敗返回FALSE
        */
        public function get_all($sql){
            //發送SQL
            $res = $this->db_query($sql);

            //判斷返回
            if(mysql_num_rows($res)){
                //循環遍歷
                $list = array();

                //遍歷
                while($row = mysql_fetch_assoc($res)){
                    $list[] = $row;
                }

                //返回
                return $list;
            }

            //返回FALSE
            return FALSE;
        }

        /*
         * mysql_query錯誤處理
         * @param1 string $sql,需要執行的SQL語句
         * @return mixed,只要語句不出錯,全部返回
        */
        private function db_query($sql){
            //發送SQL
            $res = mysql_query($sql);

            //判斷結果
            if(!$res){
                //結果出錯了
                //暴力處理,如果是真實線上項目(生產環境)必須寫入到日誌文件
                echo ‘語句出現錯誤:<br/>‘;
                echo ‘錯誤編號‘ . mysql_errno() . ‘<br/>‘;
                echo ‘錯誤內容‘ . mysql_error() . ‘<br/>‘;
                exit;
            }
            //沒有錯誤
            return $res;
        }
        //__sleep方法
        public function __sleep(){
            //返回需要保存的屬性的數組
            return array(‘host‘,‘port‘,‘user‘,‘pass‘,‘dbname‘,‘charset‘,‘prefix‘);
        }

        //__wakeup方法
        public function __wakeup(){
            //連接資源
            $this->connect();
            //設置字符集和選中數據庫
            $this->setCharset();
            $this->setDbname();
        }

        /*
         * 獲取完整的表名
        */
        protected function get_table_name(){
            //完整表名:前綴+表名
            return $this->prefix . $this->table;
        }
    }
//這個DB類,一般不寫析構(不釋放資源)

  test.php

<?php
/**
 * Created by PhpStorm.
 * User: brady.wang
 * Date: 2017/11/10
 * Time: 18:04
 */


//使用DB類的對象來訪問數據庫
//先加載類文件
//include_once ‘DB.class.php‘;
//如果想使用其他類,又需要加載(所以使用魔術函數__autoload來實現類的自動加載)
//顯示的寫出魔術函數__autoload
//參數:需要加載的類的名字
function __autoload($a){
    //將對應的類文件加載進來
    if(is_file("$a.class.php")){
        include_once "$a.class.php";
    }
}
//實例化
$db = new DB(array(‘host‘ => ‘192.168.33.30‘));

$sql = "select * from user where id = 1";
$res = $db->get_row($sql);
function dump($arr)
{
    echo "<pre>";
    print_r($arr);
    echo "</pre>";
}
dump($res);

  

封裝自己DB