CodeIgniter(1.7.2)框架学习笔记

admin 发表于 [PHP] 分类,标签: CodeIgniter PHP开发框架 学习笔记
0

CodeIgniter URL:

example.com/class/function/ID
1、第一段表示调用控制器类。
2、第二段表示调用类中的函数或方法。 (如果你的类文件保存在子目录中,那么第二段包含了两个小段:子目录/类函数)
3、第三及更多的段表示的是传递给控制器的参数,如 ID 或其他各种变量。
(这里的第一、第二、第三段指的是网址中除域名和index.php之外由斜杠“/”分隔的段)
通过设置 application/config/config.php 文件$config['url_suffix']这个参数,你可以为 CodeIgniter 生成的 URL 添加一个指定的文件后缀。
比如:example.com/index.php/products/view/shoes
你可以随意添加一个后缀,例如 .html,使其显示为:
example.com/index.php/products/view/shoes.html
可以通过设置 application/config/config.php 文件$config['enable_query_strings']参数值为“true”来启用URL中的查询字符串(形 如:index.php?c=products&m=view&id=345),请注意:如果你使用查询字符串,那么就必须使用自己建立 的 URL ,而且不能使用URL 辅助函数(或是其他生成 URL 的辅助函数,例如表单辅助函数),因为这些都是根据分段 URL 设计的。

自定义URL路由规则:

1、路由规则文件位置:application/config/routes.php =》$route数组
2、路由规则(通配符规则和正则表达式规则):
一个典型的通配符路由看起来是这样的:
$route['product/:num'] = "catalog/product_lookup";//数组的键包含着被匹配的URI,而数组的值包含着路由将被重定向的目的地.
路由数组的键可以匹配文字的值或者使用以下两种通配符类型:
:num 将匹配一个只包含有数字的段.
:any 将匹配一个包含任何字符的段.
也可以使用正则表达式:例如:$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";
可以混合使用通配符与正则表达式.
3、需要被保留的路由:$route['default_controller'] 和 $route['scaffolding_trigger']

控制器类(Controller)

