封裝自己的DB類(PHP)

来源:http://www.cnblogs.com/qijunjun/archive/2016/02/26/5222077.html
-Advertisement-
Play Games

封裝一個DB類,用來專門操作資料庫,以後凡是對資料庫的操作,都由DB類的對象來實現。這樣有了自己的DB類,寫項目時簡單的sql語句就不用每次寫了,直接調用就行,很方便! 1.封裝一個DB類。一個類文件應該只有一個類,其他的內容全部都沒有。類文件的命名規則:類名.class.php 下麵是創建DB類的


封裝一個DB類,用來專門操作資料庫,以後凡是對資料庫的操作,都由DB類的對象來實現。這樣有了自己的DB類,寫項目時簡單的sql語句就不用每次寫了,直接調用就行,很方便!

1.封裝一個DB類。一個類文件應該只有一個類,其他的內容全部都沒有。類文件的命名規則:類名.class.php

下麵是創建DB類的代碼:

<?php

    //封裝一個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'] : 'mydatabase';
            $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 db_insert($sql){
            //發送數據
            $this->db_query($sql);
            
            //成功返回自增ID
            return mysql_affected_rows() ? mysql_insert_id() : FALSE;
        }

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

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

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

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

        /*
         * 查詢:查詢一條記錄
         * @param1 string $sql,要查詢的SQL語句
         * @return mixed,成功返回一個數組,失敗返回FALSE
        */
        public function db_getRow($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 db_getAll($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 getTableName(){
            //完整表名:首碼+表名
            return $this->prefix . $this->table;
        }
    }
//這個DB類,一般不寫析構(不釋放資源)    

2.使用DB類,但是如果要使用某一個類來創建對象,必須要保證該類已經被載入到代碼區里。可以使用一個魔術函數來實現對類的自動載入

自動載入:當一個腳本文件在執行某些語句的時候(實例化)需要去代碼區里尋找對應的類,如果找不到會通過自動載入函數來將對應的類文件進行載入。

魔術函數__autoload()

比如我們在index.php頁面中需要使用DB類,那麼我們就直接調用即可,具體代碼如下:

<?php
    //使用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('dbname' => 'mydatabase'));

    
    

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原理:php預設擴展庫不含有redis擴展;要支持redis擴展,需要有redis.so這個擴展文件 所以我們的目標就是生成redis.so擴展文件,並修改php.ini 讓其支持redis擴展。 準備測試環境與軟體: Vm虛擬機; CentOS5.5(已搭建好LNMP環境); Redis-2.6.
  • 模塊概念:用一砣代碼實現了某個功能的代碼集合。 類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對於一個複雜的功能來,可能需要多個函數才能完成(函數又可以在不同的.py文件中),n個 .py 文件組成的代碼集合就稱為模塊。 模塊分為
  • 尊重原創,轉載來源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct對C中的struct進行了擴充,它已經不再只是一個包含不同數據類型的數據結構了,它已經獲取了太多的功能。struct能包含成員函數嗎? 能!struct
  • 首先下載安裝tomcat,在官網下載即可,目前的版本有最新的到tomcat9.0,但是在實際的開發過程中一般為tomcat7.0或者tomcat8.0,在這裡大部分為tomcat7.0,所以下載這個版本就可以了。在安裝過程中基本採取預設的安裝路徑即可,也可以自己指定安裝的路徑,安裝後要進行環境的配置
  • atitit.編程語言 類與對象的 擴展機制.doc 1.1. Java 下一代: 沒有繼承性的擴展1 1.2. 繼承1 1.3. 使用cglib動態為Java類添加方法1 1.4. 工具類 1 1.5. Wrap 包裝類 裝飾器模式2 1.6. 擴展方法 (其實就是工具類的語法糖)2 1.7. S
  • Atitit .c#的未來新特性計劃草案 1. C#的未來:追蹤空引用1 1.1. 2. 變數命名空間1 1.2. 10. 項目引用Native dll2 1.3. 10. 項目引用Native dll2 2. 三、設計面向 面向變數的彙編語言,高級語言出現後,從Pascal/C語言面向過程和變數,
  • atitit.groovy 語法特性 1. Groovy 1.6概覽1 1.1. 多路賦值2 2. 新發佈的Groovy2.0為這門語言帶來了關鍵的靜態特性:靜態類型檢查和靜態編譯;2 3. 參考3 增強的ast @log @field 3. 動態類型def6 4. 迴圈變數不需要def6 5. S
  • Atitit避免出現空指針異常解決方案 1. Null的問題1 2. 強制區分一般引用vs 可空引用 vs 強制引用,或者說非空引用2 3. ?運算符(問號運算符) !感嘆號運算符避免出現空指針異常,2 4. Java 8中的Optional類2 4.1.1. 為什麼使用Optional要比常見的n
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...