封裝自己的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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...