新建控制器:
1、控制器类文件保存位置:application/controllers/
2、控制器类文件的文件名:用控制器类名的全小写格式作文件名,以.php作扩展名
3、控制器类声明格式:㈠必须是Controller类的子类;㈡类名的首字母必须大写。
比如声明blog控制器类,其声明格式形如:
class Blog extends Controller {
function __construct(){
//如果要在你的任意控制器中使用构造函数的话,那么必须在里面加入下面这行代码:
parent::Controller();

}
4、控制类中方法的声明:函数名如果以下划线“_”开头,则此函数为私有方法(私有方法不能通过网址访问)。
将私有方法名设为_remap:
该方法会废除掉由 URI 片段来决定哪个方法被调用的规则,允许你重新定义调用方法的规则(方法的路由规则)。
将私有方法名设为_output:
该方法会接收其控制器类的所有输出数据(显示数据),以便由你控制处理和输出。这个方法类似于OO里的析构函数,不管你调用任何方法这个方法总是会被执行。

5、系统的保留类名:Controller CI_Base CI_Loader
6、系统的保留方法名:
_ci_initialize
_ci_scaffolding
index
//PHP4↓
config
database
dbutil
dbforge
file
helper
helpers
language
library
model
plugin
plugins
scaffolding
script
view
vars
_ci_assign_to_models
_ci_autoloader
_ci_init_class
_ci_init_scaffolding
_ci_is_instance
_ci_load
_ci_load_class
_ci_object_to_array

is_really_writable()
load_class()
get_config()
config_item()
show_error()
show_404()
log_message()
_exception_handler()
get_instance()

7、系统的保留变量:$config $mimes $lang
8、系统的保留常量:
EXT
FCPATH
SELF
BASEPATH
APPPATH
CI_VERSION
FILE_READ_MODE
FILE_WRITE_MODE
DIR_READ_MODE
DIR_WRITE_MODE
FOPEN_READ
FOPEN_READ_WRITE
FOPEN_WRITE_CREATE_DESTRUCTIVE
FOPEN_READ_WRITE_CREATE_DESTRUCTIVE
FOPEN_WRITE_CREATE
FOPEN_READ_WRITE_CREATE
FOPEN_WRITE_CREATE_STRICT
FOPEN_READ_WRITE_CREATE_STRICT

视图(view)

一个视图就是一个网页,或是网页的部分,如头部,底部,侧边栏等等。
视图从不直接调用,必须被一个控制器来调用。
1、视图文件保存位置:application/views/
2、视图文件的文件名:以.php作扩展名
3、在控制器类中载入视图:$this->load->view('name'); //其中的 name 便是你的视图文件的名字(如果视图文件存于子目录中,则还应包含子目录名,如:子目录1/试图文件名)。注意:.php 文件的扩展名(后缀名)没有必要专门写出,除非你使用了其他的扩展名。
4、向视图文件中传递数据:数据通过控制器以一个数组或是对象的形式传入视图 , 这个数组或对象作为视图载入函数的第二个参数(例如:$this->load->view('name',array('title'=& gt;'标题','content'=>'内容')); )。当我们一次性载入多个视图的时候,只需在第一个视图传入数据就可以了。
5、获取视图的内容:将$this->load->view()函数的第三个参数设为“true”,比如:
$string = $this->load->view('myfile', '', true);
view方法中的第三个参数表示不输出视图,而只是将结果返回给一个变量。

模型(Model)

模型类的声明方式同控制器类。不同的只是
1、模型类文件保存位置:application/models/
2、模型类的父类名为:Model
3、调用方式不同:㈠控制器类是通过URL调用;㈡模型类是通过在控制器类中使用:
$this->load->model('Model_name');
引用,引用的时候,第一个参数为模型类名(可能还含有子目录名);第二个参数为引用后赋予的新对象名;可以将第三个参数设置为TRUE(或包含数据库连接配置的数组)来使模型装载函数自动连接数据库。

辅助函数(helpers)

1、辅助函数文件保存位置:system/helpers 或 system/application/helpers
2、辅助函数文件名:yourname_helper.php(如果是你扩展的,就要加前缀“MY_”,或你自定义的前缀(application/config/config.php :$config['subclass_prefix'] = 'MY_';))
3、载入单个辅助函数文件:$this->load->helper('辅助函数文件名');//辅助函数文件名不包括“_helper.php”部分
4、载入多个辅助函数文件:$this->load->helper( array('辅助函数文件名1', '辅助函数文件名2', '辅助函数文件名3') );
5、自动载入辅助函数文件:可以通过打开 application/config/autoload.php ,并往自动载入数组(autoload array)中增加辅助函数文件名来实现。

插件

插件的工作方式几乎和辅助函数一模一样。它们最主要的区别在于插件文件一般只有一个函数,而辅助函数文件里面通常是一系列函数。辅助函数被看作系统核心的一部分,而插件通常是网友制作和分享的。
1、插件文件保存位置:system/plugins 或 system/application/plugins
2、插件文件的文件名:yourname_pi.php
3、载入单个插件:$this->load->plugin('插件名');//插件名不包括“_pi.php”部分
4、载入多个插件:$this->load->plugin( array('插件名1', '插件名2', '插件名3') );
5、自动载入插件:可以通过打开 application/config/autoload.php ,并往自动载入数组(autoload array)中增加插件来实现

类库

1、类库文件保存位置:system/libraries(系统类库)  或 system/application/libraries(自定义类库)
2、自定义类库命名约定:类名和类文件名应保持一致,它们的首字母必须大写(如是扩展系统类库的类,要加前缀“MY_”,前缀可设置 application/config/config.php:$config['subclass_prefix'],注意:所有原始 CodeIgniter类库以 CI_ 作为前缀,所以请勿以CI_作为你自己的前缀.)
3、类文件的格式
㈠完全自定义的类:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {//如果要覆盖核心类,可以参照核心类进行声明
function some_function()
{
}
}
?>
㈡扩展系统类库的类:
class MY_Email extends CI_Email {
function My_Email()
{//如果你需要在类中使用构造函数,你必须在构造函数中显式继承母类构造函数:
parent::CI_Email();
}
}
当你在自定义类中想使用CodeIgniter原始类时,你可以这样做:
首先,定义CodeIgniter对象赋给一个变量:
$CI =& get_instance();//必须以引用的方式
一旦定义某个对象为一个变量,你就可以使用那个变量名取代$this:
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
etc.
注意: 如果你使用php 4,那么请最好不要在类的构造函数中调用 get_instance() .php4在引用位于构造函数中的CI super object时存在问题,因为对象只有在类完全实例化后才存在.

4、载入类库:$this->load->library('类文件名(也是类名)','构造函数的参数数组');//类文件名不用加 上".php"扩展名(如是扩展系统类库的类,也不要加application/config /config.php:$config['subclass_prefix']所定义的前缀),名字不分大小写;构造函数的参数数组只有在构造函数存在 且需要传入参数的时候才设置。
5、使用类库对象:$this->小写的类名->类中的方法();  // 对象的实例名永远都是小写的

钩子-扩展框架的核心

1、启用钩子:application/config/config.php =》$config['enable_hooks'] = TRUE;
2、定义钩子:application/config/hooks.php =》
㈠定义单个钩子:
$hook['pre_controller'] = array(
'class'    => 'MyClass', //你希望调用的类名.如果你更喜欢使用过程函数代替类的话,此项留空.
'function' => 'Myfunction', //你希望调用的函数名.
'filename' => 'Myclass.php', //包含有你的类/函数的文件名.
'filepath' => 'hooks', //包含你的脚本的目录名(相对于application文件夹).
'params'   => array('beer', 'wine', 'snacks') //你希望传递给脚本的任何参数. 此项是可选的.
);
㈡定义多个钩子:
$hook['pre_controller'][] = array(
'class'    => 'MyClass',
'function' => 'Myfunction',
'filename' => 'Myclass.php',
'filepath' => 'hooks',
'params'   => array('beer', 'wine', 'snacks')
);

$hook['pre_controller'][] = array(
'class'    => 'MyOtherClass',
'function' => 'MyOtherfunction',
'filename' => 'Myotherclass.php',
'filepath' => 'hooks',
'params'   => array('red', 'yellow', 'blue')
);
3、挂勾点:
pre_system:
系统执行的早期调用.仅仅在benchmark 和 hooks 类 加载完毕的时候. 没有执行路由或者其它的过程.
pre_controller:
在调用你的任何控制器之前调用.此时所用的基础类,路由选择和安全性检查都已完成.
post_controller_constructor:
在你的控制器实例化之后,任何方法调用之前调用.
post_controller:
在你的控制器完全运行之后调用.
display_override:
覆盖_display()函数, 用来在系统执行末尾向web浏览器发送最终页面.这允许你用自己的方法来显示.注意,你需要通过 $this->CI =& get_instance() 引用 CI 超级对象,然后这样的最终数据可以通过调用 $this->CI->output->get_output() 来获得。
cache_override:
可以让你调用自己的函数来取代output类中的_display_cache() 函数.这可以让你使用自己的缓存显示方法
scaffolding_override:
可以让scaffolding(脚手架)的请求去触发你自己的脚本替代.
post_system:
在最终着色页面发送到浏览器之后,浏览器接收完最终数据的系统执行末尾调用。

自动加载资源

CodeIgniter有一个自动加载属性,它允许在系统运行过程中初始的自动加载库(libraries),帮助函数(helpers),插件(plugins)。
要自动加载资源,先打开 application/config/autoload.php 文件,然后增加你想要自动加载的项目在 autoload 数组中(不包括文件扩展名“.php”)。

公共函数

bool is_php('版本号')
如果已安装的PHP版本号等于或高于你所提供的版本号,本函数将返回布尔值 TRUE,否则返回 FALSE。

bool is_really_writable('path/to/file')
指定文件是否可写。在Windows平台,is_writable()函数在实际没有文件写权限时也返回真。

mix config_item('item_key')
取得单个配置信息

show_error('消息'[,int $status_code = 500 ])
这个函数将会使用以下错误模版来显示错误消息:
application/errors/error_general.php

show_404('页面')
这个函数将会使用以下错误模版来显示 404 错误信息:
application/errors/error_404.php

log_message('级别', '消息')
这个函数可以让你将消息写入记录文件中。你必须在第一个参数中选择三个“级别“中的任何一个, 指明它是哪一类消息(调试debug, 错误 error, 信息info)。 第二个参数是消息本身。
注意: 确保"logs" 文件夹是可写的,才能准确地将消息写入记录文件中。另外,你必须要设置记录的“threshold“来进行记录。例如通过设置“threshold“,你 可以只记录错误类型的消息,而不用记录其他两种。如果你将“threshold“设为0,记录就会被禁止。

set_status_header(code, 'text');
设置服务器状态头(header)。例如:set_status_header(401);// 将header设置为: Unauthorized

脚手架(Scaffolding)

CodeIgniter 的脚手架功能使您可以在开发过程中方便快速的在数据库中添加、删除、修改数据。
非常重要: 脚手架(Scaffolding)只可以在开发过程中使用。因为它提供了非常少的安全保护,所以可以访问到您的 CodeIgniter 站点的任何人都可以添加删除或修改您数据库中的数据。如果您使用脚手架,那么请确认您在使用完之后一定要立刻禁止它。千万不要在上线的站点中激活它,并且 一定要在使用前给它设置一个密匙(secret word)。
1、设置一个密匙(Secret Word):application/config/routes.php =》$route['scaffolding_trigger']把值替换成你的密匙(密匙不能 以下划线开头)。
2、激活脚手架:在你的控制器构造函数中添加这样的代码:$this->load->scaffolding('数据表名');
比如:
class Blog extends Controller {
function Blog()
{
parent::Controller();
$this->load->scaffolding('table_name');//激活脚手架
}
}
3、使用脚手架:example.com/index.php/控制器类/脚手架密钥/
脚手架特性只能操作有主键的表,因为这是各种数据库函数所必需的信息。

网页缓存

当一个网页第一次被加载的时候,缓存文件将被保存到system/cache文件夹。下次访问的时候,系统就会直接读取缓存文件,然后返回给用户的浏览器。如果缓存文件过期,它将被删除并重新生成。注意:Benchmark 标签在使用了缓存的页面仍然可用。
1、启动缓存:将代码$this->output->cache(n);放在你的控制器类的函数中(代码中的n是你希望缓存更新的分钟数)。
2、清除缓存:将上面的代码从你的控制器类中删除即可。相应缓存会自动过期并被删除。

调试应用程序

激活调试器:$this->output->enable_profiler(TRUE);
禁用调试器:$this->output->enable_profiler(FALSE);
设定基准点:
$this->benchmark->mark('标记1');
// Some code happens here
$this->benchmark->mark('标记2');
echo $this->benchmark->elapsed_time('标记1', '标记2');//输出两个标记间的代码的执行时间
显示总的执行时间:
在模版文件中使用 <?php echo $this->benchmark->elapsed_time();?> 或 {elapsed_time}
显示内存消耗:
如果你的PHP在安装的时候被配置成--enable-memory-limit,你可以将下面的代码包含到视图文件中显示整个系统的内存使用量:
<?php echo $this->benchmark->memory_usage();?>
注意:这个函数只能在视图文件中使用.这个消耗量就是应用程序的全部内存消耗.
如果不喜欢使用纯PHP,另外一种备用的来显示内存使用量的方式是在视图文件中使用这个伪变量:{memory_usage}

管理应用程序

如果你要对application文件夹进行重命名, 你需要打开应用程序中的index.php文件,对变量$application_folder进行更改:
$application_folder = "application";
//其值可以是绝对路径(将application文件夹从system文件夹中挪放到服务器的其他的位置时)、相对路径(在一个CodeIgniter下运行多个应用程序时)。注意:路径末尾不要用“/”。

视图文件中的PHP替代语法

自动短标记支持:<?=$variable?>
替代控制结构:
if,for,foreach,和 while 相应的关闭语法分别是:endif,endfor,endforeach,和 endwhile
if(...):
...
elseif(...):
...
else:
...
endif;
替代控制结构中将所有的左花括号“{”替换为冒号“:”;
删除了右花括号“}”;
以关闭语法加分号“;”结束。

安全

1、URI安全:URI 一般只包含下列内容:
字母和数字
波浪符: ~
句号: .
冒号: :
下划线: _
破折号: -
2、跨站脚本过滤(XSS Filtering):
$data = $this->input->xss_clean($data[,bool $is_image]);//当数据是图片文件时需将第二个参数设为true,图片安全则返回true否则返回false
如果你想让codeigniter自动处理POST或者COOKIE数据。你可以在application/config/config.php文件中设定:
$config['global_xss_filtering'] = TRUE;
3、使用GET,POST, COOKIE, 或SERVER数据:分别使用一下方法获得:
$this->input->get()
$this->input->post()
$this->input->cookie()
$this->input->server()
例如获得$_POST['something']的数据:$something = $this->input->post('something');
$this->input->get_post()方法将会搜索POST和GET方式的数据流,首先以POST方式搜索参数1中的值,否则以GET方式搜索
以上除了$this->input->server()方法之外,它们都还有第二个参数用以设置是否进行跨站脚本过滤(XSS Filtering)。
比如:$this->input->get_post('some_data', TRUE);
输入类除了上面几个之外还有:
$this->input->ip_address();//获取IP地址
$this->input->valid_ip($ip);//验证IP地址是否有效
$this->input->user_agent();//获取浏览器的user agent信息
4、表单验证:
为了进行表单验证,你需要这三样东西:
㈠、一个包含表单的视图文件。
<html>
<head>
<title>My Form</title>
</head>
<body>
<?php echo validation_errors(); ?>
<?php echo form_open('form'); ?>
<h5>Username</h5>
<input value="<?php echo set_value('username'); ?>" size="50" />
<h5>Password</h5>
<input value="" size="50" />
<h5>Password Confirm</h5>
<input value="<?php echo set_value('email'); ?>" size="50" />
<h5>Email Address</h5>
<input value="" size="50" />
<div><input value="Submit" /></div>
</form>
</body>
</html>
validation_errors()函数用于显示所有错误信息。
显示某个表单域的错误信息:form_error('表单域名');
set_value('表单域名'[,'默认值'])函数用于重新提交表单时,用上次输入的值重新填充文本框和文本区。如果你使用一个数组作为一个表单域的域名,你必须将这个数组作为本函数的参数。下面三个输出选择状态:
set_select('下拉菜单域名','下拉菜单项的值'[,'是否(TRUE/FALSE)默认选中'])
set_checkbox('复选框域名','复选框项目值'[,'是否(TRUE/FALSE)默认选中'])
set_radio('单选框域名','单选框项目值'[,'是否(TRUE/FALSE)默认选中'])
㈡、一个包含“成功”信息的视图文件,在成功提交后将被显示。
<html>
<head>
<title>My Form</title>
</head>
<body>
<h3>Your form was successfully submitted!</h3>
<p><?php echo anchor('form', 'Try it again!'); ?></p>
</body>
</html>
㈢、一个接收并处理所提交数据的控制器函数。
class Form extends Controller {
function index()
{
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('myform');//表单页面myform.php,保存在你的applications/views/ 文件夹中
}
else
{
$this->load->view('formsuccess');//成功页面formsuccess.php,保存在你的applications/views/ 文件夹中
}
}
}
设置验证规则:要设置验证规则请使用set_rules() 函数:$this->form_validation->set_rules();
该函数使用三个参数:
①、表单域的域名。
②、表单域的名字,它将被插入到错误信息中。例如,如果你有一个表单域叫做“user”你可能给它一个人性化名字叫做“用户名”。
③、为此表单域设置的验证规则。 CodeIgniter允许你将多个规则用竖线“|”连接在一起。任何PHP自身可以接收一个参数的函数都可以被用作一个规则,比如 htmlspecialchars, trim, MD5, 等。要调用一个回调函数只需把函数名加一个"callback_"前缀放在验证规则里,并在你的控制器中添加声明这个新的函数。
你也可以将一系列验证规则作为一个数组$config保存到配置文件application/config/form_validation.php ,然后将此数组作为唯一参数传递给set_rules()。你可以组织这些规则到“组”里。这些组既可以在符合 控制器类/类方法 的调用时自动加载(通过执行$this->form_validation->run()),也可以在用到时你手动调用(通过执 行$this->form_validation->run('组名'))。
规则参数列表:
required:如果元素为空,返回FALSE
matches:如果表单元素不匹配参数中所定义的某一项,返回FALSE。相当于枚举。例如:matches[form_item]
min_length:如果表单元素长度小于定义的最小长度,返回FALSE。例如:min_length[6]
max_length:如果表单元素长度大于定义的最大长度,返回FALSE。例如:max_length[12]
exact_length:如果表单元素不是正确的参数值,返回FALSE。 exact_length[8]
alpha:如果表单元素包含字母形式以外的其他字符,返回FALSE。
alpha_numeric:如果表单元素包含字母、数字以外的字符,返回FALSE。
alpha_dash:如果表单元素包含字母、数字、下划线、短横线以外的字符,返回FALSE。
numeric:如果表单元素包含数字以外的字符,返回 FALSE。
integer:如果表单元素包含整数以外的字符,返回 FALSE。
is_natural:如果表单元素包含自然数(0,1,2,3等)以外的字符,返回 FALSE。
is_natural_no_zero:如果表单元素包含非零的自然数(1,2,3等)以外的字符,返回 FALSE。
valid_email:如果表单元素不是一个有效的E-mail地址,返回 FALSE。
valid_emails:如果表单元素中有多个E-mail地址(用半角逗号“,”隔开),只要它们当中的任意一个E-mail地址不是一个有效的E-mail地址,就返回 FALSE。
valid_ip:如果表单元素不是一个有效的IP地址,返回 FALSE。
valid_base64:如果表单元素包含Base64字符编码以外的字符,返回 FALSE。

