http://blog.csdn.net/yanhui_wei/article/details/25803945
一、大綱
- 1、codeigniter框架的授課內容安排
- 2、codeigniter框架的簡介
- |-----關於框架的概念
- |-----使用CI框架的好處
- |-----為什么選擇CI框架
- 3、codeigniter框架的具體安裝步驟
- |-----官網下載:http://www.codeigniter.com/
- |-----httpd.conf配置文件中rewrite重寫機制的開啟
- |-----httpd.conf配置文件虛擬主機的開啟
- |-----httpd-vhosts.conf配置文件中虛擬主機的配置
- |-----hosts文件中添加DNS映射
- 4、codeigniter框架的目錄結構分析
- |-----框架目錄結構分析
- |-----項目部署
- 5、codeigniter框架中URL各部分的分析及簡單的工作原理:http://域名/入口文件/模塊名/控制器/方法/參數列表
- 6、codeigniter框架詳細執行流程分析:如果沒有模塊文件夾的話,則為:http://域名/入口文件/控制器/方法/參數列表
- 7、codeigniter框架中config.php配置文件的分析
- 8、codeigniter框架中使用rewrite重寫機制隱藏index.php單一入口文件
- 9、codeigniter框架中控制器
- |-----控制器的創建位置
- |-----控制器的命名規范
- |-----控制器文件的分目錄管理
- |-----方法的命名規范:1、不能以list命名 2、方法名與類名不同名
- |-----方法中如何獲取GET方式提交過來的數據,如:$username = $this->input->get_post('username', true);//獲取post或get方式提交過來的數據
- |-----方法中如何獲取POST方式提交過來的數據,如:$username = $this->input->post('username', true);$username = $this->input->get_post('username', true);
- 10、codeigniter框架中視圖
- |-----視圖的創建位置:appcation/views/ 目錄下
- |-----視圖的命名規范:login.php login.html
- |-----如何在控制器中載入視圖模板文件:$this->load->view("login"); $this->load->view("login.html");
- |-----如何在控制器中給視圖模板文件傳遞數據:$this->load->view("login.html",$data);//extract函數
- |-----視圖模板文件的分目錄管理:$this->load->view("admin/category/addcategory.html");
- 11、codeigniter框架中的模型
- |-----模型的創建位置:application/models 目錄下
- |-----模型的命名規范:不區分大小寫,建議首字母大寫
- |-----如何在控制器中載入模型(自動加載和手動加載):$this->load->model("user_model");
- |-----模型文件的分目錄管理:$this->load->model("admin/user_model");
- 12、codeigniter框架中如何擴展控制器、模型
- |-----基控制器的擴展:class Common extends CI_Controller{}
- |-----基模型的擴展:class Model extends CI_Model{}
- 13、codeigniter框架中數據庫操作
- |-----連接mysql數據庫的配置:application/config/database.php
- |-----如何在模型中連接mysql數據庫(自動載入和手動載入):$this->load->database();
- |-----使用普通查詢操作完整數據的增刪改查操作:1、$this->db->query($query);//結果集
- |-----使用快捷操作類完成數據的增刪改查操作:將sql語句的拼接放在成員方法中進行
- |-----用戶管理系統-管理員的查詢
- |-----用戶管理系統-管理員的添加
- |-----用戶管理系統-管理員的修改
- |-----用戶管理系統-管理員的刪除
- 14、codeigniter框架中輔助函數
- |-----輔助函數的位置:application/helpers 目錄 或 system/helpers 目錄
- |-----如何在控制器中載入輔助函數:$this->load->helper("url");//載入url_helper.php文件
- |-----自定義輔助函數
- |-----輔助函數的擴展
- |-----輔助函數的載入機制:首先考慮載入application/helpers 目錄下的文件,再考慮載入system/helpers 目錄下的文件
- |-----用戶管理系統-頁面的跳轉:header("location:".site_url("admin/login/"));//創建一個url,並跳轉
- 15、codeigniter框架中的配置文件
- |-----配置文件的位置:application/config/ 目錄下
- |-----如何在CI項目的控制器中載入配置文件(手動載入和自動載入):$this->config->load("pagination");
- |-----如何自定義配置文件:application/config/pagination.php 配置項變量名必須是 $config['配置項']
- |-----配置文件中配置項的命名規范:$config['配置項']
- |-----如何動態給配置項設置值:$this->config->set_item("配置項","配置項值");
- |-----如何將分頁配置寫到配置文件中
- |-----如何將配置文件合並:$this->config->load("pagination",true);//參數2:true
- 16、codeigniter框架中的通用類庫
- |-----通用類庫的位置:application/libraries/ 目錄 system/libraries/ 目錄
- |-----如何在ci項目的控制器中載入通用類庫:$this->load->library("upload");//文件上傳類庫的載入
- |-----通用類庫的載入機制:優先考慮載入application/libraries/ 目錄下類庫,其次考慮載入 system/libraries 目錄下類庫
- |-----分頁類庫的載入(定制分頁風格):$this->load->library("pagination");
- |-----用戶管理系統-管理員列表頁分頁功能的完成
- 17、codeigniter框架與smarty模板引擎的無縫整合
- |-----如何將第三方類庫:smarty模板引擎整合到CI項目中來
- |-----如何在控制器中載入smarty模板引擎:$this->load->library("tp");
- 18、codeigniter框架中完成用戶登錄系統
- |-----用戶登錄系統-session類庫的使用
- |-----用戶登錄系統-cookie類庫的使用
- |-----用戶登錄系統-使用captache輔助函數完成圖像驗證碼的創建
- |-----用戶登錄系統-驗證碼原理
- |-----用戶登錄系統-session登錄
- |-----用戶登錄系統-cookie登錄
- |-----用戶登錄系統-增加公共操作控制器(擴展系統核心控制器類文件)
- |-----用戶登錄系統-cookie的三種使用方式
- |-----php原生態語法結構中設置cookie的函數
- |-----ci框架的cookie輔助函數
- |-----input類庫
- 19、codeigniter框架與ueditor編輯器的無縫整合
- |-----整合步驟
- 20、codeigniter框架與fckeditor編輯器的無縫整合
- |-----整合步驟
- 21、codeigniter框架中完成無限級分類下拉菜單
- |-----無線遞歸方式完成(比較復雜一點,效率低,不推薦使用)
- |-----path方式完成(最為簡便的方式,幾行代碼就可搞定)
- 22、codeigniter框架中使用jquery完成省市區三級聯動功能
- 23、codeigniter框架中完成商品分類管理模塊
- |-----商品分類管理模塊-添加商品分類
- |-----商品分類管理模塊-添加商品子分類
- |-----商品分類管理模塊-修改商品分類
- |-----商品分類管理模塊-商品分類列表
- |-----商品分類管理模塊-商品分類的刪除
- |-----商品分類管理模塊-商品分類排序
- |-----文件上傳類庫的使用
- |-----圖像處理類庫的使用
- |-----商品分類管理模塊-添加分類banner
- |-----如何將文件上傳和圖像處理的有關配置放到配置文件中
- |-----商品分類管理模塊-分類banner列表
- |-----商品分類管理模塊-編輯分類banner
- |-----商品分類管理模塊-banner的啟用和禁用
- |-----商品分類管理模塊-分類banner排序
- 24、codeigniter框架完成一個權限管理系統
- |-----權限管理系統-數據表的創建
- |-----權限管理系統-業務分析
- |-----權限管理系統-操作權限管理
- |-----權限管理系統-添加操作權限
- |-----權限管理系統-修改操作權限
- |-----權限管理系統-刪除操作權限
- |-----權限管理系統-模塊管理
- |-----權限管理系統-添加模塊
- |-----權限管理系統-修改模塊
- |-----權限管理系統-刪除模塊
- |-----權限管理系統-角色管理
- |-----權限管理系統-添加角色並為角色設置權限
- |-----權限管理系統-為當前角色添加操作權限
- |-----權限管理系統-為當前角色刪除操作權限
- |-----權限管理系統-修改角色
- |-----權限管理系統-刪除角色
- |-----權限管理系統-添加管理員的同時為管理員設置多個角色
- |-----權限管理系統-添加管理員角色
- |-----權限管理系統-修改管理員角色
- |-----權限管理系統-刪除管理員角色
- |-----權限管理系統-當前管理員角色列表
- 25、顯示最后一條查詢的sql語句:主要用於在連貫操作時,檢測拼接的sql語句是否正確
- echo $this->db->last_query();//如:select * from pt_users where uid>10 order by datetime desc limit 0,10
- 26、CI_DB_pdo_driver PDO數據庫驅動類
- $this->db->affected_rows();//影響記錄數,區分:$this->db->get("order_master")->num_rows();//獲取到的結果集行數
- $this->db->count_all("order_master");//對於某個表不帶條件的查詢
- $this->db->count_all_results();//快捷操作類方法,適用於帶條件的查詢
- $this->db->insert_id();//新插入記錄的id
- $this->db->trans_enabled = true;//開啟事務(默認是false,所以在使用事務前必須將其賦值為true)
- $this->db->trans_begin();//開始事務
- $this->db->trans_rollback();//事務回滾
- $this->db->trans_commit();//提交事務
- $this->db->trans_status();//事務狀態 true 或 false CI_DB_driver驅動類中的方法
- 27、CI_DB_mysql_driver mysql數據庫驅動類
- $this->db->affected_rows();//影響記錄數,區分:$this->db->get("order_master")->num_rows();//獲取到的結果集行數
- $this->db->count_all("order_master");//對於某個表不帶條件的查詢
- $this->db->count_all_results();//快捷操作類方法,適用於帶條件的查詢
- $this->db->insert_id();//新插入記錄的id
- $this->db->trans_enabled = true;//開啟事務(默認是false,所以在使用事務前必須將其賦值為true)
- $this->db->trans_begin();//開始事務
- $this->db->trans_rollback();//事務回滾
- $this->db->trans_commit();//提交事務
- $this->db->trans_status();//事務狀態 true 或 false CI_DB_driver驅動類中的方法
- 28、CI_DB_mysqli_driver mysqli數據庫驅動類
- $this->db->affected_rows();//影響記錄數,區分:$this->db->get("order_master")->num_rows();//獲取到的結果集行數
- $this->db->count_all("order_master");//對於某個表不帶條件的查詢
- $this->db->count_all_results();//快捷操作類方法,適用於帶條件的查詢
- $this->db->insert_id();//新插入記錄的id
- $this->db->trans_enabled = true;//開啟事務(默認是false,所以在使用事務前必須將其賦值為true)
- $this->db->trans_begin();//開始事務
- $this->db->trans_rollback();//事務回滾
- $this->db->trans_commit();//提交事務
- $this->db->trans_status();//事務狀態 true 或 false CI_DB_driver驅動類中的方法
- 29、model模型類中引用其它model模型類(如:category_model)和數據庫(如:product)
- public function __construct() {
- parent::__construct();
- $this->product_db = $this->load->database('product', true);//通過model基類中的__get()方法選擇性的引入CI超級對象中已加載類庫,如:"load"
- $this->load->model('category_model');
- }
- 30、控制器中引用其它模型類(如:category_model)和數據庫(如:product)
- public function __construct() {
- parent::__construct();
- $this->product_db = $this->load->database('product', true);
- $this->load->model('category_model');
- }
- 31、helper函數中引用CI超級對象的方法
- function get_order_status_by_order($order_status){
- $CI =& get_instance();//獲取CI超級對象
- $CI->load->Model('order_model');//通過CI超級對象可以載入任何模型
- }
- 32、緩存驅動的加載方式
- $this->load->driver('cache', array('adapter' => 'memcached'));//加載緩存驅動或緩存適配器,當前為memcached緩存;注意:CI框架只支持memcached,不支持memcache,windows操作系統下只有memcache擴展
- $this->load->driver('cache', array('adapter' => 'file'));//加載緩存驅動或緩存適配器,當前為file緩存
- $this->load->driver('cache', array('adapter' => 'redis'));//加載緩存驅動或緩存適配器,當前為redis緩存
- $this->load->driver('cache', array('adapter' => 'apc', 'backup' => 'file'));//優先選擇apc緩存,file文件緩存作為替代方案;如果服務器不支持apc緩存時,選擇file文件緩存
- 33、靜態html模板文件中如何動態加載區域塊內容
- //index.html文件
- <div include="/index.php/pub/common_nav" rel="include"></div>
- //jquery代碼
- $(document).ready(function () {
- $('[rel=\'include\']').each(function (e) {
- var t = $(this),
- url = t.attr('include') + location.search;
- url && $.get(url, function (data) {//url:'/index.php/pub/common_nav'
- t.html(data);
- })
- })
- })
- 34、拼接insert sql語句
- /**
- *一維關聯數組,拼接sql語句
- *$data['username']="admin";
- *$data['password']="12345";
- *$data['sex']="";
- */
- function add_user( $data ) {
- if ( empty($data) || !is_array($data) ) {
- return false;
- }
- foreach ($data as $key => $value) {
- if ( $value === '') {
- unset($data[$key]);//刪除數組中值為空的元素
- }
- }
- $cols = array_keys($data);//獲取數組所有的鍵名
- $values = array_values($data);//獲取數組所有的值
- $cols_str = implode(",", $cols);//將數組所有的鍵名拼接成一個字符串
- $values_str = "'".implode("','", $values)."'";//將數組所有的鍵值放到單引號中
- //拼接sql:INSERT INTO user (username,password) VALUES ('admin','12345');
- $sql = "INSERT INTO user ({$cols_str}) VALUES ({$values_str})";//拼接sql
- $this->db->query($sql);
- }
- 35、拼接insert sql語句
- /**
- *一維關聯數組,拼接sql語句
- *$data['username']="admin";
- *$data['password']="12345";
- *$data['sex']="";
- */
- function add_user( $data ) {
- if ( empty($data) || !is_array($data) ) {
- return false;
- }
- foreach ($data as $key => $value) {
- if ( $value === '') {
- unset($data[$key]);//刪除數組中值為空的元素
- }
- }
- $cols = array_keys($data);//獲取數組所有的鍵名
- $values = array_values($data);//獲取數組所有的值
- foreach($values as $k=>$val){
- $values[$k]="'".$val."'";//將所有的鍵值放到單引號中
- }
- $cols_str = implode(",", $cols);//將數組所有的鍵名拼接成一個字符串
- $values_str = implode(",", $values);//將數組所有的鍵值拼接成一個字符串
- //拼接sql:INSERT INTO user (username,password) VALUES ('admin','12345');
- $sql = "INSERT INTO user ({$cols_str}) VALUES ({$values_str})";//拼接sql
- $this->db->query($sql);
- }
- 36、拼接update sql語句
- /**
- * 編輯用戶信息
- * $userid=1;
- * $data['username']='admin';
- * $data['password']='123';
- */
- function edit_user(userid, $data) {
- if ( empty($data) || !is_array($data) ) {
- return;
- }
- foreach ($data as $key => $value) {
- $str .= isset($str)?", {$key} = '{$value}'":"{$key} = '{$value}'";
- }
- //拼接sql:UPDATE user SET username='admin',password='123' WHERE addr_id = '1';
- $sql = "UPDATE user SET {$str} WHERE addr_id = '{$addr_id}'";
- $this->db->query($sql);
- }
- 37、數據庫快捷操作類常用方法
- /**
- * 查詢訂單
- *
- * @param $query
- */
- public function get_order_list($query, $offset = 0, $limit = 20) {
- if (is_array($query) && !empty($query)) {
- foreach ($query as $key => $val) {
- if (is_array($val)) {
- $this->order_db->where_in($key, $val);
- } else {
- $this->order_db->where($key, $val);
- }
- }
- }
- $this->order_db->order_by('updatetime', 'desc');
- $this->order_db->order_by('id', 'desc');
- if (!$limit) {
- $query = $this->order_db->get('order');
- } else {
- $query = $this->order_db->get('order', $limit, $offset);
- }
- if ($query->num_rows() > 0) {
- return $query->result_array();
- }
- return array();
- }
- 38、拼接select sql語句
- function get_user_list($cols=array("username","password")) {
- $col=implode(",",$cols);//查詢的列屬性
- $sql = "SELECT $col FROM user ORDER BY addr_id DESC";
- $this->db->query($sql)->result_array();
- }
- 39、CI框架中cookie的三種使用方式
- //第一種設置cookie的方式:采用php原生態的方法設置的cookie的值
- setcookie("user_id",$user_info['user_id'],86500);
- setcookie("username",$user_info['username'],86500);
- setcookie("password",$user_info['password'],86500);
- //echo $_COOKIE['username'];
- //第二種設置cookie的方式:通過CI框架的input類庫設置cookie的值
- $this->input->set_cookie("username",$user_info['username'],60);
- $this->input->set_cookie("password",$user_info['password'],60);
- $this->input->set_cookie("user_id",$user_info['user_id'],60);
- //echo $this->input->cookie("password");//適用於控制器
- //echo $this->input->cookie("username");//適用於控制器
- //echo $_COOKIE['username'];//在模型類中可以通過這種方式獲取cookie值
- //echo $_COOKIE['password'];//在模型類中可以通過這種方式獲取cookie值
- //第三種設置cookie的方式:通過CI框架的cookie_helper.php輔助函數庫設置cookie的值
- set_cookie("username",$user_info['username'],60);
- set_cookie("password",$user_info['password'],60);
- set_cookie("user_id",$user_info['user_id'],60);
- //echo get_cookie("username");
- 40、array_merge()合並數組函數的使用
- <?php
- header("content-type:text/html;charset='utf-8'");
- $arr1=array(
- "13012"=>array(
- "brand_id"=>2,
- "category_id"=>3
- )
- );
- $arr2=array(
- "13012"=>array(
- "goods_id"=>3576,
- "goods_name"=>"sanyang"
- )
- );
- /**
- *echo "<pre>";print_r(array_merge($arr1,$arr2));
- *結果:
- *Array
- * (
- * [0] => Array //索引重置為數字索引
- * (
- * [brand_id] => 2
- * [category_id] => 3
- * )
- * [1] => Array
- * (
- * [goods_id] => 3576
- * [goods_name] => sanyang
- * )
- * )
- */
- /**
- *echo "<pre>";print_r(array_merge($arr1['13012'],$arr2['13012']));
- *結果:
- * Array
- * (
- * [brand_id] => 2
- * [category_id] => 3
- * [goods_id] => 3576
- * [goods_name] => sanyang
- * )
- */
- ?>
- 41.json格式數據:
- public function json(){
- $data[0]['goods_id']=3567;
- $data[0]['goods_name']="sanyang";
- $data[1]['goods_id']=3567;
- $data[1]['goods_name']="sanyang";
- echo json_encode($data);exit;
- /**
- * 結果:
- * [
- * {
- * "goods_id": 3567,
- * "goods_name": "sanyang"
- * },
- * {
- * "goods_id": 3567,
- * "goods_name": "sanyang"
- * }
- *]
- */
- }
- 42.聯合查詢 left join
- //controller控制器
- $query = array(
- 'product_id' => $product_id,
- 'activity.status' => array(1, 2, 0),
- 'activity.is_del' => 0
- );
- $query['activity.activity_id<>'] = $activity_id;
- $goods_list = $this->activity_model->get_activity_good_mapping($query, 0, 0);
- //model模型
- public function get_activity_good_mapping($query,$offset = 0, $limit = 0,$get=''){
- $this->db = $this->activity_db;
- if (is_array($query) && !empty($query)) {
- foreach ($query as $key => $val) {
- if (is_array($val)) {
- $this->db->where_in($key, $val);
- } else {
- $this->db->where($key, $val);
- }
- }
- }
- $this->db->from('activity_goods');
- $this->db->join('activity', 'activity_goods.activity_id = activity.activity_id','left');
- if (!$limit) {
- } else {
- $query = $this->db->limit($limit, $offset);
- }
- $query = $this->db->get();
- if ($query->num_rows() > 0) {
- return $query->result_array();
- }
- return array();
- }
- 43.ci框架如何記錄sql日志?
- (1)配置日志目錄: 在"application/config/config.php" 文件中配置日志目錄
- $config['log_path']="/opt/www/logs/";
- (2)在 "system/database/DB_driver.php" 文件的query()方法末尾添加如下語句:
- log_message( 'db','【sql語句:'.$this->last_query().'】');//這樣所有執行過的sql語句都會按日期時間格式記錄到 "/opt/www/logs/" 目錄下
- return $RES;
二、部分截圖如下:
三、數據庫操作類之間的繼承關系(區分數據庫普通操作類和數據庫快捷操作類),如圖所示:
注意:CI_DB類是在DB()函數中動態定義的,沒有單獨的類庫文件
DB()函數在DB.php文件中定義
DB.php文件中部分代碼如下:
- require_once(BASEPATH.'database/DB_driver.php');//類名:CI_DB_driver
- if ( ! isset($active_record) OR $active_record == TRUE)
- {
- require_once(BASEPATH.'database/DB_active_rec.php');
- if ( ! class_exists('CI_DB'))
- {
- eval('class CI_DB extends CI_DB_active_record { }');//繼承關系
- }
- }
- else
- {
- if ( ! class_exists('CI_DB'))
- {
- eval('class CI_DB extends CI_DB_driver { }');//繼承關系
- }
- }
- require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php');//類名:CI_DB_mysql_driver
- // Instantiate the DB adapter
- $driver = 'CI_DB_'.$params['dbdriver'].'_driver';//類名:"CI_DB_mysql_driver"
- $DB = new $driver($params);//創建一個數據庫操作類句柄對象: $DB=new CI_DB_mysql_driver($paams); 繼承關系:class CI_DB_mysql_driver extends CI_DB{}
- if ($DB->autoinit == TRUE)
- {
- $DB->initialize();
- }
- if (isset($params['stricton']) && $params['stricton'] == TRUE)
- {
- $DB->query('SET SESSION sql_mode="STRICT_ALL_TABLES"');
- }
- return $DB;//返回數據庫操作類句柄對象
提示:$this->load->database();//內部通過加載DB.php文件並調用DB()函數來實現不同數據庫驅動類的加載
$this->product_db = $this->load->database('product', true);//連接"product"數據庫,並返回數據庫操作類句柄,參數2-代表返回的數據庫句柄
$this->wms_db = $this->load->database('wms', true);//連接"wms"數據庫,並返回數據庫操作類句柄,參數2-代表返回的數據庫句柄
$this->order_db = $this->load->database('order', true);//連接"order"數據庫,並返回數據庫操作類句柄,參數2-代表返回的數據庫句柄
四、模型類分析:CI_Model
模型類分析:CI_Model
數據庫普通操作類(CI_DB_driver)中的query()方法內部,通過$driver= $this->load_rdriver(); $RES= new $driver();兩行代碼加載並實例化了一個CI_DB_mysql_result結果集對象(總結:以驅動的方式加載結果集對象),經過對結果集對象的一些列初始化操作,最終返回此結果集對象(總結:query()方法中返回了一個CI_DB_mysql_result結果集對象)
- //CI_DB_driver 基類中的load_rdriver()方法在數據庫普通操作基類中的query()方法中被調用,用來返回一個結果集對象
- function load_rdriver(){
- $driver = 'CI_DB_'.$this->dbdriver.'_result';
- if ( ! class_exists($driver))
- {
- include_once(BASEPATH.'database/DB_result.php');//類名:CI_DB_result
- include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php');//類名:CI_DB_mysql_result
- }
- return $driver;//繼承關系:class CI_DB_mysql_result extends CI_DB_result
- }
提示:也就是說,類似 $this->db->query("select * from user"); 的語句,返回的都是一個結果集對象
$this->db->query("select * from user")->result_array();//將結果集轉換為二維關聯數組
$this->db->query("select * from user")->row_array();//將結果集轉換為一維關聯數組
數據庫快捷操作類(CI_DB_active_record)中的get()、insert()等多個方法內部都調用了數據庫普通操作類中的query()方法,即:間接的返回了CI_DB_mysql_result結果集對象
數據庫快捷操作類中很多對結果集的操作函數內部都是通過封裝返回的CI_DB_mysql_result結果集對象中的方法來完成相似功能的(總結:get()、insert()方法內部最后調用了query()方法,並返回query()方法執行的結果,所以返回的也是一個CI_DB_mysql_result結果集對象)
數據庫快捷操作類中的方法其實只干了一件事情,那就是通過函數的方式幫助我們拼接了要執行的sql語句,並執行該sql語句
但是對於復雜的sql語句,尤其對於復雜的多表查詢語句,個人還是建議直接使用數據庫普通操作類中的query()方法(適用於兩個表以上的情況)
對於返回的結果集對象而言,結果集對象中的方法是通用的(總結:CI_DB_mysql_result結果集對象中對結果集的處理函數對於數據庫普通操作類和數據庫快捷操作類是通用的)
我們可以這樣理解:數據庫快捷操作類是對數據庫普通操作類的二次封裝
提示:數據庫操作類的繼承關系
class CI_DB_active_record extends CI_DB_driver {
//代碼
}