**【ci框架】精通CodeIgniter框架

http://blog.csdn.net/yanhui_wei/article/details/25803945

一、大纲

 

 

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 1、codeigniter框架的授课内容安排  
  2. 2、codeigniter框架的简介  
  3.   
  4.     |-----关于框架的概念  
  5.     |-----使用CI框架的好处  
  6.     |-----为什么选择CI框架  
  7.       
  8.   
  9. 3、codeigniter框架的具体安装步骤  
  10.   
  11.     |-----官网下载:http://www.codeigniter.com/  
  12.     |-----httpd.conf配置文件中rewrite重写机制的开启  
  13.     |-----httpd.conf配置文件虚拟主机的开启  
  14.     |-----httpd-vhosts.conf配置文件中虚拟主机的配置  
  15.     |-----hosts文件中添加DNS映射  
  16.   
  17. 4、codeigniter框架的目录结构分析  
  18.   
  19.     |-----框架目录结构分析  
  20.     |-----项目部署  
  21.   
  22. 5、codeigniter框架中URL各部分的分析及简单的工作原理:http://域名/入口文件/模块名/控制器/方法/参数列表  
  23. 6、codeigniter框架详细执行流程分析:如果没有模块文件夹的话,则为:http://域名/入口文件/控制器/方法/参数列表  
  24. 7、codeigniter框架中config.php配置文件的分析  
  25. 8、codeigniter框架中使用rewrite重写机制隐藏index.php单一入口文件  
  26.   
  27. 9、codeigniter框架中控制器  
  28.   
  29.     |-----控制器的创建位置  
  30.     |-----控制器的命名规范  
  31.     |-----控制器文件的分目录管理  
  32.     |-----方法的命名规范:1、不能以list命名 2、方法名与类名不同名  
  33.     |-----方法中如何获取GET方式提交过来的数据,如:$username = $this->input->get_post('username', true);//获取post或get方式提交过来的数据  
  34.     |-----方法中如何获取POST方式提交过来的数据,如:$username = $this->input->post('username', true);$username = $this->input->get_post('username', true);  
  35.       
  36. 10、codeigniter框架中视图  
  37.   
  38.     |-----视图的创建位置:appcation/views/ 目录下  
  39.     |-----视图的命名规范:login.php   login.html  
  40.     |-----如何在控制器中载入视图模板文件:$this->load->view("login"); $this->load->view("login.html");  
  41.     |-----如何在控制器中给视图模板文件传递数据:$this->load->view("login.html",$data);//extract函数  
  42.     |-----视图模板文件的分目录管理:$this->load->view("admin/category/addcategory.html");  
  43.   
  44. 11、codeigniter框架中的模型  
  45.   
  46.     |-----模型的创建位置:application/models 目录下  
  47.     |-----模型的命名规范:不区分大小写,建议首字母大写  
  48.     |-----如何在控制器中载入模型(自动加载和手动加载):$this->load->model("user_model");  
  49.     |-----模型文件的分目录管理:$this->load->model("admin/user_model");  
  50.   
  51. 12、codeigniter框架中如何扩展控制器、模型  
  52.   
  53.     |-----基控制器的扩展:class Common extends CI_Controller{}  
  54.     |-----基模型的扩展:class Model extends CI_Model{}  
  55.   
  56. 13、codeigniter框架中数据库操作  
  57.   
  58.     |-----连接mysql数据库的配置:application/config/database.php  
  59.     |-----如何在模型中连接mysql数据库(自动载入和手动载入):$this->load->database();  
  60.     |-----使用普通查询操作完整数据的增删改查操作:1、$this->db->query($query);//结果集  
  61.     |-----使用快捷操作类完成数据的增删改查操作:将sql语句的拼接放在成员方法中进行  
  62.     |-----用户管理系统-管理员的查询  
  63.     |-----用户管理系统-管理员的添加  
  64.     |-----用户管理系统-管理员的修改  
  65.     |-----用户管理系统-管理员的删除  
  66.   
  67. 14、codeigniter框架中辅助函数  
  68.   
  69.     |-----辅助函数的位置:application/helpers 目录 或 system/helpers 目录  
  70.     |-----如何在控制器中载入辅助函数:$this->load->helper("url");//载入url_helper.php文件  
  71.     |-----自定义辅助函数  
  72.     |-----辅助函数的扩展  
  73.     |-----辅助函数的载入机制:首先考虑载入application/helpers 目录下的文件,再考虑载入system/helpers 目录下的文件  
  74.     |-----用户管理系统-页面的跳转:header("location:".site_url("admin/login/"));//创建一个url,并跳转  
  75.   
  76. 15、codeigniter框架中的配置文件  
  77.       
  78.     |-----配置文件的位置:application/config/ 目录下  
  79.     |-----如何在CI项目的控制器中载入配置文件(手动载入和自动载入):$this->config->load("pagination");  
  80.     |-----如何自定义配置文件:application/config/pagination.php    配置项变量名必须是 $config['配置项']  
  81.     |-----配置文件中配置项的命名规范:$config['配置项']  
  82.     |-----如何动态给配置项设置值:$this->config->set_item("配置项","配置项值");  
  83.     |-----如何将分页配置写到配置文件中  
  84.     |-----如何将配置文件合并:$this->config->load("pagination",true);//参数2:true  
  85.   
  86. 16、codeigniter框架中的通用类库  
  87.   
  88.     |-----通用类库的位置:application/libraries/ 目录 system/libraries/ 目录  
  89.     |-----如何在ci项目的控制器中载入通用类库:$this->load->library("upload");//文件上传类库的载入  
  90.     |-----通用类库的载入机制:优先考虑载入application/libraries/ 目录下类库,其次考虑载入 system/libraries 目录下类库  
  91.     |-----分页类库的载入(定制分页风格):$this->load->library("pagination");  
  92.     |-----用户管理系统-管理员列表页分页功能的完成  
  93.   
  94. 17、codeigniter框架与smarty模板引擎的无缝整合  
  95.   
  96.     |-----如何将第三方类库:smarty模板引擎整合到CI项目中来        
  97.   
  98.     |-----如何在控制器中载入smarty模板引擎:$this->load->library("tp");  
  99.   
  100. 18、codeigniter框架中完成用户登录系统  
  101.   
  102.     |-----用户登录系统-session类库的使用  
  103.     |-----用户登录系统-cookie类库的使用  
  104.     |-----用户登录系统-使用captache辅助函数完成图像验证码的创建  
  105.     |-----用户登录系统-验证码原理  
  106.     |-----用户登录系统-session登录  
  107.     |-----用户登录系统-cookie登录  
  108.     |-----用户登录系统-增加公共操作控制器(扩展系统核心控制器类文件)  
  109.     |-----用户登录系统-cookie的三种使用方式  
  110.         |-----php原生态语法结构中设置cookie的函数  
  111.         |-----ci框架的cookie辅助函数  
  112.         |-----input类库  
  113.   
  114. 19、codeigniter框架与ueditor编辑器的无缝整合  
  115.   
  116.     |-----整合步骤  
  117.   
  118. 20、codeigniter框架与fckeditor编辑器的无缝整合  
  119.   
  120.     |-----整合步骤  
  121.   
  122. 21、codeigniter框架中完成无限级分类下拉菜单  
  123.       
  124.     |-----无线递归方式完成(比较复杂一点,效率低,不推荐使用)  
  125.     |-----path方式完成(最为简便的方式,几行代码就可搞定)  
  126.   
  127. 22、codeigniter框架中使用jquery完成省市区三级联动功能  
  128.   
  129. 23、codeigniter框架中完成商品分类管理模块  
  130.   
  131.     |-----商品分类管理模块-添加商品分类  
  132.     |-----商品分类管理模块-添加商品子分类  
  133.     |-----商品分类管理模块-修改商品分类  
  134.     |-----商品分类管理模块-商品分类列表  
  135.     |-----商品分类管理模块-商品分类的删除  
  136.     |-----商品分类管理模块-商品分类排序  
  137.     |-----文件上传类库的使用  
  138.     |-----图像处理类库的使用  
  139.     |-----商品分类管理模块-添加分类banner  
  140.     |-----如何将文件上传和图像处理的有关配置放到配置文件中  
  141.     |-----商品分类管理模块-分类banner列表  
  142.     |-----商品分类管理模块-编辑分类banner  
  143.     |-----商品分类管理模块-banner的启用和禁用  
  144.     |-----商品分类管理模块-分类banner排序  
  145.   
  146. 24、codeigniter框架完成一个权限管理系统  
  147.   
  148.     |-----权限管理系统-数据表的创建  
  149.     |-----权限管理系统-业务分析  
  150.     |-----权限管理系统-操作权限管理  
  151.     |-----权限管理系统-添加操作权限  
  152.     |-----权限管理系统-修改操作权限  
  153.     |-----权限管理系统-删除操作权限  
  154.   
  155.     |-----权限管理系统-模块管理  
  156.     |-----权限管理系统-添加模块  
  157.     |-----权限管理系统-修改模块  
  158.     |-----权限管理系统-删除模块  
  159.   
  160.     |-----权限管理系统-角色管理  
  161.     |-----权限管理系统-添加角色并为角色设置权限  
  162.     |-----权限管理系统-为当前角色添加操作权限  
  163.     |-----权限管理系统-为当前角色删除操作权限  
  164.     |-----权限管理系统-修改角色  
  165.     |-----权限管理系统-删除角色  
  166.   
  167.     |-----权限管理系统-添加管理员的同时为管理员设置多个角色  
  168.     |-----权限管理系统-添加管理员角色  
  169.     |-----权限管理系统-修改管理员角色  
  170.     |-----权限管理系统-删除管理员角色  
  171.     |-----权限管理系统-当前管理员角色列表  
  172.       
  173. 25、显示最后一条查询的sql语句:主要用于在连贯操作时,检测拼接的sql语句是否正确   
  174.       
  175.     echo $this->db->last_query();//如:select * from pt_users where uid>10 order by datetime desc limit 0,10   

 

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 26、CI_DB_pdo_driver PDO数据库驱动类  
  2.   
  3.     $this->db->affected_rows();//影响记录数,区分:$this->db->get("order_master")->num_rows();//获取到的结果集行数  
  4.   
  5.     $this->db->count_all("order_master");//对于某个表不带条件的查询  
  6.   
  7.     $this->db->count_all_results();//快捷操作类方法,适用于带条件的查询  
  8.   
  9.     $this->db->insert_id();//新插入记录的id  
  10.   
  11.     $this->db->trans_enabled = true;//开启事务(默认是false,所以在使用事务前必须将其赋值为true)  
  12.   
  13.     $this->db->trans_begin();//开始事务  
  14.   
  15.     $this->db->trans_rollback();//事务回滚  
  16.   
  17.     $this->db->trans_commit();//提交事务  
  18.   
  19.     $this->db->trans_status();//事务状态 true 或 false         CI_DB_driver驱动类中的方法  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 27、CI_DB_mysql_driver  mysql数据库驱动类  
  2.   
  3.     $this->db->affected_rows();//影响记录数,区分:$this->db->get("order_master")->num_rows();//获取到的结果集行数  
  4.   
  5.     $this->db->count_all("order_master");//对于某个表不带条件的查询  
  6.   
  7.     $this->db->count_all_results();//快捷操作类方法,适用于带条件的查询  
  8.   
  9.     $this->db->insert_id();//新插入记录的id  
  10.   
  11.     $this->db->trans_enabled = true;//开启事务(默认是false,所以在使用事务前必须将其赋值为true)  
  12.   
  13.     $this->db->trans_begin();//开始事务  
  14.   
  15.     $this->db->trans_rollback();//事务回滚  
  16.   
  17.     $this->db->trans_commit();//提交事务  
  18.   
  19.     $this->db->trans_status();//事务状态 true 或 false         CI_DB_driver驱动类中的方法  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 28、CI_DB_mysqli_driver  mysqli数据库驱动类  
  2.   
  3.     $this->db->affected_rows();//影响记录数,区分:$this->db->get("order_master")->num_rows();//获取到的结果集行数  
  4.   
  5.     $this->db->count_all("order_master");//对于某个表不带条件的查询  
  6.   
  7.     $this->db->count_all_results();//快捷操作类方法,适用于带条件的查询  
  8.   
  9.     $this->db->insert_id();//新插入记录的id  
  10.   
  11.     $this->db->trans_enabled = true;//开启事务(默认是false,所以在使用事务前必须将其赋值为true)  
  12.   
  13.     $this->db->trans_begin();//开始事务  
  14.   
  15.     $this->db->trans_rollback();//事务回滚  
  16.   
  17.     $this->db->trans_commit();//提交事务  
  18.   
  19.     $this->db->trans_status();//事务状态 true 或 false         CI_DB_driver驱动类中的方法  

 

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 29、model模型类中引用其它model模型类(如:category_model)和数据库(如:product)  
  2.   
  3.     public function __construct() {  
  4.         parent::__construct();  
  5.         $this->product_db = $this->load->database('product', true);//通过model基类中的__get()方法选择性的引入CI超级对象中已加载类库,如:"load"  
  6.         $this->load->model('category_model');  
  7.     }  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 30、控制器中引用其它模型类(如:category_model)和数据库(如:product)  
  2.   
  3.     public function __construct() {  
  4.         parent::__construct();  
  5.         $this->product_db = $this->load->database('product', true);  
  6.         $this->load->model('category_model');  
  7.     }  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 31、helper函数中引用CI超级对象的方法  
  2.   
  3.     function get_order_status_by_order($order_status){  
  4.   
  5.         $CI =& get_instance();//获取CI超级对象  
  6.   
  7.         $CI->load->Model('order_model');//通过CI超级对象可以载入任何模型  
  8.   
  9.     }  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 32、缓存驱动的加载方式  
  2.   
  3.     $this->load->driver('cache', array('adapter' => 'memcached'));//加载缓存驱动或缓存适配器,当前为memcached缓存;注意:CI框架只支持memcached,不支持memcache,windows操作系统下只有memcache扩展  
  4.   
  5.     $this->load->driver('cache', array('adapter' => 'file'));//加载缓存驱动或缓存适配器,当前为file缓存  
  6.   
  7.     $this->load->driver('cache', array('adapter' => 'redis'));//加载缓存驱动或缓存适配器,当前为redis缓存  
  8.   
  9.     $this->load->driver('cache', array('adapter' => 'apc', 'backup' => 'file'));//优先选择apc缓存,file文件缓存作为替代方案;如果服务器不支持apc缓存时,选择file文件缓存  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 33、静态html模板文件中如何动态加载区域块内容  
  2.   
  3.     //index.html文件  
  4.     <div include="/index.php/pub/common_nav" rel="include"></div>  
  5.   
  6.     //jquery代码  
  7.     $(document).ready(function () {  
  8.         $('[rel=\'include\']').each(function (e) {  
  9.         var t = $(this),  
  10.         url = t.attr('include') + location.search;  
  11.         url && $.get(url, function (data) {//url:'/index.php/pub/common_nav'  
  12.             t.html(data);  
  13.         })  
  14.         })  
  15.     })  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 34、拼接insert sql语句  
  2.     /** 
  3.      *一维关联数组,拼接sql语句 
  4.      *$data['username']="admin"; 
  5.      *$data['password']="12345"; 
  6.      *$data['sex']=""; 
  7.      */  
  8.     function add_user( $data ) {  
  9.             if ( empty($data) || !is_array($data) ) {  
  10.                 return false;  
  11.             }  
  12.             foreach ($data as $key => $value) {  
  13.                 if ( $value === '') {  
  14.                     unset($data[$key]);//删除数组中值为空的元素  
  15.                 }  
  16.             }  
  17.             $cols = array_keys($data);//获取数组所有的键名  
  18.             $values = array_values($data);//获取数组所有的值  
  19.             $cols_str = implode(",", $cols);//将数组所有的键名拼接成一个字符串  
  20.             $values_str = "'".implode("','", $values)."'";//将数组所有的键值放到单引号中  
  21.             //拼接sql:INSERT INTO user (username,password) VALUES ('admin','12345');  
  22.             $sql = "INSERT INTO user ({$cols_str}) VALUES ({$values_str})";//拼接sql  
  23.             $this->db->query($sql);  
  24.     }  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 35、拼接insert sql语句  
  2.     /** 
  3.      *一维关联数组,拼接sql语句 
  4.      *$data['username']="admin"; 
  5.      *$data['password']="12345"; 
  6.      *$data['sex']=""; 
  7.      */  
  8.     function add_user( $data ) {  
  9.             if ( empty($data) || !is_array($data) ) {  
  10.                 return false;  
  11.             }  
  12.             foreach ($data as $key => $value) {  
  13.                 if ( $value === '') {  
  14.                     unset($data[$key]);//删除数组中值为空的元素  
  15.                 }  
  16.             }  
  17.             $cols = array_keys($data);//获取数组所有的键名  
  18.             $values = array_values($data);//获取数组所有的值  
  19.             foreach($values as $k=>$val){  
  20.                 $values[$k]="'".$val."'";//将所有的键值放到单引号中  
  21.             }  
  22.             $cols_str = implode(",", $cols);//将数组所有的键名拼接成一个字符串  
  23.             $values_str = implode(",", $values);//将数组所有的键值拼接成一个字符串  
  24.             //拼接sql:INSERT INTO user (username,password) VALUES ('admin','12345');  
  25.             $sql = "INSERT INTO user ({$cols_str}) VALUES ({$values_str})";//拼接sql  
  26.             $this->db->query($sql);  
  27.     }  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 36、拼接update sql语句  
  2.     /** 
  3.      * 编辑用户信息 
  4.      * $userid=1; 
  5.      * $data['username']='admin'; 
  6.      * $data['password']='123'; 
  7.      */  
  8.     function edit_user(userid, $data) {  
  9.         if ( empty($data) || !is_array($data) ) {  
  10.             return;  
  11.         }  
  12.         foreach ($data as $key => $value) {  
  13.             $str .= isset($str)?", {$key} = '{$value}'":"{$key} = '{$value}'";  
  14.         }  
  15.         //拼接sql:UPDATE user SET username='admin',password='123' WHERE addr_id = '1';  
  16.         $sql = "UPDATE user SET {$str} WHERE addr_id = '{$addr_id}'";  
  17.         $this->db->query($sql);  
  18.     }  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 37、数据库快捷操作类常用方法  
  2.     /** 
  3.      * 查询订单 
  4.      * 
  5.      * @param $query 
  6.     */  
  7.     public function get_order_list($query, $offset = 0, $limit = 20) {  
  8.         if (is_array($query) && !empty($query)) {  
  9.             foreach ($query as $key => $val) {  
  10.                 if (is_array($val)) {  
  11.                     $this->order_db->where_in($key, $val);  
  12.                 } else {  
  13.                     $this->order_db->where($key, $val);  
  14.                 }  
  15.             }  
  16.         }  
  17.         $this->order_db->order_by('updatetime', 'desc');  
  18.         $this->order_db->order_by('id', 'desc');  
  19.         if (!$limit) {  
  20.             $query = $this->order_db->get('order');  
  21.         } else {  
  22.             $query = $this->order_db->get('order', $limit, $offset);  
  23.         }  
  24.           
  25.         if ($query->num_rows() > 0) {  
  26.   
  27.             return $query->result_array();  
  28.         }  
  29.   
  30.         return array();  
  31.     }  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 38、拼接select sql语句  
  2.     function get_user_list($cols=array("username","password")) {  
  3.         $col=implode(",",$cols);//查询的列属性  
  4.         $sql = "SELECT $col FROM user ORDER BY addr_id DESC";  
  5.         $this->db->query($sql)->result_array();  
  6.     }  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 39、CI框架中cookie的三种使用方式  
  2.   
  3.     //第一种设置cookie的方式:采用php原生态的方法设置的cookie的值  
  4.     setcookie("user_id",$user_info['user_id'],86500);  
  5.     setcookie("username",$user_info['username'],86500);  
  6.     setcookie("password",$user_info['password'],86500);  
  7.     //echo $_COOKIE['username'];  
  8.   
  9.     //第二种设置cookie的方式:通过CI框架的input类库设置cookie的值  
  10.     $this->input->set_cookie("username",$user_info['username'],60);  
  11.     $this->input->set_cookie("password",$user_info['password'],60);  
  12.     $this->input->set_cookie("user_id",$user_info['user_id'],60);  
  13.     //echo $this->input->cookie("password");//适用于控制器  
  14.     //echo $this->input->cookie("username");//适用于控制器  
  15.     //echo $_COOKIE['username'];//在模型类中可以通过这种方式获取cookie值  
  16.     //echo $_COOKIE['password'];//在模型类中可以通过这种方式获取cookie值  
  17.   
  18.     //第三种设置cookie的方式:通过CI框架的cookie_helper.php辅助函数库设置cookie的值  
  19.     set_cookie("username",$user_info['username'],60);  
  20.     set_cookie("password",$user_info['password'],60);  
  21.     set_cookie("user_id",$user_info['user_id'],60);  
  22.     //echo get_cookie("username");  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 40、array_merge()合并数组函数的使用  
  2.     <?php  
  3.     header("content-type:text/html;charset='utf-8'");  
  4.     $arr1=array(  
  5.           
  6.         "13012"=>array(  
  7.             "brand_id"=>2,  
  8.             "category_id"=>3  
  9.         )  
  10.   
  11.     );  
  12.   
  13.     $arr2=array(  
  14.           
  15.         "13012"=>array(  
  16.             "goods_id"=>3576,  
  17.             "goods_name"=>"sanyang"  
  18.         )  
  19.   
  20.     );  
  21.     /** 
  22.      *echo "<pre>";print_r(array_merge($arr1,$arr2)); 
  23.      *结果: 
  24.      *Array 
  25.      *  ( 
  26.      *      [0] => Array //索引重置为数字索引 
  27.      *          ( 
  28.      *              [brand_id] => 2 
  29.      *              [category_id] => 3 
  30.      *          ) 
  31.      *      [1] => Array 
  32.      *          ( 
  33.      *              [goods_id] => 3576 
  34.      *              [goods_name] => sanyang 
  35.      *          ) 
  36.      *  ) 
  37.      */  
  38.   
  39.      /** 
  40.      *echo "<pre>";print_r(array_merge($arr1['13012'],$arr2['13012'])); 
  41.      *结果: 
  42.      *  Array 
  43.      *  ( 
  44.      *      [brand_id] => 2 
  45.      *      [category_id] => 3 
  46.      *      [goods_id] => 3576 
  47.      *      [goods_name] => sanyang 
  48.      *  )    
  49.      */  
  50.   
  51.     ?>  

 

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 41.json格式数据:  
  2.        public function json(){  
  3.            $data[0]['goods_id']=3567;  
  4.            $data[0]['goods_name']="sanyang";  
  5.            $data[1]['goods_id']=3567;  
  6.            $data[1]['goods_name']="sanyang";  
  7.            echo json_encode($data);exit;  
  8.            /** 
  9.             * 结果: 
  10.             * [ 
  11.             *    { 
  12.             *        "goods_id": 3567, 
  13.             *        "goods_name": "sanyang" 
  14.             *    }, 
  15.             *    { 
  16.             *        "goods_id": 3567, 
  17.             *        "goods_name": "sanyang" 
  18.             *    } 
  19.             *] 
  20.             */  
  21.        }  

 

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 42.联合查询 left join  
  2. //controller控制器  
  3. $query = array(  
  4.         'product_id' => $product_id,  
  5.         'activity.status' => array(1, 2, 0),  
  6.         'activity.is_del' => 0  
  7. );  
  8. $query['activity.activity_id<>'] = $activity_id;  
  9.   
  10. $goods_list = $this->activity_model->get_activity_good_mapping($query, 0, 0);  
  11.   
  12. //model模型  
  13. public function get_activity_good_mapping($query,$offset = 0, $limit = 0,$get=''){  
  14.         $this->db = $this->activity_db;  
  15.         if (is_array($query) && !empty($query)) {  
  16.             foreach ($query as $key => $val) {  
  17.                 if (is_array($val)) {  
  18.                     $this->db->where_in($key, $val);  
  19.                 } else {  
  20.                     $this->db->where($key, $val);  
  21.                 }  
  22.             }  
  23.         }  
  24.           
  25.         $this->db->from('activity_goods');  
  26.         $this->db->join('activity', 'activity_goods.activity_id = activity.activity_id','left');  
  27.           
  28.         if (!$limit) {  
  29.               
  30.         } else {  
  31.             $query = $this->db->limit($limit, $offset);  
  32.         }  
  33.         $query = $this->db->get();  
  34.         if ($query->num_rows() > 0) {  
  35.               
  36.             return $query->result_array();  
  37.         }  
  38.   
  39.         return array();  
  40. }  
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 43.ci框架如何记录sql日志?  
  2.   
  3. (1)配置日志目录: 在"application/config/config.php" 文件中配置日志目录  
  4.    $config['log_path']="/opt/www/logs/";  
  5. (2)在 "system/database/DB_driver.php" 文件的query()方法末尾添加如下语句:  
  6.    log_message( 'db','【sql语句:'.$this->last_query().'】');//这样所有执行过的sql语句都会按日期时间格式记录到 "/opt/www/logs/" 目录下  
  7.    return $RES;  



 