开发规范

1、文件格式:文件应该采用无BOM的UTF-8编码,并用LF作为换行符。
2、PHP闭合标签:所有的php文件应该省略这个php闭合标签“?>”,并插入一段注释来标明这是文件的底部并定位这个文件在这个应用的相对路径。这样有利于你确定这个文件已经结束而不是被删节的。比如:
/* End of file myfile.php */
/* Location: ./system/modules/mymodule/myfile.php */
3、类和方法(函数)的命名规则:类名的首字母应该大写,构造方法的名称要与类名相同。如果名称由多个词组成,词之间要用下划线分隔,不要使用骆驼命名法。类中所有其他方法的名称应该完全小写并且名称能明确指明这个函数的用途,最好用动词开头。尽量避免过长和冗余的名称。
4、变量命名:变量名应该只包含小写字母和数字(不能以数字开头),用下划线分隔,并且能适当地指明变量的用途和内容。那些短的、无意义的变量名应该只作为迭代器用在for()循环里。
5、注释:
文档块注释:
/**
* Super Class
*
* @package Package Name
* @subpackage Subpackage
* @category Category
* @author Author Name
* @link http://example.com
*/
行注释:使用行注释时,在大的注释块和代码间留一个空行。
5、常量:常量命名除了要全部用大写外,其他的规则都和变量相同。
6、TRUE, FALSE, 和 NULL关键字应该全部大写。
7、逻辑操作符:在||、&&、!的前后都要加一个空格。
无论什么时候,在声明有参数的函数时,要给参数设定默认值。

