
CI手册list
CI
-
- 基础构造
- url
- controller
- 视图
- 模型
- 辅助函数
- 类库
- 驱动器
- 核心系统类
- 钩子
- 公共函数和兼容性函数
- 更改url映射函数的方法
- 错误处理
- 网页缓存
- 程序分析
- 以命令行方式运行[手册](.html)
- 多程序,多环境
- 开发规范
- 类库(拿来即用的功能,减少很多重复性的工作[自取目录](.html))
- 数据库参考
- 数据库配置
- 数据库连接
- 查询
- 结果辅助方法
- 查询辅助函数
- 查询构造器类
-
- 事务
- 数据库元数据(表,字段)
-
目的
去繁就简罗列ci手册知识点,复杂处标出链接
基础构造
url
- 分段 ,域名/index.php/controllerName/functionName/para1/para2…;
- 移除index.php ,总的来说,移除有风险,操作需谨慎:
- 修改服务器配置AllowOverride为允许所有
- 启用mod_rewrite,在.htaccess文件添加相应的规则官网手册
- 需要注意的是对资源访问的影响和不同服务器的适用性
- 添加url后缀 ,在每个url后面添加一个后缀,只需要在config/config.php中$config[‘url_suffix’] = ''处设置;
- 查询字符串方式url,只需修改$config[‘enable_query_strings’] = FALSE;语句启用,使用其他key可以更改controller_trigger,function_trigger;
controller
- ci规定,规范,使用框架都讲究入乡随俗,ci对控制器的规范如下:
- 控制器文件默认放在application/controllers下
- 文件名首字母大写
- 文件类名首字母大写
- 函数默认url中函数名后面的为参数
- 重映射,_remap()方法将url第二段参数截获为自己的参数,你可以在这里作出自己需要的处理,被截获的方法名将以参数的形式传入remap函数,后面的全部参数以数组形式作为remap的第二个参数
// url:.../TestController/test/name/password
public function _remap($method,$para = array())
{
// 这时的$method === 'test',$para = array('name','password')
// 可以使用$this->$method()来调用当前传入的方法名对应的方法
}
- 处理类中输出
- 看这条时首先要知道ci函数的输出机制,总的来说,是一个对于框架使用者透明的一个类,无需干涉,当加载视图的时候,会自动传入到输出类,并在最后自动被调用
- 可以通过向控制器中添加_output()方法来处理当前类中的返回数据,最终输出的数据以参数形式传入_output()方法,详细可参见处理输出
public function _output($output)
{
// 这时的$output是你访问的函数的输出值
}
- 私有方法
1. 方法名声明时为private或protected
2. 方法名前加下划线,例如 _test() - 将控制器放到子目录中
1. 只需在application/controller/下创建新目录就可以完成项目不同功能的扩展,这时controller/下的控制器使用同一套配置
2. 也可以在application下创建多个包含原有application目录下所有文件的文件夹来管理不使用同一套配置的应用
3. 访问的时候url参数顺序不变,只需多加上一层文件名即可 - 构造函数
- 在控制器理使用构造函数必须要调用父类的构造函数,因为控制器是需要继承框架的控制器文件的,而子函数使用会覆盖掉父类方法,因此需要手动调用之后再添加自己的构造函数代码
- 注意函数保留名称CI保留名称
视图
- 加载视图
- $this->load->view(‘viewname’) //可省略文件后缀名,若含有文件结构则为“文件地址/viewname”;
- 加载多个时重复上面语句,视图会被合并到一起
- 传递数据时只需在view函数添加第二个参数,数据可以为字符串、数组、对象(会被转换成数组)等
- 输出数据到视图
- 可使用普通方法<?php echo $a>,也可以使用替代语法
- 循环输出时除最后一句php后用分号外其他语句末尾使用冒号
- 需要有结束符,如endforeach,endfor等
<?php if ($username === 'sally'): ?><h3>Hi Sally</h3>
<?php elseif ($username === 'joe'): ?><h3>Hi Joe</h3>
<?php else: ?><h3>Hi unknown user</h3>
<?php endif; ?>
- 此方式为框架中用在视图文件的替代语法,此外还有echo替代:<?php echo $variable; ?>用<?=$variable?>代替
- 需要注意此方法在php设置文件中禁用短标记的时候无法生效,但是可以在config文件中开启,否则会报eval()错误
- 将视图作为数据返回,不显示到页面
- 设置$this->load->view()第三个参数为true(默认为false),则视图会被转换成数据,此句的返回值需要另外赋到变量中再显示
模型
可用可不用
- 模型可以理解为将你在控制器里关于数据库的操作拿出来,需要使用的时候加载再调用,方便重复使用
- 可以使用输入类直接获取提交过来的数据($this->input->post(‘name’)),然后进行处理操作
- 模型文件夹可嵌套,都继承基础model类CI_Model,模型名首字母大写,其余小写,加载时直接使用(this->load->model(‘路径/文件名’[,‘别名’]),不需带扩展名,使用时为$this->load->model(‘model_name/别名’)
- 加载的第三个参数代表是否连接数据库,默认为false
- 第三个参数也可以为数据库的配置数组,传入可更改数据库配置连接配置
- 除在构造函数和使用的方法中加载外,还可以在config/autoload.php中设置自动加载
辅助函数
- 辅助函数较于其他方面的处理更为独立,不使用面向对象的方式实现,也没有特定依赖,随拿随用,可以说是过程型函数,默认不会自动加载,可以用加载模型的方式同理使用不同方式加载它,加载多个时可使用数组。
- 框架提供了多种辅助函数,基本使用已足够,如果想添加一额外的函数可以选择扩展辅助函数,需注意文件名和添加重写函数
类库
- 类库的加载和模型、辅助函数类似,不需要加扩展名,加载时可大写可小写(linux敏感),存储于application/libraries/目录,文件名首字母大写,类名于文件名相同
- 加载时可以在第二个参数传入数据,类库中只有在构造函数才能接收
- 在类库【任何除视图、模型、控制器】中可以使用& get_instance()来获取原始的ci框架对象,从而来调用其他资源,可以使用将原始对象放在类中,方便类中函数都能使用
class Example_library {protected $CI;public function __construct(){$this->CI =& get_instance();}public function foo(){$this->CI->load->helper('url');redirect();}public function bar(){echo $this->CI->config->item('base_url');}
}
- 可使用创建相同类名的类库文件来覆盖原生类库,类库文件和类定义需要于原生一致,例如使用类CI_Email来覆盖原生类库,调用时不变
- 扩展原生类库扩展原生辅助函数相似手册
驱动器
- 引入和使用与其他模块类似,驱动器文件存在system/libraries下,自己创建的存在application/libraries下
- 父类驱动器可直接调用,子类通过父类调用,无需初始化
核心系统类
一般来说,核心系统类没有很大必要去改,整个框架都依赖于核心系统类,修改都话和你另选框架去熟悉并开发所付出的代价相差无几查看手册
钩子
- 相当于一个可以插入到从请求到处理各个阶段到中间层,来统一处理某些信息,在config中开启
$config['enable_hooks'] = TRUE
,在config/hooks.php中定义在某些阶段需要执行的函数 - 可以在pre_system,pre_controller,post_controller_constructor,post_controller,display_override,cache_override,post_system这几种情况下使用,示例如下,详细介绍
$hook['pre_controller'] = array('class' => 'MyClass','function' => 'Myfunction','filename' => 'Myclass.php','filepath' => 'hooks','params' => array('beer', 'wine', 'snacks')
);
公共函数和兼容性函数
全局性函数,特殊情况使用公共函数
兼容性函数
更改url映射函数的方法
在config/router.php中设置自己的通配符,一般没有特殊需求可使用ci提供的路由映射方法手册
错误处理
- 入口文件中设置error_reporting()来修改错误设置,错误写入日志文件与是否开启显示错误无关
- 错误函数可全局调用,不受作用域等限制;在任意位置ci自动触发exit(),就相当于是执行到了出错的地方,并返回出错的原因,从出错的目录一层层往外
- 错误函数
- show_error($message, $status_code, $heading = ‘An Error Was Encountered’)
调用application/views/errors/html/error_general.php或application/views/errors/cli/error_general.php来显示错误 - show_404($page = ‘’, $log_error = TRUE)
调用application/views/errors/html/error_404.php显示404错误 - log_message($level, $message)
向日志文件中写入错误信息,level (string) – Log level: ‘error’, ‘debug’ or ‘info’;message (string) – Message to log,必须要设置 application/config/config.php 文件中的 “threshold” 参数来保证日志可写入,为0则禁用日志
网页缓存
- 在控制器任意输出view的函数返回的地方放置
$this->output->cache(seconds)
来开启页面缓存,“seconds为缓存的时间”,开启时缓存的application/cache中,需在cache配置文件中设置缓存目录可写 - 删除目标页面的缓存代码可以使缓存过期后不会刷新页面,缓存是否过期只与已经执行的缓存时间有关,与是否删除缓存代码无关,删除函数
$this->output->delete_cache('view')
程序分析
详细调试时可用,分析请求时间、对象、内存占用、数据库的操作等
手册
以命令行方式运行手册
多程序,多环境
配置入口文件和程序目录/环境相关常量即可手册
开发规范
很有必要看一看手册
类库(拿来即用的功能,减少很多重复性的工作自取目录)
列出全部类库名称,仅拿出部分本人常用的作笔记,其他点击上方链接自取
基准测试类,缓存驱动类,日历类 ,购物车类,配置类,email类,加密类(新版有升级),
文件上传类, 表单验证类,FTP类,图像处理类,输入类,javastript类,语言类,加载器类,
迁移类,输出类,分页类,模版解析类,安全类,session类,HTML类,引用通告类,排版类,
单元测试类, URL类,用户代理类,XML-RPC与XML-RPC服务器类,Zip编码类
数据库参考
数据库配置
- application/config/database.php中配置数据库数组即可
$db['default'] = array('dsn' => '','hostname' => 'localhost','username' => 'root','password' => '','database' => 'database_name','dbdriver' => 'mysqli','dbprefix' => '','pconnect' => TRUE,'db_debug' => TRUE,'cache_on' => FALSE,'cachedir' => '','char_set' => 'utf8','dbcollat' => 'utf8_general_ci','swap_pre' => '','encrypt' => FALSE,'compress' => FALSE,'stricton' => FALSE,'failover' => array()
);
- $active_group变量用于指定当前应用的配置数组,可设置多个配置数组以应对不同的开发环境
- 配置
$db['default']['failover']
(array)来配置(一个或多个)备用数据库,当‘default’故障时自动转移至 - $query_builder变量用来控制查询构造器是否使用,默认为开启(true)
- 配置参数解释参数
数据库连接
此处的数据库连接更多意义上可以说是实例化出来一个数据库连接的类,使用者在ci中是通过这个对象来进行一系列数据库操作的。
- 自动连接(在每加载一个页面时自动实例化)只需在config/autoload.php中加入自动加载database的libraries
$autoload['libraries'] = array('database');
- 手动连接,字面意思,在你的方法中加载仅供此方法使用,在构造方法中可在此文件中使用
$this->load->database();
database()中参数为空默认连接配置中的数据库,指定参数则连接配置中相同数组key值对应的配置;
第一个参数也可以是一个配置数组,形式与配置文件中一致,传入即使用新配置数组的配置;
也可使用数据源名称(DSN,Data Source Name)作为名称,格式需要遵守
$dsn = 'dbdriver://username:password@hostname/database';
$this->load->database($dsn);
- 连接多个数据库
为你连接的每个数据库的实例化赋值给不同的变量,通过不同变量来完成对某个数据库进行操作
$db1 = $this->load->database('db1');
$db2 = $this->load->database('db2');
//...
$db1->querr();
$db2->result();
切换同链接下数据库连接时,只需使用
$this->db->db_select('db_name');
就可完成切换
- 重新/保持连接
用于重量级操作时超过了数据库超时值,需确保下一步操作数据库连接的正确性
执行后续查询等操作前使用
$this->db->reconnect();
来保持数据库连接有效或重新建立起连接
- 手动关闭连接
$this->db->close();
查询
- 基础查询语句
$this->db->query('sql'[,para]);
para为sql语句中的参数,单个值或者数组形式
- 指定数据库前缀
当单个项目复杂度比较高,数据库使用复杂时,数据库前缀和表前缀是一个较好的标识出不同数据库的方法,避免因数据的相似性而混淆数据库与数据表
//将已配置的数据库前缀应用到表名
$this->db->dbprefix('tablename');
//不创建新数据库连接的情况下更改前缀
$this->db->set_dbprefix('newprefix');
$this->db->dbprefix('tablename');
- 保护标识符
数据库名与表名的保护工作 - 转义查询
向数据库中添加数据的时候需要对数据类型进行检测,保证数据写入的准确性
//转义字符串类型的数据
$this->db->escape();
//不检测数据类型进行转义
$this->db->escape_str();
- 查询绑定
//sql语句中需要传参数的地方可以用问号代替,query第二个参数可以是单个值,也可以是数组,但是数目必须与语句中代替位数相等,每个值 可以是单个值(匹配为单个值)或数组(转化为in语句)
$this->db->query($sql,array($a,$b,...))->row_array();
- 错误处理
//最近一次错误的数据库操作
$this->db->error();
- 查询结果
- result() 对象形式返回结果,查询失败或空返回空数组
- result_array() 数组形式返回结果,查询失败或空返回空数组
- row(n[,str]) 对象形式返回第一行结果,行号为n,结果类型为str[第二个参数不太了解使用情况,有了解的可以留言,感谢🙏]
- row_array([n]) 数组形式返回第一[n]行结果
以上四个方法会把结果加载到内存(预读取) - unbuffered_row()会单独返回一行,不会预读取到内存,如果加载多行,循环输出即可(通过内部实现的指针移动),参数可以为object(默认)或array来指定返回类型
$query = $this->db->query('sql');
while($row = $query->unbuffered_row('array')){echo $row;
}
- custom_result_array()以数组形式将所有查询出来的当前类的实例化对象返回,只有一个参数来指定实例化类的名称
- custom_row_array() 以单行形式返回查询结果,可以有两个参数,参数作用与row()相同
结果辅助方法
- num_rows() 返回查询结果的行数(查询对象调用)
- num_fields() 返回查询结果的字段(列)数(查询对象调用)
- free_result() 释放查询占用的内存并删除结果,降低内存消耗
- data_seek() 设置指向下一个结果行的内置指针,只有和unbuffered_row()一起使用有效,可选参数为下一行指针指向的行数,返回值为bool值【不是所有数据库驱动器都支持此特性,不支持时返回false】
查询辅助函数
- $this->db->insert_id(); 返回最近一次插入数据的行数(算上已删除的行,与自增列一致)
- $this->db->affected_rows(); 返回insert、update等类型的语句时影响的行数【关于删除语句,mysql执行的时候返回为0,此方法返回值为正确影响行数,可在数据库驱动文件关闭】
- $this->db->last_query(); 返回上一次查询的语句【database.php中设置save_queries = false会使此方法失效】
- $this->db->count_all(‘tablename’); 返回数据表总行数,第一个参数为表名
- $this->db->platform(); 返回正在使用的数据库平台
- $this->db->version(); 返回数据库版本
- $this->db->insert_string(); 返回正确格式化的insert语句,值被转义
- $this->db->update_string(); 返回正确格式化的update语句,值被转义
查询构造器类
- 构建select语句
- $this->db->get(‘tablename’[,limit_min,limit_max]); 后使用结果函数即可获得查询相应结果
- $this->db->get_complied_select(‘tablename’[,bool]); 返回查询语句,不执行,第二个参数代表是否会重置查询(默认true)
- KaTeX parse error: Unexpected character: '' at position 44: …法多了第二个用来表示where̲约束的参数(形如array('…id,‘name’=>$name…)),不支持查询多个列值,返回值为实例化的查询对象,返回值调用结果查询语句即可
- $this->db->select(); 第一个参数用于查询某几列时指定列名,第二个参数可选默认true,false指不保护表名和字段名
$this->db->select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid', FALSE);
$query = $this->db->get('mytable');
- 数据库操作函数 t h i s − > d b − > s e l e c t m a x ( ) ; this->db->select_max(); this−>db−>selectmax();this->db->select_min(); t h i s − > d b − > s e l e c t a v g ( ) ; this->db->select_avg(); this−>db−>selectavg();this->db->select_sum();
- $this->db->from(); 构建from语句,可以在get()中指定
- $this->db->join(‘comments’, ‘comments.id = blogs.id’); 构建join子句,第一个参数是表名,第二个为关联条件,第三个参数为连接类型,left,right,outer,inner,left outer,right outer
- $this->db->where() 参数较为灵活,可以为key(可带比较符)/value形式的两个参数,也可为数组(key可带比较符),或者为自定义字符串(相当于sql语句的条件表达式部分)
- $this->db->or_where() 用or来连接的条件表达式
- $this->db->where_in(‘colname’,[…]) and连接的in子句
- $this->db->or_where_in(‘colname’,[…])
- $this->db->or_where_not_in(‘colname’,[…])
- $this->db->like(‘colname’,‘match’) 第三个参数控制通配符位置(before,after,both(默认)),或者直接以数组形式传入参数
- $this->db->or_like() 用法同上
- $this->db->not_like()
- $this->db->or_not_like()
- $this->db->group_by(string/array) 可为单个列或以数组传入
- $this->db->distinct()
- $this->db->having(string/key-value/array),自动转义,若不转义则第三个参数为false
- $this->db->or_having(string/key-value/array)
- $this->db->order_by(string/key-value),排序方式可以是desc/asc/random(此时指定的列名会无效,可传入数值作为随机数的seed)
- $this->db->limit(num,offset)
- $this->db->count_all_results()
- $this->db->count_all(tablename)
查询条件组
构建复杂查询语句
- $this->db->group_start()可以理解为在where语句左侧加一个左括号
- $this->db->or_group_start()加一个or和左括号
- $this->db->not_group_start()加一个not和左括号
- $this->db->or_not_group_start()加一个or not和左括号
- $this->db->group_end()加一个右括号【每一个start都要有一个end与之对应】
插入数据
- $this->db->insert(‘tablename’,array/object)【数据会被转义】
- $this->db->get_compiled_insert(‘tablename’,bool) 生成insert语句,并不执行,第二个参数设置是否重置查询,默认true,不支持批量插入
- $this->db->insert_batch(‘tablename’,array/object); 第二个参数为二维数组,相当于批量插入
- $this->db->replace(‘tablename’,array) 相当于delete+insert的结合
- $this->db->set(key-value/array) 用于设置更新或新增的数据,第三个参数可选,用于设置是否自动转义,默认为true
- $this->db->update(‘tablename’,object/array)
- $this->db->update_batch(‘tablename’,data1,data2) data1是一个二维数组,data2是条件语句
- $this->db->get_compiled_update() 生成update语句不执行
- $this->db->delete(‘tablename’[,array]) 第二个参数为条件约束,也可以不用,用where等代替了;删除多个表中数据时第一个参数为数组
- $this->db->empty_table(‘tablename’) 清空数据表
- $this->db->truncate(‘tablename’)
- $this->db->get_compiled_delete() 生成删除语句不执行
查询构造器缓存
- $this->db->start_cache()
- $this->db->stop_cache()
- $this->db->flush_cache()
重置查询构造器
- $this->db->reset_query(),缓存不会被重置
事务
- 默认事务是严格模式(查询组有一个出错即回滚至之前状态)执行,可用
$this->db->trans_strict(false)
来禁用(组内各条互不干扰) - ci运用事务进行查询 ,只需在自己的查询前后分别加上
$this->db->trans_start()
和$this->db->trans_complete()
即可 - 禁用事务
$this-&ans_off()
后,使用start,complete等会被自动忽略 - 手工运行事务(控制事务运行中状态的应对)
//示例
$this->db->trans_begin(); //不使用start
$this->db->query();
$this->db->query();
//...
if($this->db->trans_status() === false){$this->db->trans_rollback();
}else{$this->db->trans_commit();
}
数据库元数据(表,字段)
表元数据
- 列出数据库所有表
$this->db->list_tables();
- 检测表是否存在
$this->db->table_exists('tablename');
字段元数据
- 列出表所有列
$this->db->list_fields('tablename');
- 或在任意查询对象上调用此方法
$query = $this->db->query('SELECT * FROM some_table');
foreach ($query->list_fields() as $field)
{echo $field;
}
- 检测表中是否存在某字段
$this->db->field_exists(‘fieldname’);
- 获取字段元数据
$this->db->field_data();
[并非所有数据库都支持],返回数组