二、部分截图如下:

 

 

 

 

三、数据库操作类之间的继承关系(区分数据库普通操作类和数据库快捷操作类),如图所示:

 

注意:CI_DB类是在DB()函数中动态定义的,没有单独的类库文件

         DB()函数在DB.php文件中定义

         DB.php文件中部分代码如下:

 

        

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. require_once(BASEPATH.'database/DB_driver.php');//类名:CI_DB_driver  
  2.   
  3. if ( ! isset($active_record) OR $active_record == TRUE)  
  4. {  
  5.     require_once(BASEPATH.'database/DB_active_rec.php');  
  6.   
  7.     if ( ! class_exists('CI_DB'))  
  8.     {  
  9.         eval('class CI_DB extends CI_DB_active_record { }');//继承关系  
  10.     }  
  11. }  
  12. else  
  13. {  
  14.     if ( ! class_exists('CI_DB'))  
  15.     {  
  16.         eval('class CI_DB extends CI_DB_driver { }');//继承关系  
  17.     }  
  18. }  
  19.   
  20. require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php');//类名:CI_DB_mysql_driver  
  21.   
  22. // Instantiate the DB adapter  
  23. $driver = 'CI_DB_'.$params['dbdriver'].'_driver';//类名:"CI_DB_mysql_driver"  
  24. $DB = new $driver($params);//创建一个数据库操作类句柄对象: $DB=new CI_DB_mysql_driver($paams); 继承关系:class CI_DB_mysql_driver extends CI_DB{}  
  25.   
  26. if ($DB->autoinit == TRUE)  
  27. {  
  28.     $DB->initialize();  
  29. }  
  30.   
  31. if (isset($params['stricton']) && $params['stricton'] == TRUE)  
  32. {  
  33.     $DB->query('SET SESSION sql_mode="STRICT_ALL_TABLES"');  
  34. }  
  35.   
  36. 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结果集对象)

 

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //CI_DB_driver 基类中的load_rdriver()方法在数据库普通操作基类中的query()方法中被调用,用来返回一个结果集对象  
  2.  function load_rdriver(){  
  3.     $driver = 'CI_DB_'.$this->dbdriver.'_result';  
  4.   
  5.     if ( ! class_exists($driver))  
  6.     {  
  7.         include_once(BASEPATH.'database/DB_result.php');//类名:CI_DB_result  
  8.         include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php');//类名:CI_DB_mysql_result  
  9.     }  
  10.   
  11.     return $driver;//继承关系:class CI_DB_mysql_result extends CI_DB_result  
  12. }  

           提示:也就是说,类似 $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 {

//代码

}