数据库操作

1、初始化数据库类:也就是连接数据库操作
$this->load->database('数据库连接信息','是否(TRUE/FALSE)返回连接ID(可用于连接多数据库)','是否(TRUE/FALSE)启用Active Record类。默认为 TRUE');//建立数据库连接
如果以上函数的第一个参数没有任何信息,它将会在系统指定的数据库配置文件中寻找。
数据库连接信息,可以是包含数据库连接配置的数组或DSN字符串。
连接例子1、数据库连接信息是包含数据库连接配置的数组:
$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;
$config['cache_on'] = FALSE;
$config['cachedir'] = "";
$config['char_set'] = "utf8";
$config['dbcollat'] = "utf8_general_ci";
$this->load->database($config);

连接例子2、数据库连接信息是DSN字符串:
$dsn = 'dbdriver://username:password@hostname/database';
$this->load->database($dsn);

连接例子3、连接多数据库:
$DB1 = $this->load->database('group_one', TRUE);
$DB2 = $this->load->database('group_two', TRUE);
$DB1->query();//只能使用这种方式,不能使用$this->db->query()这种方式
$DB1->result();//同理

重新连接/保持连接有效:
$this->db->reconnect();

如果你的所有页面均要求初始化数据库类,你可以让它自动加载。
要启用“自动连接”,可在application/config/autoload.php文件中的library数组里添加database。

