首页 > 代码库 > ci框架操作数据库基本方法
ci框架操作数据库基本方法
授课过程中如果涉及到文件夹或目录时,可使用缩进进行演示:
application
|-----libraries
|-----xxx_helper.php
system
|-----libraries
|-----url_helper.php
-----------------------------------------------------------------------------------------------------------------------------------------------------
一、什么是框架?
二、框架的优缺点分析及为什么要选择框架
三、主流MVC框架介绍:
1、thinkphp
2、zendframework
3、ci
4、yii
四、CI框架特性介绍:
1、轻量级:核心系统的类库非常小
2、采用了最流行的MVC架构模式
3、生成干净的对搜索引擎友好化的url
http://www.kuxiu.net/index.php/common/login/
4、功能非常强大:
拥有全范围的类库,可完成一个项目的大多数通用功能,包括: 读取数据库、发送电子邮件、数据确认、保存 session 、对图片的操作,以及支持 XML-RPC 数据传输等
5、不需要模板引擎:
虽然CI框架自带了一个可选的模板解析器程序,但不要求你必须使用模板;
虽然模板引擎的代码比较清晰,但这会带来一个性能问题,因为伪代码要先被转换成PHP才能运行。我们的目标是性能最大化, 所以我们选择不使用专用的模板引擎。
当然,我们也可以使用ci框架自带的模板引擎,也可以整合第三方的模板引擎到ci框架中:smarty模板引擎
6、中文化的文档全面:
虽然是一款国外的框架,但是中文化的文档也是非常全面,便于我们查阅
五、MVC模式:
视图、
模型:
控制器
六、CI框架执行流程深入分析:
第一步:入口文件:
//加载引导文件,http://www.kuxiu.net/system/core/CodeIgniter.php文件
require_once BASEPATH.‘core/CodeIgniter.php‘;
第二步:require_once BASEPATH.‘core/CodeIgniter.php‘;中
//加载公共的函数库
require(BASEPATH.‘core/Common.php‘);
require(APPPATH.‘config/constants.php‘);//常量文件
/*
配置类,加载配置文件时使用,如:
$this->config->load();
$this->config->item();
$this->config->set_item();
*/
$CFG =& load_class(‘Config‘, ‘core‘);
$URI =& load_class(‘URI‘, ‘core‘);
$RTR =& load_class(‘Router‘, ‘core‘);
$OUT =& load_class(‘Output‘, ‘core‘);
$SEC =& load_class(‘Security‘, ‘core‘);
$IN =& load_class(‘Input‘, ‘core‘);
require BASEPATH.‘core/Controller.php‘;//系统基类控制器文件
return CI_Controller::get_instance();
//在扩展系统基控制器时使用:MY_Controller.php
if (file_exists(APPPATH.‘core/‘.$CFG->config[‘subclass_prefix‘].‘Controller.php‘)){
require APPPATH.‘core/‘.$CFG->config[‘subclass_prefix‘].‘Controller.php‘;//如:MY_Controller.php
}
$class = $RTR->fetch_class();//当前请求的控制器,如:common
$method = $RTR->fetch_method();//当前请求的控制器中的方法,如:index
$CI = new $class();//实例化当前请求的控制器类对象
关于hook的资料:就是在系统引导流程中插入自己的代码,而不用修改核心代码
貌似可以在 控制器之前(或者其他时候) 执行自己的代码,执行某个对象的方法或者某个函数。我现在把需要在所有控制器中都执行的代码移到hook中了。应该就是这么用的吧?
虽然很神,但是实际上运用hook的情况不多(因为ci已经解决了大部分你可能会遇到的问题)。当使用扩展无法达到目的时,才会考虑钩子。
hook在你执行controller之前执行,举一个例子吧,有一次,项目要上线,但是服务器时间怎么调也不正确。(因为要存订单时间),没办法,一时调不好服务器,就写了一个钩子设置时区。(只是作为临时方案)
1、index.php 作为前端控制器,初始化运行 CodeIgniter 所需要的基本资源。
2、Router 检查 HTTP 请求,以确定谁来处理请求。
3、如果缓存(Cache)文件存在,它将绕过通常的系统执行顺序,被直接发送给浏览器。
4、安全(Security)。应用程序控制器(Application Controller)装载之前,HTTP 请求和任何用户提交的数据将被过滤。
5、控制器(Controller)装载模型、核心库、辅助函数,以及任何处理特定请求所需的其它资源。
6、最终视图(View)渲染发送到 Web 浏览器中的内容。如果开启缓存(Caching),视图首先被缓存,所以将可用于以后的请求。
七、URL调度模式:
1、如何修改默认执行的控制器和方法:
application/config/routes.php中配置如下项:
$route[‘default_controller‘] = "common";//默认执行的控制器
八、model详解:
1、模型类的命名规范:主需要首字母大写即可,建议采用 User_model 形式
2、引用模型的两种方式:
$this->load->model("user_model");//引用user_model模型
$this->load->model("User_model");//应用user_model模型,这两种方式是等价的
九、实例化模型的执行流程:
$this->load->model("user_model");//引用user_model模型
十、CI框架中session与cookie类库的使用:cookie登陆、session登陆
十一、CI框架中文件处理类库及图像处理类库的使用:文件上传、缩略图、水印功能
十二、CI框架与smarty模板引擎的无缝整合:在项目中的应用
提示:虽然模板引擎的代码比较清晰,但这会带来一个性能问题,因为伪代码要先被转换成PHP才能运行。我们的目标是性能最大化, 所以我们选择不使用专用的模板引擎
十三、CI框架与UEditor编辑器的无缝整合:在项目中的应用(路径问题)
十四、CI框架与报表类库的无缝整合:在项目中的应用(报表的导入导出)
十五、导入机制和配置文件加载流程介绍
十六、配置文件:
1、主配置文件:application/config/config.php,已自动加载,无需手动启用
分析:配置项目被存储在一个叫$config[]的数组里面,你可以添加自己的配置项目到这个文件中
2、加载单个自定义的配置文件:
$this->config->load("thumb_settings");//配置文件的文件名,不带.php扩展名
3、加载多个自定义配置文件:
如果需要加载多个自定义配置文件,一般情况下他们会被合并为一个数组;如果在不同的配置文件中存在同名的索引,那么将会发生冲突;为了避免这个问题,你可以将第二个参数设置为true、这样可以使每个配置文件中的内容存储在一个单独的数组中,数组的索引就是配置文件的名称
$this->config->load("thumb_settings",true);
//相当于如下方式:
$this->config[‘thumb_settings‘] = $thumb_settings;
//参数3用来屏蔽当配置文件不存在时产生的错误信息
$this->config->load("thumb_settings",false,true);
4、如何获取配置文件中的配置项:
//加载配置文件:
$this->config->load("thumb_settings");//缩略图相关的配置文件
//当视图获取的配置项不存在时,将返回false
$this->config->item("config_thumb");//缩略图的相关配置项
5、如何动态设置一个配置项:
//动态设置生成的缩略图的名字
$this->config->set_item("new_image",time.().$this->file_ext);
6、思考一个问题:配置项是否可以为数组呢?
7、配置类辅助函数:
$this->config->site_url();//网站URL
如何将url路径中的index.php屏蔽?
$config[‘index_page‘] = ‘index.php‘;//如:http://www.kuxiu.net/index.php/
$config[‘index_page‘] = ‘‘;//如:http://www.kuxiu.net/
$this->config->base_url();//返回站点的根目录
提示:在生成images、css、js等的url时非常实用
$this->config->system_url();//该函数用来得到system文件夹的url
十七、分页类的使用:
//加载分类类库
$this->load->pagination("pagination");
十八、数据库的增删改查:
普通查询:
1、$this->db->database();//加载数据库实例化对象
2、$query=$this->db->query($sql);//执行查询,返回结果集;注意:query是普通数据库操作类中的方法,快捷操作类继承自普通数据库操作类,所以快捷操作类中也有query方法,query方法返回一个结果集对象
3、$object_array=$query->result();//返回一个对象数组;result是结果集类中的方法
foreach($object_array as $object){
echo $object->name;
}
4、$data_array=$query->result_array();//返回一个二维关联数组;result_array()是结果集类中的方法,主要用来将结果集转换为二维关联数组
foreach($data_array as $row){
echo $row[‘name‘];
}
5、$object=$query->row();//返回一个对象;
6、$row=$query->row_array();//返回一维数组
7、$query->num_rows();//返回查询到的记录数
8、$this->db->affected_rows(); //返回受影响的记录数
9、$this->db->insert_id();//返回最新插入记录的id
快捷查询:
插入数据:
$this->db->insert("user",$data);
分析:参数1:表名,不带前缀,因为在配置文件中设置过数据表的前缀了
参数2:包含数据的关联数组
缺点:$data关联数组中的键名要与user表中字段名一一对应,缺一不可
注意:$this->db->insert_batch();
更新数据:
$this->db->update("user",$data,条件);
分析:参数1:表名,同上
参数2:包含数据的关联数组
参数3:更新条件,有两种形式:
数组形式:array("id"=>4)
键值对形式:"id=4"
删除数据:
$this->db->delete("user",条件);//条件同上
查询数据:
$query=$this->db->get();//返回结果集
//参数2:每页记录数 参数3:开始位置;
$query=$this->db->get("user",$pagesize,$limit);
$data_array=$query->result_array();//将结果集转化为数组
$this->db->get_where("user",$where,$limit,$pagesize);//查询结果集,条件同上
//在执行查询之前,我们可以随意设置查询的字段及条件
$this->db->select("username,realname,password");//字段间以逗号相隔
$this->db->select_max("id");//查询最大id
$this->db->select_min("id");//查询最小id
$this->db->select_avg("score");//平均值
$this->db->select_sum("score");//总值
//主要用来设置表名,如果使用了此函数,在$this->db->get();函数中就无需表名了
$this->db->from("user");
$this->db->where();//传递给本函数的所有值都会被自动转义,以便生成安全的查询
条件形式:
简单的键值对:
$this->db->where(‘name‘, $name);
自定义键值对:
$this->db->where(‘name !=‘, $name);
$this->db->where(‘id <‘, $id);
关联数组:
$where=array("username"=>$username,"password"=>$password)
字符串格式:
$where = "name=‘Joe‘ AND status=‘boss‘ OR status=‘active‘";
$this->db->where($where);
注意:条件中可以包含运算符
$this->db->or_where();
$this->db->where_in();
$this->db->or_where_in();
$this->db->where_not_in();
$this->db->or_where_not_in();
$this->db->group_by();
$this->db->distinct();
$this->db->having();
$this->db->order_by();
$this->db->limit(10);
$this->db->count_all_results("user");
分析:此函数允许你获得某个特定的Active Record查询所返回的结果数量。可以使用Active Record限制函数,例如 where(), or_where(), like(), or_like() 等等。范例:
$this->db->set();//它可以用来代替那种直接传递数组给插入和更新函数的方式
案例:
$this->db->set(‘name‘, $name);
$this->db->insert(‘mytable‘); //生成: INSERT INTO mytable (name) VALUES (‘{$name}‘)
$this->db->empty_table();
$this->db->truncate();
链式查询:链式方法允许你以连接多个函数的方式简化你的语法
$this->db->select(‘title‘)->from(‘mytable‘)->where(‘id‘, $id)->limit(10, 20);
$query = $this->db->get();
十九、辅助函数的加载:
//单个辅助函数文件的加载
$this->load->helper("url");//辅助函数文件的名字
//多个辅助函数文件的加载
$this->load->helper(array(
"url",
"pagination",
"image_lib"
));
//一旦你载入了想要用到辅助函数文件,可以用标准的函数调用方法来使用里面的函数。
base_url();// $this->base_url()是错误的写法
1、如何扩展系统原有的helper函数库?
在application/helpers/ 文件夹下建立一个文件,命名为:MY_原系统函数库名.php
2、如何设置默认扩展文件名的前缀?
找到application/config/config.php配置文件
修改$config[‘subclass_prefix‘] = ‘MY_‘;即可
3、如何修改数据表的前缀?
找到application/config/database.php配置文件
修改$db[‘default‘][‘dbprefix‘] = ‘gt_‘;//数据表的前缀
二十、如何设置url路由及url后缀
$config[‘uri_protocol‘] = ‘AUTO‘;//路由形式,如:http://www.kuxiu.net/common/index/1/
$config[‘uri_protocol‘] = ‘PATH_INFO‘;//路由形式,如:http://www.kuxiu.net/common/index?x=a&y=b
$config[‘url_suffix‘] = ‘‘;//url后缀,如:http://www.kuxiu.net/common/index.html
二十一、总结:
1、关于缩略图的配置项目可以放在config.php文件中
2、$this->db->insert("user",$data);//要求数据表中除主键字段外,其它字段在$data关联数组中都有默认值才能执行成功,提示:$data一般为一维关联数组
$this->db->insert_batch("user",$data);//$data一般为二维关联数组
3、跳转:header("location:".site_url("common/login"));
4、设置时区
$config[‘time_zone‘]=date_default_timezone_set(‘Asia/shanghai‘);
5、推荐使用链式操作
$query=$this->db->query($sql);
$data_array=$query->result_array();
等价于:
$data_array=$this->db->query($sql)->result_array();
6、如何配置ueditor编辑器文件上传的路径,如:将图片上传到根目录下面的 php/upload/ 下
首先:将ueditor/php/ 文件夹复制粘贴到根目录下
然后:在模板文件中修改文件上传路径:
{literal}
var ue = new UE.ui.Editor({
initialFrameWidth:750,//编辑器初始化宽度
initialContent:‘‘,//编辑器初始化内容
imagePath:"/php/",//图片上传路径,默认情况下图片上传路径的upload文件夹与图片上传脚本同目录,所以这样配置生成如下效果:"/php/upload/"
imageUrl:"/php/imageUp.php"//图片上传脚本文件
}
);
ue.render(‘content‘)//给id为content的textarea表单控件渲染一个编辑器
{/literal}
思考:默认情况下,编辑器是按照日期自动创建存储的文件夹的,如何修改这一规律?
找到php/Upload.class.php文件中的getFolder()函数,修改如下:
/**
* 按照日期自动创建存储文件夹
* @return string
*/
private function getFolder(){
$pathStr = $this->config[ "savePath" ];//保存路径
if ( strrchr( $pathStr , "/" ) != "/" ) {//保存路径必须以"/"结尾
$pathStr .= "/";
}
$pathStr .= date( "Ymd" );//年月日
if ( !file_exists( $pathStr ) ) {//如果目录不存在
if ( !mkdir( $pathStr , 0777 , true ) ) {//层级创建目录
return false;//创建失败返回false
}
}
///return $pathStr;//创建成功返回路径
}
7、系统加载类库:core/Loader.php
如下函数都在此类库中定义
$this->load->model("");
$this->load->library("");
$this->load->database("");
$this->load->helper("");
$this->config->load();
1 |
///////////////////////////////////////////////////////////////////////////////////////////
1、在讲解文件所在目录方面的问题时:
application
|-----core
|-----MY_Controller.php
system
|-----core
|-----Controller.php
思路:
一、目前在企业中使用比较多的框架有如下几种:
1、zendframework框架:此框架由zend公司开发并负责维护,入门比较困难一点,但是据说功能很强悍,属于一款偏重量级的MVC框架
2、Yii框架:又称为 "易框架",在外企使用居多
3、thinkphp框架:是国人开发的一款框架,由于它的注释和使用文档都是中文,所以很受国人的喜欢
4、codeigniter框架:简称CI框架,是国外一款流行的框架,跟前面的框架比较,ci框架是最轻量级的,也是最容易上手的
二、我们选择这款框架来学习,主要有以下几点原因:
1、ci是一个轻量级的框架,关于轻量级,可从两方面来理解:
1、体积小,解压后不到4M,zendframework解压后60M左右
2、占用资源少:ci应用程序在运行的时候,只是将正常运行所必须的几个核心类库载入到了内存中,其它类库在请求的时候才会加载,这样就达到了资源的最小化,这跟那些需要很多资源的框架是不一样的,有些框架在运行的时候,会将所有的类库首先载入内存中,而不管这些类库是否能够用的到,如:cakephp
3、但是这个轻量级,并不影响它开发大型的web应用程序,为什么这么说呢?
首先,它自身所提供的类库,已经能够帮助我们完成web应用程序中的大部分功能
再者,ci框架在整合第三方类库方面也有独到的优势,几乎不需要进行任何配置
2、整合第三方类库简单,几乎不需要进行任何配置
3、不需要使用模板引擎技术
大家知道,php原生态的语法结构执行效率是最高的,因为跟使用了模板引擎技术的程序相比较,它少了一个编译的过程
本文出自 “云笔记” 博客,转载请与作者联系!
ci框架操作数据库基本方法