转载于:https://www.cnblogs.com/kenshinobiy/p/4779042.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《假如编程是魔法之零基础看得懂的Python入门教程 》——(一)既然你选择了这系列教程那么我就要让你听得懂

一、前言 几个月前编写了一份python语言入门的博文&#xff0c;近期重新审阅了一遍发现编写的质量太过随意&#xff0c;可能对于一部分人并不是非常友好&#xff0c;故此重新编写Python语言的零基础教程。 本篇教程将会尽量把一些专业术语给读者讲解清楚&#xff0c;并且让读…

环形队列

在网上看到一篇比较好的介绍队列的文章&#xff0c;地址为&#xff1a;http://www.cnblogs.com/kubixuesheng/p/4104802.html 特此感谢原创作者&#xff0c;以下均为摘抄。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1、…

Blazor University (19)使用 RenderFragments 模板化组件 —— 数据传递

原文链接&#xff1a;https://blazor-university.com/templating-components-with-renderfragements/passing-data-to-a-renderfragement/将数据传递给 RenderFragment源代码[1]到目前为止&#xff0c;我们使用了仅包含子标记的 RenderFragments&#xff0c;然后在渲染组件时按…

《零基础看得懂的C语言入门教程 》——(十二)原来结构体是这么回事

一、学习目标 了解C语言的结构体的使用方法了解C语言结构体的结构的赋值了解多种C语言结构体变量的赋值方法和取值方法 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误区 第…