2、标准查询:
㈠多结果标准查询(对象形式):
$query = $this->db->query('SELECT name, title, email FROM my_table');
if ($query->num_rows() > 0)//如果你的查询可能不返回结果,建议你使用num_rows()函数来测试查询结果
{
foreach ($query->result() as $row)
{
echo $row->title;//上面的result()函数返回一个包含对象的数组
echo $row->name;
echo $row->email;
}

echo 'Total Results: ' . $query->num_rows();
㈡多结果标准查询(数组形式):
$query = $this->db->query('SELECT name, title, email FROM my_table');
foreach ($query->result_array() as $row)
{
echo $row['title'];//上面的result_array()函数返回一个带下标的数组。
echo $row['name'];
echo $row['email'];
}
㈢单结果标准查询(对象形式)
$query = $this->db->query('SELECT name FROM my_table LIMIT 1');
$row = $query->row();//row()函数返回一个对象
echo $row->name;
㈣单结果标准查询(数组形式)
$query = $this->db->query('SELECT name FROM my_table LIMIT 1');
$row = $query->row_array();//row_array()函数返回一个数组
echo $row['name'];

3、快捷查询:
㈠快捷查询类能为我们提供快速取得数据的途径:
$query = $this->db->get('table_name'[,'每页的记录数(limit)','偏移值(offset)']);//执行SQL: SELECT * FROM table_name
foreach ($query->result() as $row)
{
echo $row->title;
}
$query = $this->db->get('mytable', 10, 20);//执行SQL: SELECT * FROM mytable LIMIT 20, 10
$this->db->get_where('数据表名','WHERE从句数组'[,'每页的记录数(limit)','偏移值 (offset)']);//与$this->db->get();函数一样,只是它允许你在函数的第二个参数那里添加一个where从句数 组,从而不用使用db->where()这个函数

㈡SQL语句设置函数:
$this->db->select('SELECT部分(返回字段列表)'[,'是否(TRUE/FALSE)用反引号保护字段和表名']);//此函数允许你在SQL查询中设置SELECT部分
例如:
$this->db->select('title, content, date');
$query = $this->db->get('mytable');

$this->db->select_max('查询字段'[,'结果字段重命名']);//字段最大值
范例1:
$this->db->select_max('age');
$query = $this->db->get('members');//执行SQL: SELECT MAX(age) as age FROM members
范例2:
this->db->select_max('age', 'member_age');
$query = $this->db->get('members');//执行SQL: SELECT MAX(age) as member_age FROM members

$this->db->select_min('查询字段'[,'结果字段重命名']);//字段最小值。与select_max()相似, 你可以选择性地给出第二个参数,用来给结果字段重命名。
$this->db->select_avg('查询字段'[,'结果字段重命名']);//字段平均值
$this->db->select_sum('查询字段'[,'结果字段重命名']);//字段和值
$this->db->from('数据表名');//使用了本函数后,就无需再指定$this->db->get('mytable')函数中的参数了,直接使用$this->db->get();即可。
$this->db->join('数据表名','SQL关联表达式'[,'关联方式(left/right/outer/inner/left outer/right outer)']);
例如:
$this->db->select('*');
$this->db->from('blogs');
$this->db->join('comments', 'comments.id = blogs.id');
$query = $this->db->get();
// 生成:
// SELECT * FROM blogs
// JOIN comments ON comments.id = blogs.id

$this->db->where()函数允许你使用四种方法中的一种来设置WHERE子句:
①、简单的 key/value 方法: $this->db->where('name', $name); //生成: WHERE name = '$name'
②、自定义 key/value 方法:可以在第一个参数中包含一个运算符,以便控制比较:
$this->db->where('name !=', $name);
$this->db->where('id <', $id);
// 生成: WHERE name != '$name' AND id < $id
③、关联数组方法: 使用这个方法时你也可以在键名中包含运算符:
$array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);
$this->db->where($array);
$array = array('name' => $name, 'title' => $title, 'status' => $status);
$this->db->where($array);
// 生成: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
④、自定义字符串: 手动编写子句:
$where = "name='Joe' AND status='boss' OR status='active'";
$this->db->where($where);

$this->db->where() 接受可选的第三个参数。如果你将它设置为 FALSE, CodeIgniter 将不会为你那些包含反勾号的字段名或表名提供保护。例如:$this->db->where('MATCH (field) AGAINST ("value")', NULL, FALSE);

$this->db->or_where()函数与$this->db->where()几乎完全相同,唯一的区别是本函数生成的子句是用 OR 来连接的:
$this->db->where('name !=', $name);
$this->db->or_where('id >', $id); // 生成: WHERE name != 'Joe' OR id > 50
$this->db->where_in('字段名','包含IN结构中项目的数组');//生成一段 WHERE field IN ('item', 'item') 查询语句,如果合适的话,用 AND 连接起来(而相应的$this->db->or_where_in()函数使用 OR 连接)。
$this->db->where_not_in('字段名','包含IN结构中项目的数组')函数生成一段 WHERE field NOT IN ('item', 'item') 查询语句,如果合适的话,用 AND 连接起来(而相应的$this->db->or_where_not_in()函数使用 OR 连接)。
$this->db->like('字段名 或 以字段名为键,匹配内容为值的数组'[,
'第一个参数是字段名时该字段所匹配的字符串',
'通配符(%)位置before/after/both(默认值)'])函数允许你生成 LIKE 子句。
①、简单 key/value 方式:
$this->db->like('title', 'match'); // 生成: WHERE title LIKE '%match%'
如果你多次调用本函数,那么这些条件将由 AND 连接起来(而相应的$this->db->or_like()函数使用 OR 连接)。
②、关联数组方式:
$array = array('title' => $match, 'page1' => $match, 'page2' => $match);
$this->db->like($array); // WHERE title LIKE '%match%' AND page1 LIKE '%match%' AND page2 LIKE '%match%'
$this->db->not_like()函数与$this->db->like()几乎完全相同,唯一的区别是它生成 NOT LIKE 语句
$this->db->or_not_like()函数与not_like()几乎完全相同,唯一的区别是多个实例之间是用 OR 连接起来的
$this->db->group_by('字段名或包含多个字段名的一维数组')允许你编写查询语句中的 GROUP BY 部分
$this->db->distinct()为查询语句添加 "DISTINCT" 关键字
$this->db->having('字段名、SQL表达式或数组'[,'字段值','是否转义'])允许你为你的查询语句编写 HAVING 部分。有两种语法形式,一个或两个参数都可以:
$this->db->having('user_id = 45'); // 生成: HAVING user_id = 45
$this->db->having('user_id', 45); // 生成: HAVING user_id = 45
把多个值通过数组传递过去:
$this->db->having(array('title =' => 'My Title', 'id <' => $id)); // 生成: HAVING title = 'My Title', id < 45
如果你正在使用一个由CodeIgniter进行转义保护的数据库,为了避免内容转义,你可以传递可选的第三个参数,并将其设置为FALSE。
$this->db->or_having('字段名、SQL表达式或数组'[,'字段值','是否转义'])与 having() 函数几乎完全一样,唯一的区别是多个子句之间是用 "OR" 分隔的。
$this->db->order_by('排序的字段或ORDER BY子句','排序方式(asc(升序)或desc(降序)或random(随机))')设置一个ORDER BY子句。
例如:
$this->db->order_by("title", "desc"); // 生成: ORDER BY title DESC
$this->db->order_by('title desc, name asc'); // 生成: ORDER BY title DESC, name ASC
多次调用本函数就可以排序多个字段:
$this->db->order_by("title", "desc");$this->db->order_by("name", "asc"); // 生成: ORDER BY title DESC, name ASC
$this->db->limit('结果数量'[,'结果偏移量'])函数限制查询所返回的结果数量
$this->db->count_all_results(['数据表名'])允许你获得某个特定的Active Record查询所返回的结果数量。可以使用Active Record限制函数,例如 where(), or_where(), like(), or_like() 等等。范例:
echo $this->db->count_all_results('my_table');// 生成一个整数,例如 25
$this->db->like('title', 'match');
$this->db->from('my_table');
echo $this->db->count_all_results();// 生成一个整数,例如 17

4、标准插入(insert)
$sql = "INSERT INTO mytable (title, name)
VALUES (".$this->db->escape($title).", ".$this->db->escape($name).")";
$this->db->query($sql);
echo $this->db->affected_rows();

5、快捷插入(insert)
㈠插入函数:
$this->db->insert('数据表名','关联数组或对象');
$data = array(
'title' => $title,
'name' => $name,
'date' => $date
);
$this->db->insert('mytable', $data); //第一个参数包含表名,第二个参数是一个包含数据的关联数组(也可以是一个对象)。
//执行SQL: INSERT INTO mytable (title, name, date) VALUES ('{$title}', '{$name}', '{$date}')
㈡SQL语句设置函数:
$this->db->set('字段名(或关联数组或对象)','字段值'[,'是否(TRUE/FALSE)转义'])函数使您能够设置inserts(插入)或updates(更新)值