mysql关系数据库引擎_MySQL数据库引擎详解

作为Java程序员&#xff0c;MySQL数据库大家平时应该都没少使用吧&#xff0c;对MySQL数据库的引擎应该也有所了解&#xff0c;这篇文章就让我详细的说说MySQL数据库的Innodb和MyIASM两种引擎以及其索引结构。也来巩固一下自己对这块知识的掌握。Innodb引擎Innodb引擎提供了对数…

Java之synchronized的JVM底层实现原理精简理解

1 synchronized的JVM底层原理实现的精简理解 Java 虚拟机中的synchronized基于进入和退出Monitor对象&#xff08;也称为管程或监视器锁&#xff09;实现&#xff0c; 无论是显式同步(synchronized作用在同步代码块&#xff0c;有明确的 monitorenter 和 monitorexit 指令) 还是…

三分钟掌握Actor和CSP模型

点击上方蓝字进行关注前文传送门&#xff1a;《三分钟掌握共享内存模型和 Actor模型》&#xff0c; 一直想比较Actor模型与golang的CSP模型&#xff0c;经过一段时间的实战记录了本文。Actor vs CSP模型• 传统多线程的的共享内存&#xff08;ShareMemory&#xff09;模型使用l…

DateTimeToUnix/UnixToDateTime 对接时间转换

问题&#xff0c;通过毫秒数来解析出时间&#xff1a;&#xff08;很多对接的时候经常需要用到&#xff09; <?php $MyJson {"jingdong_vas_subscribe_get_responce":{"code":"0","item_code":"FW_GOODS-2236-1","…

【学生选课系统经典】VB与SQLSERVER连接:Windows应用工程案例

实验任务描述 1 用VB6访问SQLSERVER数据库(两种安全模式); 2 用VB6完成数据库指定表上的数据显示; 3 用VB6完成数据库指定表上的数据插入、删除和更新; 4 用VB6完成SQLSERVER2008数据库用户验证。 一、数据库系统 该实验中,所要求的数据库名称为SCHOOL,总共涉及以下表:

《假如编程是魔法之零基础看得懂的Python入门教程 》——(二)魔法实习生第一步了解魔杖的使用

学习目标 了解什么是开发环境了解python语言的环境安装了解python语言编程的编辑器工具 目录 第一篇&#xff1a;《假如编程是魔法之零基础看得懂的Python入门教程 》——&#xff08;一&#xff09;既然你选择了这系列教程那么我就要让你听得懂 第三篇&#xff1a;《假如编…

mysql5.7 only_full_group_by_Mysql5.7及以上版本 ONLY_FULL_GROUP_BY报错的解决方法