6、更新数据
$this->db->update('数据表名','关联数组或对象'[,'WHERE子句或关联数组'])函数生成并执行一条update(更新)语句。例如:
$data = array(
'title' => $title,
'name' => $name,
'date' => $date
);
$this->db->where('id', $id);
$this->db->update('mytable', $data);
// 生成:
// UPDATE mytable
// SET title = '{$title}', name = '{$name}', date = '{$date}'
// WHERE id = $id
在进行更新时,你还可以使用上面所描述的 $this->db->set() 函数。

7、删除数据
$this->db->delete('表名或包含多个表名的数组','WHERE子句数组');生成并执行一条DELETE(删除)语句。
$this->db->empty_table('表名');生成并执行一条DELETE(删除)语句。例如:
$this->db->empty_table('mytable'); // 生成 DELETE FROM mytable
$this->db->truncate(['表名']);生成并执行一条TRUNCATE(截断)语句。
$this->db->from('mytable');
$this->db->truncate();
// 或
$this->db->truncate('mytable');
// 生成:TRUNCATE mytable

8、链式方法
链式方法允许你以连接多个函数的方式简化你的语法。范例:
$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);
$query = $this->db->get();
链式方法只能在PHP 5下面运行。

9、Active Record缓存
缓存调用是累加的。如果你调用了两次有缓存的 select(),然后再调用两次没有缓存的 select(),这会导致 select() 被调用4次。有三个可用的缓存函数:
$this->db->start_cache() 开启缓存
$this->db->stop_cache() 停止缓存
$this->db->flush_cache() 清空缓存
能够被缓存的语句有: select, from, join, where, like, groupby, having, orderby, set

10、事务
CodeIgniter允许你在支持事务安全的数据库表中使用事务。在MySQL中,你需要用InnoDB或BDB表而不是更常用的MyISAM。大多数其它的数据库平台都原生支持事务。
CodeIgniter的事务方法:
$this->db->trans_start() 启用事务。要使用测试模式只需将$this->db->trans_start()函数的第一个参数设置为 TRUE 即可
$this->db->trans_complete() 完成事务。
$this->db->trans_off() 禁用事务。
$this->db->trans_strict(FALSE); 禁用严格模式。默认情况下, CodeIgniter 以严格模式运行所有事务。当严格模式被启用时, 如果你正在运行多组的事务, 只要有一组失败, 所有组都会被回滚。如果严格模式被禁用, 每一组都被视为独立的组, 这意味着其中一个组的失败不会影响其它组。
$this->db->trans_status() 事务状态,执行失败返回FALSE
$this->db->trans_begin() 手动运行事务
$this->db->trans_rollback() 回滚
$this->db->trans_commit() 执行提交

11、表数据
$this->db->list_tables() 获取表信息。返回一个包含当前连接数据库中所有表名称的数组
$this->db->table_exists('表名') 判断表是否存在。返回布尔值:TRUE/FALSE。

12、字段数据
$this->db->list_fields('表名')/$query->list_fields() 返回一个包含字段名称的数组
$this->db->field_exists('字段名','表名') 判断字段是否存在。返回布尔值:TRUE/FALSE。
$this->db->field_data('表名')/$query->field_data() 返回一个包含字段名称信息的对象数组。 如果这个函数支持您的数据库,它将会返回以下数据:
name - 列名称
max_length - 列的最大长度
primary_key - 1 如果此列被定义为主键
type - 指定列的数据类型
例1:
$fields = $this->db->field_data('table_name');
foreach ($fields as $field)
{
echo $field->name;
echo $field->type;
echo $field->max_length;
echo $field->primary_key;
}
例2:
$query = $this->db->query("YOUR QUERY");
$fields = $query->field_data();

13、调用自定义函数
$this->db->call_function('没有mysql_前缀的函数名'[,'函数的参数1','参数2','参数 3',...]); 允许你用一个独立的方法来调用一些 CodeIgniter 中没有定义的PHP数据库函数. 你必须提供一个没有 mysql_ 前缀的函数名来作为第一个参数, 这个前缀会根据当前正在使用的数据库类型来自动添加。任何你需要添加的其它参数都放在第一个参数后面。
通常情况下, 你会需要提供一个 connection ID 或是一个 result ID, connection ID 可以这样来获得:
$this->db->conn_id;
result ID 则包含在一个结果集(result object)中, 你可以这样来获得它:
$query = $this->db->query("SOME QUERY");
$query->result_id;

14、数据库缓存
只有 读类型(read-type) (SELECT) 查询会被缓存,因为只有这种查询会产生结果集。并且下列方法不能和缓存搭配使用:
num_fields() 、field_names() 、field_data() 、free_result()
激活缓存的步骤:
㈠创建缓存目录;
㈡在文件 application/config/database.php 中设置缓存目录;
㈢激活缓存特性,可以在文件 application/config/database.php 中设置全局选项,也可以用下面的方法手动设置。
$this->db->cache_on()  开启缓存
$this->db->cache_off() 关闭缓存
管理您的缓存文件
缓存系统会在缓存存放目录中建立与被访问的URL所对应的子目录(由各个URI路由段组成目录名。例如网址example.com/index.php/blog/comments组成的缓存目录名就是blogcomments),同时把缓存文件存放在那个子目录中。
由于缓存文件不会过期,您需要在您的应用程序中写入删除缓存操作的代码。
删除缓存的函数有两个:
$this->db->cache_delete() 删除缓存文件。如果您不使用任何参数,将根据目前的URI决定应该清除/更新什么位置的缓存.要删除非当前页面的数据库缓存,可是采 用$this->db->cache_delete('blog','comments');
$this->db->cache_delete_all() 清除所有的缓存文件。