近期在开发过程中&#xff0c;因为项目开发环境连接的mysql数据库是阿里云的数据库&#xff0c;而阿里云的数据库版本是5.6的。而测试环境的mysql是自己安装的5.7。因此在开发过程中有小伙伴不注意写了有关group by的sql语句。在开发环境中运行是正常的&#xff0c;而到了测试环…

一款高速的NET版的离线免费OCR

PaddleOCR.Onnx一款基于Paddle的OCR&#xff0c;项目使用ONNX模型&#xff0c;速度更快。本项目同时支持X64和X86的CPU上使用。本项目是一个基于PaddleOCR的C代码修改并封装的.NET的工具类库。包含文本识别、文本检测、基于文本检测结果的统计分析的表格识别功能&#xff0c;同…

spring 注解简单使用

一、通用注解 1、项目结构&#xff1a; 2、新建Person类&#xff0c;注解Component未指明id&#xff0c;则后期使用spring获取实例对象时使用默认id"person"方式获取或使用类方式获取 package hjp.spring.annotation.commen;import org.springframework.stereotype.C…

《假如编程是魔法之零基础看得懂的Python入门教程 》——(三)使用初始魔法跟编程魔法世界打个招呼吧

学习目标 完成显示魔法的使用——输出print完成传入魔法的使用——输入input使魔法生效——运行python文件 目录 第一篇&#xff1a;《假如编程是魔法之零基础看得懂的Python入门教程 》——&#xff08;一&#xff09;既然你选择了这系列教程那么我就要让你听得懂 第二篇&am…

查缺补漏系统学习 EF Core 6 (一)

推荐关注「码侠江湖」加星标&#xff0c;时刻不忘江湖事掌握 ORM 开发方式是每一个 .NET 开发者所必备的技能&#xff0c;而且 .NET 平台有很多优秀的 ORM 框架。很多人都会诟病 .NET 官方标配的 Entity Framework&#xff0c;感觉其笨重难用、性能低下。但其实经过多年发展&am…

【经典回放】JavaScript学习详细干货笔记之(一)

【经典回放】JavaScript学习详细干货笔记之&#xff08;一&#xff09; 【经典回放】JavaScript学习详细干货笔记之&#xff08;二&#xff09; 【经典回放】JavaScript学习详细干货笔记之&#xff08;三&#xff09; 目录 一、为什么要学JavaScript 二、JavaScript经典案例 …

TCP之三次握手和四次挥手过程

1 TCP包头里面的标志位 下图为TCP头部里面部分信息,入下标志位,每个标志位占一位。 标志位这里会涉及3个,ACK SYN FIN ACK:确认序号有效。 SYN:发起一个新连接。 FIN:释放一个连接。 2 三次握手过程 第一次握手 Client将标志位SYN置1,随机产生一个值seq=J,并将数…

gearman mysql编译_gearman初探(一、编译和安装)

gearman是一个任务分发系统&#xff0c;将计算比较耗时的任务分发给不同的机器专门进行计算&#xff0c;而任务发起的初始程序不必等待这些任务完成就可以返回而继 续执行。笔者最开始做PHP邮件发送的时候&#xff0c;因为邮件发送耗时比较长&#xff0c;这时PHP脚本就会被阻塞…

《假如编程是魔法之零基础看得懂的Python入门教程 》——(四)了解魔法百宝箱列表、字典及基本数据类型

学习目标 了解魔法世界中可更改容器——变量了解魔法世界的基本数值类型——字符串、整数了解魔法百宝箱——字典、列表了解列表如何添加值了解字典如何添加值了解字典与列表定义的不同符号 目录 第一篇&#xff1a;《假如编程是魔法之零基础看得懂的Python入门教程 》——&…

TCP协议之如何保证传输的可靠性

一、问题 TCP协议之如何保证传输的可靠性?我们先看下TCP的头部图片和TCP头部的字段 /*TCP头定义,共20个字节*/ typedef struct _TCP_HEADER {short m_sSourPort;       // 源端口号16bitshort m_sDestPort;       // 目的端口号16bitunsigned int …