15、数据库维护
㈠初始化(载入数据库维护类):$this->load->dbforge();//一旦初始化,就可以使用$this->dbforge 对象访问类中函数
㈡创建数据库:$this->dbforge->create_database('数据库名') 成功返回 TRUE,否则返回FALSE
㈢删除数据库:$this->dbforge->drop_database('数据库名') 成功返回 TRUE,否则返回FALSE
㈣添加字段:$this->dbforge->add_field('字段信息数组或字段信息字符串') 例外情况:$this->dbforge->add_field('id');//添加字段名为id的INT(9)类型的自动递增主键
㈤添加主键:$this->dbforge->add_key('主键字段名或包含非主键字段名的数组'[,'是否(TRUE/FALSE) 是主键']) 可选的第二个参数如果被设置为TRUE,那么就会生成一个主键。请注意 add_key()后面必须调用 create_table()。如果第二个参数不设置,就是添加非主键。多列的非主键必须通过数组来传递,例如:
$this->dbforge->add_key(array('blog_name', 'blog_label'));
// 生成 KEY `blog_name_blog_label` (`blog_name`, `blog_label`)
㈥创建表:$this->dbforge->create_table('表名'[,'是否(TRUE/FALSE)添加IF NOT EXISTS子句']);
㈦删除表:$this->dbforge->drop_table('表名');
㈧重命名表:$this->dbforge->rename_table('原表名', '新表名');
㈨修改表:
添加列:$this->dbforge->add_column('表名','字段信息数组')
删除列:$this->dbforge->drop_column('表名','列名(字段名)')
修改列:$this->dbforge->modify_column('表名','字段信息数组')
定义 字段信息数组:
在数组中必须包含与字段数据类型相关的“类型”键。例如,INT,VARCHAR,TEXT等等。许多数据类型(如 VARCHAR)还需要“约束”键。
可以使用的键/值:
type/类型INT,VARCHAR,TEXT等等:数据类型
constraint/长度值:约束,数据最大长度
unsigned/TRUE: 在字段定义中生成“UNSIGNED”。
default/值: 在字段定义中生成一个缺省值。
null/TRUE: 在字段定义中生成“NULL” 。没有这个,字段缺省为“NOT NULL”。
auto_increment/TRUE: 为字段生成自动增量标记。注意,字段类型必须支持自动增量标记,如整型。
例如:
$fields = array(
'blog_id' => array(
'type' => 'INT',
'constraint' => 5,
'unsigned' => TRUE,
'auto_increment' => TRUE
),
'blog_title' => array(
'type' => 'VARCHAR',
'constraint' => '100',
),
'blog_author' => array(
'type' =>'VARCHAR',
'constraint' => '100',
'default' => 'King of Town',
),
'blog_description' => array(
'type' => 'TEXT',
'null' => TRUE,
),
);

16、数据库工具类
㈠初始化(载入数据库工具类):$this->load->dbutil();//一旦初始化完毕,你可以通过 $this->dbutil 对象来访问成员函数
㈡列出所有数据库名:array $this->dbutil->list_databases() 返回一个含有数据库名的一维数组
㈢优化数据表:bool $this->dbutil->optimize_table('表名');
㈣修复数据库:bool $this->dbutil->repair_table('table_name');//注意:此特性仅在MySQL/MySQLi数据库中可用。
㈤优化数据库:bool $this->dbutil->optimize_database();//注意:此特性仅在MySQL/MySQLi数据库中可用。
㈥从数据库结果集输出CSV格式内容:string $this->dbutil->csv_from_result($db_result) 第一个参数必须为查询结果集对象;第二和第三个参数允许你设置分隔符和换行符。默认使用tab(跳格)作为分隔符,使用“\n”作为换行符。
㈦从数据库结果集输出XML格式内容:string $this->dbutil->xml_from_result($db_result) 第一个参数是查询结果集对象,第二个参数为可选数组参数,数组包含配置参数。例如:
$this->load->dbutil();
$query = $this->db->query("SELECT * FROM mytable");
$config = array (
'root'    => 'root',
'element' => 'element',
'newline' => "\n",
'tab'    => "\t"
);
echo $this->dbutil->xml_from_result($query, $config);
㈧备份数据库:string $this->dbutil->backup(['备份参数'])
用法:
// 加载数据库工具类
$this->load->dbutil();
// 备份整个数据库并将其赋值给一个变量
$backup =& $this->dbutil->backup();
// 加载文件辅助函数并将文件写入你的服务器
$this->load->helper('file');
write_file('/path/to/mybackup.gz', $backup);
// 加载下载辅助函数
$this->load->helper('download');
force_download('mybackup.gz', $backup);
设置备份参数:
将一个包含了各项参数值的数组作为第一个函数参数传递给备份函数,就可以设置数据库备份的参数。例如:
$prefs = array(
'tables'      => array('table1', 'table2'),  // 包含了需备份的表名的数组.
'ignore'      => array(),           // 备份时需要被忽略的表
'format'      => 'txt',             // gzip, zip, txt
'filename'    => 'mybackup.sql',    // 文件名 - 如果选择了ZIP压缩,此项就是必需的
'add_drop'    => TRUE,              // 是否要在备份文件中添加 DROP TABLE 语句
'add_insert'  => TRUE,              // 是否要在备份文件中添加 INSERT 语句
'newline'     => "\n"               // 备份文件中的换行符,可使用的有"\n", "\r", "\r\n"
);
$this->dbutil->backup($prefs);

发表我的评论