CodeIgniter笔记

来源:互联网 发布:广告语录音软件 编辑:程序博客网 时间:2024/05/01 20:27




1.架构:


 m:数据模型,数据模型就是对你的数据库或其他数据存储方式进行取回、插入和更新的地方。
 v:视图
 c:控制器


 view:可以按模块创建不同的文件夹,然后把对应的视图放在对应的文件夹里面.template里放进header.php和footer.php。在控制器加载的时候,依次加载header.php,home.php,footer.php。


 
“libraries”文件夹中的核心类
“helper”文件夹中的辅助函数
“config”文件夹中自定义配置文件
“system/language”文件夹中的语言包
“models”文件夹中的模型


************************************
2.页面不存在


 show_404()


************************************
3.设置访问路由


application/config/routes.php


$route['default_controller'] = 'pages/view'; //默认控制器
$route['(:any)'] = 'pages/view/$1'; //利用通配符 (:any) 可以使任何请求都能匹配到 $routes 数组,并且通过参数传递给pages类的view()方法




如果这两个设置的控制器不一样会怎么样?待验证。


************************************
4.表单


 form_open() //用来提供表单元素和一些额外功能,例如添加隐藏的 安全类
 validation_errors() //报告表单验证中出现的错误信息


 $this->load->helper('form');
 $this->load->library('form_va tion');
 $this->form_validation->set_rules('title', 'Title', 'required');
 $this->form_validation->set_rules('text', 'text', 'required');
 $this->form_validation->run()
 set_rules() 方法包含三个参数,第一个是输入域的名称,第二个是错误信息的名称,第三个是错误信息的规则




 $this->load->helper('url');
 $slug = url_title($this->input->post('title'), '-', TRUE);
 //Takes a string as input and creates a human-friendly URL string,The second parameter determines the word delimiter. By default dashes are used.The third parameter determines whether or not lowercase characters are forced. By default they are not. Options are boolean TRUE/FALSE:


 $post = $this->input->post();




************************************
5.CodeIngniter URL


 【1】删除index.php,通过修改.htaccess
  RewriteEngine on


  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d        //此处有大坑。加上这两句可保证一般css、js文件正常加载。(注意删掉这句注释哦)


  RewriteCond $1 !^(index\.php|images|robots\.txt)
  RewriteRule ^(.*)$ /index.php/$1 [L]


 【2】添加URL后缀,config.php修改$config['url_suffix']


 【3】 URL 中使用查询字符串,修改config.php
  $config['enable_query_strings'] = FALSE;
  $config['controller_trigger'] = 'c'; //控制器名
  $config['function_trigger'] = 'm'; //方法名
  $config['directory_trigger']='d'; //若控制器在子目录下,URL中需带有这个参数,指定控制器所在子目录名称 


************************************
6.Controller


 【1】默认控制器 
  application/config/routes.php 
  $route['default_controller'] = 'Blog';


 【2】重新定义方法的调用规则 _remap() 
  如果你的控制器中包含一个名为 _remap() 的方法,那么不管你的 URI 中包含什么,它总会被忽略掉。这个方法会废除掉由 URI 片段来决定哪个方法被调用的规则,允许你重新定义调用方法的规则(方法的路由规则)。
 
 【3】私有方法
  在某些情况下,你可能想要隐藏一些方法使之无法对外查阅。将方法私有化很简单,只要在方法名字前面加一个下划线(“_”)做前缀就无法通过 URL 访问到了。


 【4】子文件夹
  只要在 application/controllers 目录下创建文件夹并放入你的控制器就可以了。
  application/controllers/products/shoes.php
  URI:example.com/index.php/products/shoes/show/123


 【5】构造函数
  parent::__construct(); //这行代码的必要性在于,你此处的构造函数会覆盖掉这个父控制器类中的构造函数,所以我们要手动调用它。(会被覆盖掉,所以需要重新调用)


************************************
7. view


 【1】载入多个视图,当我们一次性载入多个视图的时候,你只需在第一个视图传入数据就可以了
  $this->load->view('header',$data);
  $this->load->view('menu');
  $this->load->view('content', $data);
  $this->load->view('footer');


 【2】用子文件夹存储视图
  $this->load->view('folder_name/file_name');


 【3】获取视图内容
如果将view第三个参数设置为true(布尔)则函数返回数据。view函数缺省行为是 false, 将数据发送到浏览器。如果想返回数据,记得将它赋到一个变量中
$string = $this->load->view('myfile', $data, true);




************************************
8.Models


 【1】自动载入模型
  application/config/autoload.php 文件
 【2】连接到数据库
当一个模型被载入时,它并不会自动连接数据库。以下方法可以使您连接数据库:
1)您可以使用标准方法来连接数据库(说明), 也可以通过控制器或者您的自定义模型。
2)您可以把第三个参数设置为TRUE来使模型装载函数自动连接数据库,连接配置可以在您的数据库配置文件中可以定义:
$this->load->model('Model_name', '', TRUE);
3)您可以手动设定第三个参数来载入您的自定义数据库配置: $config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;


$this->load->model('Model_name', '', $config);






************************************
9.辅助函数(一般常用来处理URL)




 【1】载入辅助函数
$this->load->helper('url')//要载入文件名为url_helper.php的URL Helper  
一旦被载入,辅助函数将全局可用(globally available),你可以在 controller 和 views 中使用它们。


 【2】载入多个辅助函数
$this->load->helper( array('helper1', 'helper2', 'helper3') );


 【3】自动载入辅助函数
application/config/autoload.php 


 【4】设定你自己的前缀(Prefix)
application/config/config.php
$config['subclass_prefix'] = 'MY_';




************************************
10.使用 CodeIgniter 类库


 【1】类库文件
所有的类库文件存放在system/libraries 文件夹


 【2】加载类库文件
$this->load->library('form_validation');


 【3】加载多个类库文件
$this->load->library(array('email', 'table'));






11.创建类库
 【1】建立你的类库文件
你的类库文件必须保存在 application/libraries 文件夹,CodeIgniter将在这个文件夹中寻找并初始化它们.


 【2】命名约定

文件名首字母大写. 例如:  Myclass.php
类声明首字母大写. 例如:  class Myclass
类的名字和文件名应相同.


 【3】使用你自己的类
$this->load->library('someclass');//当 someclass 是文件名时,不用加上".php"扩展名.这里名字不分大小写.
$this->someclass->some_function();  // 对象的实例名永远都是小写的 


 【4】在初始化自定义类时传递参数
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('Someclass', $params);


你也可以传递存于配置文件中的参数.你只需简单的建立一个与 类文件名相同的config文件,并保存在 application/config/ 文件夹中.注意当你通过上文所述的方式动态传递参数时,config文件中的选项将不起作用.


 【5】在你自定义的类库中初始化CodeIgniter资源
$this, 只直接作用在你自己的控制器,模型和视图中.当你在自定义类中想使用CodeIgniter原始类时
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');


 【6】用你自己的类替换原始类
简单的将你自己的类命名为与原始类一样就能使CodeIgniter使用这个新类。要使用这个特性,文件名与类声明必须与原始类完全一致




 【7】扩展现有类
扩展的类必须申明由父类扩展而来.
新扩展的类所在的文件必须以 MY_ 为前缀(这个选项是可配置的)

application/libraries/MY_Email.php如下:


如果你需要在类中使用构造函数,你必须在构造函数中显式继承父类构造函数:
class MY_Email extends CI_Email {


   public function __construct()
   {
parent::__construct();
   }
}


 【8】载入你的子类
$this->load->library('email');


 【9】设定自定义前缀
application/config/config.php
$config['subclass_prefix'] = 'MY_';






12.使用 CodeIgniter 适配器
 【1】定义:适配器是一种特殊的库,它有一个父类和任意数量的子类。子类可以访问其父类元素,但不能访问其兄弟类的元素


 【2】路径:适配器的源文件存放在system/libraries 目录下, 命名一个和类名字相同的文件夹,文件夹下存放该类


 【3】加载:
$this->load->driver('some_parent');
$this->some_parent->some_method();
$this->some_parent->child_one->some_method();
$this->some_parent->child_two->another_method();


 【3】创建适配器
/application/libraries/Driver_name


Driver_name.php
drivers
Driver_name_subclass_1.php
Driver_name_subclass_2.php
Driver_name_subclass_3.php




13.创建核心系统类
 【1】系统类清单

    Benchmark
    Config
    Controller
    Exceptions
    Hooks
    Input
    Language
    Loader
    Log
    Output
    Router
    URI
    Utf8


 【2】替换核心类
要使用你自己的系统类替换默认类只需简单的将你自己的 .php 文件放入本地文件夹 application/core。只要你自定义的文件名与默认的完全一样,它就会自动替换原有的类
application/core/some-class.php
要注意的是你自定义的类必须以CI作为前缀
class CI_Input {





 【3】扩展核心类
  扩展的类必须申明由父类扩展而来.
新扩展的类所在的文件必须以 MY_ 为前缀,这个选项是可配置的
class MY_Input extends CI_Input {


}
class MY_Input extends CI_Input {


function __construct()
{
parent::__construct();
}
}




class Welcome extends MY_Controller {


function __construct()
{
parent::__construct();
}


function index()
{
$this->load->view('welcome_message');
}
}




14.钩子 - 扩展框架的核心
 【1】CodeIgniter 的钩子功能使得您可以在不修改系统核心文件的基础上来改变或增加系统的核心运行功能
 【2】启用钩子
钩子功能可以在全局范围内打开或关闭,您可以在 application/config/config.php 文件中设定
$config['enable_hooks'] = TRUE;


 【3】定义钩子
$hook['pre_controller'] = array(
                'class'    => 'MyClass',
                'function' => 'Myfunction',
                'filename' => 'Myclass.php',
                'filepath' => 'hooks',
                'params'   => array('beer', 'wine', 'snacks')
                );


数组的索引与你使用的指定挂钩点名字相关,上面的例子中挂钩点是pre_controller.



class  你希望调用的类名.如果你更喜欢使用过程函数代替类的话,此项保留为空.
function  你希望调用的函数名.
filename  包含有你的类/函数的文件名.
filepath  包含你的脚本的目录名. 注意: 你的脚本放在 application 文件夹下的目录里, 这样 filepath就以那个文件夹(application)为基准. 例如, 如果你的脚本放在application/hooks下, 你可以把hooks 作为你的filepath. 如果你的脚本放在application/hooks/utilities下你可以把 hooks/utilities作为filepath. 注意后面没有"/".如果不放在根目录下可以根据相对路径的配置,来完成调用。这样就可以完成,多个应用共享一个钩子。
params  你希望传递给脚本的任何参数. 此项是可选的.




 【4】同一挂钩点的多次引用,这允许你的多个脚本拥有相同的挂钩点。你定义数组的顺序将是程序执行的顺序.
$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')
                        );


 【5】挂勾点

    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() 函数.这可以让你使用自己的缓存显示方法
    post_system
    在最终渲染的页面发送到浏览器之后,浏览器接收完最终数据的系统执行末尾调用




15.自动装载资源
 【1】CodeIgniter 带有"自动装载"功能可以允许系统每次运行时自动初始化类库、辅助函数和模型。如果你需要某些资源在整个应用程序中全局使用,为方便起见可以考虑自动装载它们


 【2】下列项目可以自动装载

    “libraries”文件夹中的核心类
    “helper”文件夹中的辅助函数
    “config”文件夹中自定义配置文件
    “system/language”文件夹中的语言包
    “models”文件夹中的模型


 【3】要自动装载资源,打开 application/config/autoload.php 文件,然后将你想要自动装载的项目添加到 autoload 数组中。增加项目到自动装载数组中的时候,不要包括文件扩展名(.php)。


16.公共函数
公共函数位于 system/core/Common.php 文件中,可以在这里定义自己的公共函数
show_error('message'), show_404('page'), log_message('level', 'message')




17.URI 路由


  
 【1】由规则定义在application/config/routes.php 文件中。定义可以用两种方式: 通配符(wildcards) 或者 正则表达式(Regular Expressions)


 【2】注意: 路由将会按照定义的顺序来运行.高层的路由总是优先于低层的路由.
      重要提示: 不要在前面或后面加"/".


 【3】通配符

在一个路由中,数组的键包含着被匹配的URI,而数组的值包含着路由将被重定向的目的地
:num 将匹配一个只包含有数字的segment(段).
:any 将匹配任何字符(可以是多个segment段).可以匹配多个值


 【4】正则表达式
注意:  如果你使用逆向引用请将双反斜线语法替换为美元符语法(\\1 替换为 $1).
$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";


 【5】系统保留的路由
第一个为系统默认的路由:$route['default_controller'] = 'welcome';
这个路由表明了当URI中不包含要访问的类和控制器信息的(即只访问根目录的情况,如http://localhost/ci)将要加载哪个控制器


第二个为404页面的路由:$route['404_override'] = '';
这个路由标识了如果请求的控制器无法访问的时候将加载哪个控制器。它相当于覆盖了默认的404错误页面(即提供了自己定义404页面的功能)。但它不会影响show_404()这个方法,这个方法依然会加载默认的位于application/errors/error_404.php的error_404.php页面。


重要: 保留的路由应该在所有通配符或正则表达式路由之前定义。




18.错误处理


 【1】show_error('消息' [, int $status_code = 500 ] [, string $heading = 'An Error Was Encountered'])
  这个函数将会使用以下错误模版来显示错误消息:
application/errors/error_general.php
可选参数 $status_code 决定在显示错误的同时将会发送哪种 HTTP 状态代码。
可选参数 $heading 决定错误模版h1标签内容。


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


传递给该函数的字符串代表的是找不到的文件路径。注意CodeIgniter会在找不到目标控制器情况下,自动显示404消息。


CodeIgniter自动记录任何 show_404() 函数调用。设置第二个可选的参数为FALSE将跳过记录


 【3】log_message('级别', '消息')
这个函数可以让你将消息写入记录文件中。你必须在第一个参数中选择三个“级别“中的任何一个, 指明它是那一类消息(调试 debug, 错误 error, 信息info)。 第二个参数是消息本身。


有三种不同类型的消息:


错误类型的消息。 这种是真正的错误消息. 例如PHP错误或者用户错误。
调试类型的消息。 这种是用来帮助调试的消息。 例如, 如果当一个类被初始化时,你可以将这个初始化记录下来,然后用于调试。
信息类型的消息。 这种是最低优先级别的消息,它只是简单的提供了关于运行的一些信息。 CodeIgniter 不会自动产生任何信息类型的消息,但是你可能会在你的程序里使用它。





 【4】注意: 确保"logs" 文件夹是可写的,才能准确地将消息写入记录文件中。此外, 你必须设置application/config/config.php文件中的"threshold"设定,通过设置“threshold“,你可以只记录错误类型的消息,而不用记录其他两种。如果你将“threshold“设为0,记录就会被禁止。




19.网页缓存
依靠网页缓存,你的网页可以达到近乎静态网页的加载速度,因为他们将程序输出的结果保存到硬盘上了。


 【1】缓存的工作机制
CI支持每个页面单独缓存,而且可以设置缓存更新时间。当一个网页第一次被加载的时候,缓存文件将被保存到application/cache文件夹。 下次访问的时候,系统就会直接读取缓存文件,然后返回给用户的浏览器。如果缓存文件过期,它将被删除并重新生成。


 【2】启动缓存
启用缓存功能,只需要将下面的代码放入你的任何一个控制器(controller)的方法(function)内:
$this->output->cache(n);
其中 n 是你希望缓存更新的 分钟 数。可以使用 m/60 来精确到秒,例如 1/60 ,则是精确到 1秒


 【3】警告: 由于CI存储缓存文件的方式,只有通过 view 文件的输出才能被缓存。注意: 在缓存文件产生之前,请确保 application/cache 文件夹可写。


 【4】清除缓存
如果你不再想使用缓存,仅需将上面的代码从你的controller里面删除即可。注意: 这样做并不能让缓存文件立即消失,它将会自动过期并被删除。如果你想立即删除那些文件,就必须自己动手了。




20.调试你的应用程序

该分析器将在页面下方显示基准测试结果,运行过的 SQL 语句,以及 $_POST 数据。这些信息有助于开发过程中的调试和优化。
 【1】初始化类,激活分析器
$this->output->enable_profiler(TRUE);
分析器激活后将产生一个报告并插入您的页面底部
$this->output->enable_profiler(FALSE)


 【2】启用和禁用分析数据中的字段
分析数据中的每个字段可通过设置相应的控制变量TRUE or FALSE来启用和禁用. 其中的一个方法是:你可以在application/config/profiler.php 配置文件里设置整个程序的全局默认值.
$config['config']          = FALSE;
$config['queries']         = FALSE;


另一种方法是:你可以在控制器中通过调用set_profiler_sections() 来覆盖全局设置和默认设置
$sections = array(
'config'  => TRUE,
'queries' => TRUE
);


$this->output->set_profiler_sections($sections);




21.以CLI方式运行


 【1】什么是CLI?

命令行接口是一种基于文本的和计算机交互的方式


 【2】为什么使用命令行?

使用 cron 定时运行任务而不需要使用 wget 或 curl
通过检查 $this->input->is_cli_request() 让你的 cron 任务无法通过网址访问到
让交互式任务可以做设置权限、清空缓存、执行备份等操作
与其他语言进行集成。比如一个 C++ 脚本可以调用一条指令来运行你模型中的代码!


 【3】运行命令行
$ cd /path/to/project;
$ php index.php tools(控制器) message(方法名) param(参数,可选) 


php index.php 后面的第一个输入项必须是控制器名,如果你的控制器名在目录下面要把目录名和控制器名连接起来。




22.管理你的应用程序


 【1】对应用程序文件夹重命名
如果你要对 application 进行重命名, 你需要打开 index.php 文件,对变量 $application_folder 进行更改:
$application_folder = "application";


 【2】更改你的应用程序的文件夹路径
你可以将 application文件夹从system 文件夹中挪放到服务器的其他的位置。但是你还要更改 index.php 文件里将$application_folder变量设置为服务器的全路径。
$application_folder = "/Path/to/your/application";


 【3】在一个 CodeIgniter 下运行多个应用程序
如果你想要多个应用程序共享同一个 CodeIgniter, 你要将 application 下所有的文件夹放在不同的应用程序的文件夹内


applications/foo/
applications/foo/config/
applications/foo/controllers/
applications/foo/errors/
applications/foo/libraries/
applications/foo/models/
applications/foo/views/
applications/bar/
applications/bar/config/
applications/bar/controllers/
applications/bar/errors/
applications/bar/libraries/
applications/bar/models/
applications/bar/views/

$application_folder = "applications/foo";


注意:  每一个应用程序都会需要它自己的index.php文件来调用他的目标程序。你可以随意对 index.php 文件进行命名。






23.处理多环境
 【1】ENVIRONMENT 常量
默认情况下 CodeIgniter 把环境常量设置为 'development'. 在 index.php 文件的顶部
define('ENVIRONMENT', 'development'); 


 【2】对默认框架行为的影响
设置 ENVIRONMENT 常量为 'development' 值将会允许所有PHP错误报告都输出到浏览器。 相反的,设置常量为 'production' 将会禁止所有错误报告的输出。 在产品中禁用错误报告是一个 不错的安全措施。 




24.视图文件的 PHP 替代语法,使 PHP 代码达到最精简并使其更容易辨认


 【1】自动短标记支持
注:如果你发现本页描述的语法在你的服务器上不工作,它可能是“短标记”在你的 PHP ini 文件中禁用了。CodeIgniter 可以重写所有短标记,让你使用这个语法,即使你的服务器不支持它。这个特性可以在你的 config/config.php 文件中打开($config['rewrite_short_tags'])。


请注意,如果你使用这个特性,如果在你的视图文件中发生 PHP 错误,则错误信息和行号将无法准确显示。相反,所有的错误将显示为 eval () 的错误。


 【2】替代 Echo
<?php echo $variable; ?>
使用替代语法,你能改成这样的形式:
<?=$variable?>


 【3】替代控制结构
<ul>
<?php foreach ($todo as $item): ?>
<li><?=$item?></li>
<?php endforeach; ?>
</ul>






25.安全
 
 【1】URI 安全
CodeIgniter 严格限制 URI 中所能包含的字符,以此帮助你设计的程序减少被恶意数据入侵的可能。URI 一般只包含下列内容:


字母和数字(Alpha-numeric text)
波浪符(Tilde): ~
句号(Period): .
冒号(Colon): :
下划线(Underscore): _
破折号(Dash):-


 【2】Register_globals

 【3】error_reporting
在生产环境中,往往有必要通过设置内部的error_reporting值为0来禁用PHP错误报告。 这可以防止可能含有敏感信息的原始PHP错误报告输出。 


 【4】magic_quotes_runtime
在系统初始化期间 magic_quotes_runtime 指令被关闭以便在数据库检索数据时不必去掉反斜线




在接收任何数据到你的程序之前,不管是表单提交的 POST 数据、COOKIE 数据、URI 数据、XML-RPC 数据、还是 SERVER 数组中的数据,我们都推荐你实践下面的三个步骤:


    过滤不良数据.
    验证数据以确保符合正确的类型, 长度, 大小等. (有时这一步骤也可取代第一步骤)
    在提交数据到你的数据库之前将其转换.




 【4】XSS 过滤
 【5】验证数据
 【6】插入数据库之前转义所有数据
$this->db->escape() 这个函数将会确定数据类型,以便仅对字符串类型数据进行转义。并且,它也会自动把数据用单引号括起来,所以你不必手动添加单引号,用法如下: $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
$this->db->escape_like_str() This method should be used when strings are to be used in LIKE conditions so that LIKE wildcards ('%', '_') in the string are also properly escaped. 



26.常用风格和语法
 【1】文件格式
文件应该使用 Unicode (UTF-8) 编码保存
同时不要使用 字节序标记(BOM) 
应该使用Unix 格式的行结束符(LF)


 【2】PHP 闭合标签
PHP闭合标签“?>”在PHP中对PHP的分析器是可选的。 但是,如果使用闭合标签,任何由开发者,用户,或者FTP应用程序插入闭合标签后面的空格都有可能会引起多余的输出、php错误、之后的输出无法显示、空白页。因此,所有的php文件应该省略这个php闭合标签,并插入一段注释来标明这是文件的底部并定位这个文件在这个应用的相对路径。这样有利于你确定这个文件已经结束而不是被删节的。
适当的: <?php echo "Here's my code!"; 
/* End of file myfile.php */ 
/* Location: ./system/modules/mymodule/myfile.php */


 【3】类和方法(函数)的命名规则
类名的首字母应该大写。如果名称由多个词组成,词之间要用下划线分隔,不要使用骆驼命名法。类中所有其他方法的名称应该完全小写并且名称能明确指明这个函数的用途,最好用动词开头。尽量避免过长和冗余的名称
不当的: 
function fileproperties() // 方法名没有清晰的描述以及下划线分割单词 
function fileProperties() // 方法名没有清晰的描述以及使用了驼峰法命名 
function getfileproperties() // 还可以!但是忘记了下划线分割单词 
function getFileProperties() // 使用了驼峰法命名 
function get_the_file_properties_from_the_file() // 方法名太冗长 
适当的: 
function get_file_properties() // 清晰的方法名描述,下划线分割单词,全部使用小写字母


 【4】变量命名
变量的命名规则与方法的命名规则十分相似。就是说,变量名应该只包含小写字母,用下划线分隔,并且能适当地指明变量的用途和内容。那些短的、无意义的变量名应该只作为迭代器用在for()循环里。


不当的:
$j = 'foo'; // 单字符变量应该只作为for()的循环变量使用 
$Str // 使用了大写字母 $bufferedText // 使用了驼峰命名,而且变量名应该更短,并有清晰的语法含义 
$groupid // 多个词组,应该使用下划线分割 
$name_of_last_city_used // 太长了


适当的: 
for ($j = 0; $j < 10; $j++) 
$str 
$buffer 
$group_id 
$last_city




 【5】字符串
一直使用单引号除非你需要解析变量(Jacklee注:CI核心代码未严格遵循此规范),如果需要解析变量请使用大括号, to prevent greedy token parsing. 如果字符串包含单引号的话你可以使用双引号,这样就不用转义了。


 【6】SQL 查询
MySQL的关键词都是大写: SELECT, INSERT, UPDATE, WHERE, AS, JOIN, ON, IN, 等。


考虑到易读性,把长的查询分成多行,最好是每行只有一个从句或子从句。


 【7】缺省函数参数

适当的时候,提供函数参数的缺省值,这有助于防止因错误的函数调用引起的PHP错误,另外提供常见的备选值可以节省几行代码 例如:
function foo($bar = '', $baz = FALSE) 




























-------------------------------------------------------------------------------
*******************************************************************************








 【1】基准测试类


CodeIgniter 有一个总是有效的基准测试类,能够用来计算两个标记点的时间差.
注意:这个类会被系统自动初始化,因此不需要手动初始化.


1. 使用基准测试类
测试基准类可以在 控制器, 视图,或者 模型.中使用,用法如下:
标记一个开始点
标记一个结束点
运行elapsed_time函数显示结果


2.自定义你的基准测试类
如果你想你的基准数据对评测有效,你的标记点必须设置成对,并且每个标记点必须用_start 和_end结束.每一对标记点的前部必须相同


3.显示总的执行时间
如果你想显示从CodeIgniter启动到浏览器最终输出的时间消耗,简单把这段代码放到你的一个视图模板中
<?php echo $this->benchmark->elapsed_time();?>


4.显示内存消耗
如果你的PHP在安装的时候被配置成--enable-memory-limit,你可以将下面的代码包含到视图文件中显示整个系统的内存使用量:
<?php echo $this->benchmark->memory_usage();?>






 【2】日历类


日历类可以让你动态创建日历.并且用日历模板对创建的日历格式化,100%的控制它的样式.另外,你可以传送数据到你的日历单元格中(比如创建一个链接).




 【3】购物车类
购物车类允许项目被添加到session中,session在用户浏览你的网站期间都保持有效状态。这些项目能够以标准的 "购物车" 格式被检索和显示,并允许用户更新数量或者从购物车中移除项目。
请注意购物车类只提供核心的"购物车"功能。它不提供配送、信用卡授权或者其它处理组件。




1.初始化购物车类



重要:购物车类利用 CodeIgniter 的 Session 类把购物车信息保存到数据库中,所以在使用购物车类之前,你必须根据 Session 类文档中的说明来创建数据库表,并且在 application/config/config.php 文件中把 Session 相关参数设置为使用数据库。


为了在你的控制器构造函数中初始化购物车类,请使用 $this->load->library 函数:
$this->load->library('cart');


一旦加载,就可以通过调用 $this->cart 来使用购物车对象了。


说明: 购物车类会自动加载和初始化Session类,因此除非你在别处要用到session,否则你不需要再次加载Session类。


2.将一个项目添加到购物车
$data = array(
               'id'      => 'sku_123ABC',
               'qty'     => 1,
               'price'   => 39.95,
               'name'    => 'T-Shirt',
               'options' => array('Size' => 'L', 'Color' => 'Red')
            );


$this->cart->insert($data); 


3.将多个项目添加到购物车


4.显示购物车

5.更新购物车
为了更新购物车中的信息,你必须将一个包含了 Row ID 和数量(quantity)的数组传递给 $this->cart->update() 函数:
说明: 如果数量被设置为 0 ,那么购物车中对应的项目会被移除。


6.函数参考

允许你更新购物车中的项目,就像上面所描述的那样。
$this->cart->total();

显示购物车中的总计金额。
$this->cart->total_items();


显示购物车中总共的项目数量。
$this->cart->contents();


7.第三方扩展
修改购物车options数组中内容


通过扩展MY_Cart.php对购物车中options内容进行修改。实际项目中,我们对system目录中购物车类的修改会不符合Codeigniter的开发规范,而使用Codeigniter所提供的购物车类可能会将项目中很多参数带入却无法进行修改,因此只能通过扩展来实现。




 【4】配置类


该配置类提供一种方法来进行偏好设置。该偏好来源于默认的配置文件(application/config/config.php) 或您自己定制的配置文件。
注意:该类已经自动加载而无需手动启用。


1.分析配置文件
默认情况下,CodeIgniter已经有一个主要的配置文件,位于application/config/config.php
您可以添加您自己的配置项目到这个文件里,或者您更愿意让您自己的配置项目与原配置项目分开(假设你需要额外的配置项),简单的创建一个文件并保存到config这个文件夹里就行了。




2.加载配置文件
Note: CodeIgniter 会自动加载主要的配置文件(application/config/config.php), 所以你只需要加载你自己创建的配置文件


有两种方法来加载配置文件
1)手动加载
$this->config->load('filename');
如果你需要加载多个自定义配置文件,一般情况下它们会被合并成一个数组。然而,如果在不同的配置文件中存在同名的索引,那么会发生冲突。为了避免这个问题,你可以把第二个参数设置为 TRUE ,这可以使每个配置文件的内容存储在一个单独的数组中,数组的索引就是配置文件的文件名


2)自动加载
要自动加载配置,它在 application/config/autoload.php


3.获取配置元素
$this->config->item('item name');其中 item name 是 $config 数组中你期望检索的索引


如果你为了用具体的索引来声明配置数组(避免上述索引重名问题)而在函数 $this->config->load 中使用了第二个参数,你可以通过指定函数 $this->config->item() 的第二个参数为特定索引名来获取相关的配置元素


// 载入一个名为 blog_settings.php 的配置文件,然后把它声明为一个索引为 "blog_settings" 的数组
$this->config->load('blog_settings', TRUE);


// 在数组 blog_settings 中获取名为 site_name 的配置元素
$site_name = $this->config->item('site_name', 'blog_settings');


// 另外一种方式:
$blog_config = $this->config->item('blog_settings');
$site_name = $blog_config['site_name'];




4.设置一项元素
$this->config->set_item('item_name', 'item_value');
其中 item_name 是你希望改变的 $config 数组的索引, item_value 是改变后的值.
注意:这里修改的配置元素并不是改变配置文件(application/config/config.php)的值,仅改变当前$this->config->item()方法取到的值






5.环境


一个特定环境的配置文件, 需要按此路径创建或者复制一个文件: application/config/{ENVIRONMENT}/{FILENAME}.php 


例如,要创建一个仅'production'环境的 config.php, 你应该:


   创建文件夹:application/config/production/
   复制现有的 config.php 到上面的文件夹
   编辑 application/config/production/config.php 设定你在'production'环境所需的设置


当你设置 ENVIRONMENT 常量为 'production', 你刚创建的仅'production'环境的 config.php 配置文件将被加载。 


注意: CodeIgniter 会先尝试加载当前环境的配置文件。 如果文件不存在,将加载全局配置文件,例如 (application/config/) 。 这意味着你没有必要把 所有的配置文件放在特定环境的文件夹里, − 仅仅把各环境不同的放进去就行了。


6.辅助函数


$this->config->site_url();该函数得到你网站的 URL,其中包含了你在 config 文件中设置的 "index" 的值。
$this->config->base_url();该函数返回站点的根 URL,可以在这个函数后拼接一个 URL 路径,用以生成 CSS 或图片文件的 URL。

以上两个函数一般通过URL 辅助函数中相应的函数(site_url() 和 base_url())调用。


$this->config->system_url();该函数得到 system 文件夹的 URL






 【5】Email 类


CodeIgniter 拥有强大的 Email 类来提供如下的功能:


多协议:Mail、Sendmail 和 SMTP
多个收件人
抄送和密送
HTML 或纯文本邮件
附件
自动换行
邮件优先级
密送批处理模式,开启时,大邮件列表将被分成小批次密送。
Email 调试工具


1.发送邮件
$this->load->library('email');


$this->email->from('your@example.com', 'Your Name');
$this->email->to('someone@example.com');
$this->email->cc('another@another-example.com');
$this->email->bcc('them@their-example.com');


$this->email->subject('Email Test');
$this->email->message('Testing the email class.');


$this->email->send();


echo $this->email->print_debugger();


2.设置 Email 参数
$config['protocol'] = 'sendmail';
$config['mailpath'] = '/usr/sbin/sendmail';
$config['charset'] = 'iso-8859-1';
$config['wordwrap'] = TRUE;


$this->email->initialize($config);


3.在配置文件中设置 Email 参数


如果您不想使用上述方法设定参数,您可以把它们放入一个配置文件。创建一个新文件名称为email.php ,添加$config数组在该文件中。然后将该文件保存为config/email.php 它将自动的被使用。如果您保存了一个参数配置文件,就不需要使用$this->email->initialize()函数来初始化参数了




4.Email 函数参考
$this->email->from()
设置发件人email地址和名称:
$this->email->from('you@example.com', 'Your Name');


$this->email->to()
设置收件人email地址(多个). 地址可以是单个、一个以逗号分隔的列表或是一个数组:


$this->email->cc()
设置抄送(Carbon Copy / CC) email地址(多个). 类似to()函数, 地址可以是单个、一个以逗号分隔的列表或是一个数组.


$this->email->bcc()
设置暗送(Blind Carbon Copy / BCC) email地址(多个). 类似to()函数, 地址可以是单个、一个以逗号分隔的列表或是一个数组.


$this->email->subject()
设置email主题:
$this->email->subject('This is my subject');


$this->email->message()
设置email正文部分:
$this->email->message('This is my message');


$this->email->clear()
将所有EMAIL的变量清空. 这个方法用于当你在循环中发送邮件时,可以在两次循环中重新设置邮件内容。
foreach ($list as $name => $address)
{
   $this->email->clear();


   $this->email->to($address);
   $this->email->from('your@example.com');
   $this->email->subject('Here is your info '.$name);
   $this->email->message('Hi '.$name.' Here is the info you requested.');
   $this->email->send();
}


如果将参数设为TRUE,附件也会被清空:
$this->email->clear(TRUE);


$this->email->send()
发送EMAIL. 根据发送结果,成功返回TRUE,失败返回FALSE。


$this->email->attach()
添加附件。第一个参数是相对于入口文件的文件路径/文件名(不能写成'/path/photo1.jpg'). 注意: 是路径而不是URL。多次使用该函数可以添加多个附件:
$this->email->attach('path/photo1.jpg');
$this->email->attach('path/photo2.jpg');
$this->email->attach('path/photo3.jpg');
$this->email->send();


$this->email->print_debugger()
返回包含邮件内容的字符串,包括EMAIL头和EMAIL正文。用于调试。






5.取消自动换行
如果你启用自动换行(建议遵循 RFC 822),EMAIL中有一个非常长的链接它将会换行,导致链接不能被收信人直接点击打开。CodeIgniter可以对正文的部分片段避免这种自动换行,比如:
The text of your email that
gets wrapped normally.


{unwrap}http://example.com/a_long_link_that_should_not_be_wrapped.html{/unwrap}


More text that will be
wrapped normally.


将你不想自动换行的部分放入: {unwrap} {/unwrap}中间






 【6】加密类
数据加密类提供了双向数据加密方式。加密类使用 Mcrypt 库加密数据,所以需要 Mcrypt 扩展才能运行。


1.设置你的密钥
为了在 application/config/config.php 文件中保存你的密钥,打开文件设置一下:
$config['encryption_key'] = "YOUR KEY";


2.消息长度
知道加密信息的长度会是原来函数长度的 2.6 倍是很重要的,当你选择你的数据存储机制的时候一定要记住这一点


3.初始化类
加密类也需要在你的控制器函数中用 $this->load->library 函数加载:
$this->load->library('encrypt');
一旦被加载,加密类库就可以这样使用:$this->encrypt




执行数据加密并返回一个字符串。例如:
$msg = 'My secret message';
$encrypted_string = $this->encrypt->encode($msg);




如果你不想使用配置文件中的密钥,你可以通过可选的第二个参数随意设置你的密钥。
$msg = 'My secret message';
$key = 'super-secret-key';
$encrypted_string = $this->encrypt->encode($msg, $key);




解密一个已加密的字符串。例如:
$encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';
$plaintext_string = $this->encrypt->decode($encrypted_string);


如果你不想使用配置文件中的密钥,你可以通过可选的第二个参数随意设置你的密钥。
$msg = 'My secret message';
$key = 'super-secret-key';
$encrypted_string = $this->encrypt->decode($msg, $key);


$this->encrypt->set_cipher();
允许你设置一个 Mcrypt 算法。默认使用 MCRYPT_RIJNDAEL_256。例如:
$this->encrypt->set_cipher(MCRYPT_BLOWFISH);


 【7】文件上传类

1.处理过程

一个上传文件用的表单,允许用户选择一个文件并上传它。
当这个表单被提交,该文件被上传到指定的目录。
同时,该文件将被验证是否符合您设定的要求。
一旦文件上传成功,还要返回一个上传成功的确认窗口。


2.创建上传表单
//<form method="post" action="some_action" enctype="multipart/form-data" />
<?php echo $error;?>
<?php echo form_open_multipart('upload/do_upload');?>


3.上传成功的页面
<ul>
<?php foreach ($upload_data as $item => $value):?>
<li><?php echo $item;?>: <?php echo $value;?></li>
<?php endforeach; ?>
</ul>

4.控制器
 
if ( ! $this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());


$this->load->view('upload_form', $error);

else
{
$data = array('upload_data' => $this->upload->data());//返回你上传文件的所有相关信息的数组


$this->load->view('upload_success', $data);
}


5.初始化文件上传类
$this->load->library('upload');


6.在配置文件里设置偏好设置参数
简单创建一个名为upload.php的文件,添加 $config数组到该文件里,然后保存文件到:config/upload.php,它将被自动加载。当你把配置参数保存到该文件里,你不需要用$this->upload->initialize函数进行手动加


 【8】表单验证


1.设置验证规则
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required');


2.使用一个数组设置验证规则
$config = array(
               array(
                     'field'   => 'username',
                     'label'   => 'Username',
                     'rules'   => 'required'
                  ),
               array(
                     'field'   => 'password',
                     'label'   => 'Password',
                     'rules'   => 'required'
                  ),
               array(
                     'field'   => 'passconf',
                     'label'   => 'Password Confirmation',
                     'rules'   => 'required'
                  ),   
               array(
                     'field'   => 'email',
                     'label'   => 'Email',
                     'rules'   => 'required'
                  )
            );


$this->form_validation->set_rules($config);


3.级联规则(Cascading Rules)
$this->form_validation->set_rules('username', 'Username', 'required|min_length[5]|max_length[12]|is_unique[users.username]');
$this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[users.email]');


4.预处理数据
//trim,xss_clean
$this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[5]|max_length[12]|xss_clean'); 
$this->form_validation->set_rules('password', 'Password', 'trim|required|matches[passconf]|md5');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');


5.重新填充表单(Re-populating the form)
set_value('field name')
现在刷新你的页面并提交表单产生一个错误。你的表单域应该被重新填写了。但是,只能重新填充设置了规则(rules)的表单域。




6.回调: 你自己的验证函数
要调用一个回调函数只需把函数名加一个"callback_"前缀并放在验证规则里。如果你需要在你的回调函数中调用一个额外的参数,你只需要在回调函数后
面用[]把参数(这个参数只能是字符串类型)括起来, 例如: "callback_foo[bar]", 其中bar将成为你的回调函数中的第二个参数.【译者注:第一个参数是input的value值】


7.设置错误信息
所有自身的错误信息位于下面的语言文件中:language/english/form_validation_lang.php
要设置你的自定义信息你可以编辑那个文件,或使用下面的函数:
$this->form_validation->set_message('rule', 'Error Message');//其中 rule 是该条定义规则的名称,Error Message 该规则会显示的错误文本。




8.翻译表单域名称
$this->form_validation->set_rules('first_name', 'lang:first_name', 'required');
$lang['first_name'] = 'First Name';
$this->lang->load('file_name');


9.更改错误定界符
定界符统一更改
$this->form_validation->set_error_delimiters('<div class="error">', '</div>');


定界符单独更改


表单验证类所提供的两种显示错误验证信息的函数,分别可以通过如下方法来设置它们的定界符:
<?php echo form_error('field name', '<div class="error">', '</div>'); ?>


或者:
<?php echo validation_errors('<div class="error">', '</div>'); ?> 


10.独立显示错误


<h5>Username</h5>
<?php echo form_error('username'); ?>
<input type="text" name="username" value="<?php echo set_value('username'); ?>" size="50" />


11.将一系列验证规则保存到一个配置文件


如果想要将验证规则保存在独立的文件中,你首先需要在 application/config/ 文件夹下创建一个名称为 form_validation.php的文件。 然后,将验证规则的配置信息保存在数组 $config 中即可,具体格式如下:
$config = array(
               array(
                     'field'   => 'username',
                     'label'   => 'Username',
                     'rules'   => 'required'
                  ),
               array(
                     'field'   => 'password',
                     'label'   => 'Password',
                     'rules'   => 'required'
                  ),
               array(
                     'field'   => 'passconf',
                     'label'   => 'Password Confirmation',
                     'rules'   => 'required'
                  ),   
               array(
                     'field'   => 'email',
                     'label'   => 'Email',
                     'rules'   => 'required'
                  )
            );
当用户触发 run() 函数时,你的验证规则会自动被控制器加载和调用。
注意:请务必要将数组名称定义成 $config.




12.调用某组验证规则


当同时存在多组规则时,为了调用某一组规则,你需要将组的名字传递给 run() 函数
if ($this->form_validation->run('signup') == FALSE)
{
  $this->load->view('myform');
}
else
{
  $this->load->view('formsuccess');
}


13.将控制器和验证组关联在一起
调用某一特定验证规则组的另一方法(更自动化):将规则组的名称定义为你要关联的控制器类/函数(class/function)名称


14.辅助函数


set_select()


此函数可以帮你设置好菜单里的选项。第一个参数必须包含select菜单的名称, 第二个参数用于放置每一项的值(必填),第三项可选,用于设置一个默认项 (使用TRUE/FALSE设置)。


例如:
<select name="myselect">
<option value="one" <?php echo set_select('myselect', 'one', TRUE); ?> >One</option>
<option value="two" <?php echo set_select('myselect', 'two'); ?> >Two</option>
<option value="three" <?php echo set_select('myselect', 'three'); ?> >Three</option>
</select>


控制器:$this->form_validation->set_rules('myselect');   //thinkPod 编辑于 2011-08-09
set_checkbox()


此函数可以帮你设置好复选框中的选项。第一个参数是checkbox的名称(必填), 第二个参数用于放置每一项的值(必填),第三项可选,用于设置一个默认项 (使用TRUE/FALSE设置)。
<input type="checkbox" name="mycheck[]" value="1" <?php echo set_checkbox('mycheck[]', '1'); ?> />
<input type="checkbox" name="mycheck[]" value="2" <?php echo set_checkbox('mycheck[]', '2'); ?> />
set_radio()


此函数与set_checkbox()函数相同, 用来显示单选按钮被选中的状态。
<input type="radio" name="myradio" value="1" <?php echo set_radio('myradio', '1', TRUE); ?> />
<input type="radio" name="myradio" value="2" <?php echo set_radio('myradio', '2'); ?> />




 【9】FTP 类(未看)
 【10】HTML 表格类(未看)
 【11】图像处理类(未看)


 【12】输入类,系统自动加载此类,不用手动加载。


1.安全过滤(Security Filtering)

如果 $config['allow_get_array'] 的值为FALSE(默认为 TRUE), 销毁全局GET数组。
当 register_globals 被设置为 on 的时候,销毁所有的全局变量。
过滤 GET/POST/COOKIE 数组键,只允许字母-数字(以及一些其它的)字符。
可以过滤跨站脚本攻击 (Cross-site Scripting Hacks) 此功能可全局打开(enabled globally),或者按要求打开。
换行符统一换为 \n(Windows 下为 \r\n)


2.跨站脚本(XSS)过滤
application/config/config.php
$config['global_xss_filtering'] = TRUE;




3.使用 POST, COOKIE, 或 SERVER 数据

$this->input->post()
$this->input->cookie()
$this->input->server()




4.$this->input->post()


第一个参数是所要取得的post中的数据:如果数据不存在,方法将返回 FALSE (布尔值)。
第二个参数是可选的,如果想让取得的数据经过跨站脚本过滤(XSS Filtering),把第二个参数设为TRUE。
$this->input->post('some_data', TRUE);
$this->input->post(NULL, TRUE); // 经过跨站脚本过滤 返回全部 POST 数据
$this->input->post(); // 不经过跨站脚本过滤 返回全部 POST 数据 


5.$this->input->get()


$this->input->get('some_data', TRUE);
$this->input->get(NULL, TRUE); // 经过跨站脚本过滤 返回全部 GET 数据
$this->input->get(); // 不经过跨站脚本过滤 返回全部 GET 数据 


6.$this->input->get_post()
这个方法将会搜索POST和GET方式的数据流,首先以POST方式搜索,然后以GET方式搜索:
$this->input->get_post('some_data', TRUE);


7.$this->input->cookie()
$this->input->cookie('some_data', TRUE); //用来取得cookie数据


8.$this->input->server()
$this->input->server('some_data'); //用来取得server数据


9.$this->input->set_cookie()
设置一个 Cookie 的值。这个函数接收两种形式的参数:数组形式和参数形式:
数组形式


用这种形式的话,第一个参数传递的是一个关联数组:(重要:自己推荐)
$cookie = array(
   'name'   => 'The Cookie Name',
   'value'  => 'The Value',
   'expire' => '86500',
   'domain' => '.some-domain.com',
   'path'   => '/',
   'prefix' => 'myprefix_',
   'secure' => TRUE
);


$this->input->set_cookie($cookie);


说明:


只有 name 和 value 是必须的。可以通过将 expire 设置成空来实现删除 Cookie 的操作。


Cookie 的过期时间是以秒为单位来设置的,他是通过将 Cookie 的存续时间值加上当前系统时间来得到的。切记,expire 的值仅仅设置为Cookie 需要存续的时间长短,请不要将当前的系统时间加上存续时间后再赋给变量。如果将 expire 设置成零,那么 Cookie 仅在浏览器关闭的时候失效。


如果需要设置全站范围内使用的cookie,无论你怎么请求都可以,那么你要把你的网站域名赋给$domain变量,并且需要以英文的句号"."开头,如: .your-domain.com


path通常是不需要设置的,该方法设置path为网站的根目录。


prefix(前缀)只有在为了避免和其它服务器上的相同命名的cookies冲突是才需要使用。


secure(安全)设置选项只有在你想把他设置成安全的cookie时,才需要把secure设置为 TRUE(boolean).




10.$this->input->ip_address()
echo $this->input->ip_address();//返回当前用户的IP。如果IP地址无效,返回0.0.0.0的IP:


11.$this->input->valid_ip($ip)
测试输入的IP地址是不是有效,返回布尔值TRUE或者FALSE。 注意:$this->input->ip_address()自动测试输入的IP地址本身格式是不是有效。


12.$this->input->user_agent()
//返回当前用户正在使用的浏览器的user agent信息。 如果不能得到数据,返回FALSE


13.$this->input->request_headers()
在不支持apache_request_headers()的非Apache环境非常有用。返回请求头(header)数组。
$headers = $this->input->request_headers();


14.$this->input->get_request_header();
返回请求头(request header)数组中某一个元素的值
$this->input->get_request_header('some-header', TRUE);




【13】Javascript 类
【14】装载类
1.$this->load->library('class_name', $config, 'object name')
1)类库文件可以被保存到主libraries目录的子目录下面,或者保存到个人的application/libraries 目录下。 要载入子目录下的文件,只需将路径包含进来就可以了,注意这里说的路径是指相对于libraries目录的路径
可以同时加载多个类(库),只要按照下面的代码为load方法传入一个包含所有要载入的类名的数组即可:
$this->load->library(array('email', 'table'));

2)第二个参数是可选的,作用是允许你有选择性地传递配置参数。一般来说你可以将参数以数组的形式传递过去:
$config = array (
 'mailtype' => 'html',
 'charset'  => 'utf-8,
 'priority' => '1'
      );


$this->load->library('email', $config);


3)给类库分配不同的对象名
第三个参数也是可选的,如果为空,类库通常就会被赋值给一个与类库同名的对象
$this->load->library('session', '', 'my_session');
请注意,当第一个参数使用数组来同时载入多个类时,第三个参数将不起作用。

2.$this->load->view('file_name', $data, true/false)
3.$this->load->model('Model_name');
4.$this->load->database('options', true/false)
5.$this->load->helper('file_name')
6.$this->load->file('filepath/filename', true/false) 
这是一个通用的文件载入函数。在第一个参数中给出文件所在的路径和文件名,对应的文件将会被打开。默认情况下,数据会被发送给浏览器,就如同视图文件一样,但如果你将第二个参数设置为 true (布尔型) 那么数据就会以字符串的形式被返回,而不是发送给浏览器。




7.应用程序包(Package)
应用程序包(Package)可以很便捷的将你的应用部署在独立的目录中,以实现自己整套的类库,模型,辅助函数,配置,文件和语言包。建议将这些应用程序包被放置在application/third_party文件夹
/application/third_party/foo_bar


config/
helpers/
language/
libraries/
models/


$this->load->add_package_path()
添加包指示加载器类使用给定的路径用以请求后续的资源。


$this->load->remove_package_path()
删除的最后一个使用的包路径,你可以调用不带参数的方法。
$this->load->remove_package_path(APPPATH.'third_party/foo_bar/');




 【15】语言类
CodeIgniter的系统(system)目录下的language目录中有一系列的语言文件。 当你需要显示另外一种语言的错误信息或者其它的一些信息时,可以创建自己的语言文件。
语言文件一般存放在 system/language目录下。或者你可以在application目录下创建一个language目录,并把语言文件存放在这里。CodeIgniter会首先查找application/language目录。如果上述目录不存在,或者所要搜索的语言文件不存在,CodeIgniter会搜索全局的 system/language目录。


1.创建语言文件
语言文件的后缀必须为_lang.php。
注意: 为了不和其它文件中的变量重名,最好把一个文件的所有的键值前都加上相同的前缀


2.加载一个语言文件
$this->lang->load('filename', 'english');  //如果没有idiom参数(english),则使用配置文件设置的默认语言
filename是你要加载的语言文件名 (不要带扩展名), language 是那个文件中包含的语言 (比如,英语)
                $this->lang->load(array('filename1','filename2','filename3'));  //同时加载多个语言文件


3.获取一行文本
$this->lang->line('language_key');
        
        4.获取整个文件的数组
                $lang_array = $this->lang->load('filename','english',true);


5.自动加载语言
application/config/autoload.php 
                 
        6.设置默认语言
                application/config/config   $config['language'] = 'english'




【16】输出类


1.$this->output->set_output();告诉CodeIgniter方法执行完毕后,用给定的数据作为输出
2.$this->output->set_content_type();允许你设置页面的mime类型以便于输出 JSON , JPEG, XML 等类型的数据.
3.$this->output->get_output();
使用这个方法,你可以得到将要输出的数据,并把它保存起来,留着它用(我们做新闻类型网站的时候,常常需要生成静态的HTML文件).
4.$this->output->append_output();在输出字符串后附加数据
5.$this->output->set_header();使用此方法,允许你设置将会被发送到浏览器的HTTP协议的标头,作用相当于php的标准函数: header()。
6.$this->output->set_status_header(code, 'text');允许你手动设置服务器状态头(header)


 【17】分页类
1.例子
$this->load->library('pagination');
$config['base_url'] = 'http://example.com/index.php/test/page/';
$config['total_rows'] = 200;这个数字展示了你需要做分页的数据总行数。这个数值是你查询数据库得到的数据总量。
$config['per_page'] = 20;这个数字计划了你每个页面中希望展示的项目数量


$this->pagination->initialize($config);
echo $this->pagination->create_links();


2.在配置文件中设置参数
如果你不喜欢用以上的方法进行偏好设置,你可以简单地创建一个新的文件叫做 pagination.php,把 $config 数组加到这个文件中。把文件保存至 config/pagination.php 可以让它被自动使用。用这个方法,你不再需要使用 $this->pagination->initialize 方法。


3.自定义分页
$config['uri_segment'] = 3;分页方法自动测定你 URI 的哪个部分包含页数
$config['num_links'] = 2;放在你当前页码的前面和后面的“数字”链接的数量
$config['use_page_numbers'] = TRUE;默认分页URL中是显示每页记录数,启用use_page_numbers后显示的是当前页码




4.添加封装标签
如果你希望在整个分页周围围绕一些标签,你可以通过下面的两种方法:
$config['full_tag_open'] = '<p>';把打开的标签放在所有结果的左侧。
$config['full_tag_close'] = '</p>';把关闭的标签放在所有结果的右侧。


5.自定义起始链接
$config['first_link'] = 'First';
你希望在分页的左边显示“第一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE 。
$config['first_tag_open'] = '<div>';“第一页”链接的打开标签。
$config['first_tag_close'] = '</div>';“第一页”链接的关闭标签。


6.自定义结束链接


$config['last_link'] = 'Last';
你希望在分页的右边显示“最后一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE 。
$config['last_tag_open'] = '<div>';“最后一页”链接的打开标签。
$config['last_tag_close'] = '</div>';“最后一页”链接的关闭标签。


7.自定义“下一页”链接

$config['next_link'] = '&gt;';你希望在分页中显示“下一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE 。
$config['next_tag_open'] = '<div>';“下一页”链接的打开标签。
$config['next_tag_close'] = '</div>';“下一页”链接的关闭标签。



8.自定义“上一页”链接
$config['prev_link'] = '&lt;';你希望在分页中显示“上一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE 。
$config['prev_tag_open'] = '<div>';“上一页”链接的打开标签。
$config['prev_tag_close'] = '</div>';“上一页”链接的关闭标签。




9.自定义“当前页”链接
$config['cur_tag_open'] = '<b>';“当前页”链接的打开标签。
$config['cur_tag_close'] = '</b>';“当前页”链接的关闭标签。


10.隐藏“数字”链接
如果你不想显示“数字”链接(比如只显示 “上一页” 和 “下一页”链接)你可以添加如下配置:
$config['display_pages'] = FALSE;
// 不显示“数字”链接 


11.给链接添加 CSS 类
如果你想要给每一个链接添加 CSS 类,你可以添加如下配置:
$config['anchor_class'] = "";
//添加 CSS 类 


【18】安全类
1.XSS 过滤
『cross site script,跨站脚本攻击
它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的
解决方法:内部攻击->过滤带有javascript的输入和特殊字符

$this->security->xss_clean()
$config['global_xss_filtering'] = TRUE;过滤器能自动过滤所有被访问到的POST或者COOKIE数据

第二个可选的参数, is_image, 允许此函数对图片进行检测以发现那些潜在的 XSS 攻击, 这对于保证文件上传的安全非常有用. 当此参数被设置为 TRUE 时, 此函数的返回值不是一个修改过的字符串而是一个布尔值, 如果图片是安全的则返回 TRUE, 相反, 如果图片中包含有潜在的、可能会被浏览器尝试运行的恶意信息, 函数将返回FALSE


if ($this->security->xss_clean($file, TRUE) === FALSE)
{
   // file failed the XSS test
}




2.$this->security->sanitize_filename()
当接受用户所输入的文件名时,这样能避免目录被遍历以及其它安全相关的问题
如果你允许用户所输入的内容中包含有相对路径,例如 file/in/some/approved/folder.txt, 你可以把第二个可选参数 $relative_path 设置为TRUE.




3.跨站请求伪造(Cross-site request forgery,CSRF)
$config['csrf_protection'] = TRUE;


【19】Session 类
Session 类可以使用户在浏览您的网站时,维持他们的状态并跟踪他们的行为


注意:Session类并不使用PHP本身的session,而是使用类自己的session,这样做,可以给开发者提供更大的灵活性。
注意:即使没有使用加密会话,你也需要在配置文件里设置一个加密密钥。这将有助于防止伪造 Session 数据。
注意:Session类是依赖于加密类的,因此您的服务器上必须安装有Mcrypt扩展.


1.初始化 Session
$this->load->library('session');


2.Sessions 的工作机制
当页面载入后,session类就会检查用户的cookie中是否存在有效的session数据。如果session数据不存在(或者已经过期),那么就会创建一个新的session并把他保存在cookie中。如果session数据存在,那么他的信息就会被更新,同时cookie也会被同时更新。每次更新都会重新生成session_id的值。


3.Session数据内容

唯一的用户Session ID (这是一个平均信息量统计出来的非常坚固的随机字符串,使用MD5加密,默认是每五分钟就重新生成一次。
用户的 IP 地址
用户浏览器信息(取前120个字符)
最新的一个活跃时间戳.


4.取得 Session 数据
$this->session->userdata('item');


5.添加自定义的 Session 数据
$this->session->set_userdata($array);
$this->session->set_userdata('some_name', 'some_value');


6.取得所有 Session 数据
$this->session->all_userdata()


7.删除 Session 数据
$this->session->unset_userdata('some_name');
$this->session->unset_userdata($array_items);


8。闪出数据
CodeIgniter 支持 "闪出数据", 或者说Session数据只对下次服务器请求可用, 然后会自动清除

$this->session->set_flashdata('item', 'value');
$this->session->flashdata('item');


如果你发现你需要在一个附加的请求中保留一个闪出数据,你可以使用 keep_flashdata() 这个函数。
$this->session->keep_flashdata('item');


9.将 Session 数据存入数据库


当session 数据在数据库中可用时,每当从用户cookie中发现一个有效的session,一个数据库查询就会被执行以匹配它。如果 session ID 不相配,session 就会被销毁。Session ID永远不会更新,它们只会在一个新的会话创建时生成。


CREATE TABLE IF NOT EXISTS  `ci_sessions` (
 session_id varchar(40) DEFAULT '0' NOT NULL,
 ip_address varchar(45) DEFAULT '0' NOT NULL,
 user_agent varchar(120) NOT NULL,
 last_activity int(10) unsigned DEFAULT 0 NOT NULL,
 user_data text DEFAULT '' NOT NULL,
 PRIMARY KEY (session_id),
 KEY `last_activity_idx` (`last_activity`)
);


$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'ci_sessions';


10.销毁 Session
$this->session->sess_destroy();
如果你只想让某几项而不是所有项被销毁,请使用 unset_userdata().




11.config['sess_match_useragent'] = 是否要按照对应的 User Agent 来读取 session 数据。


【20】Trackback 类
【21】模板解析器类
【22】排版类
【23】单元测试类


【24】URI 类
1.$this->uri->segment(n)
它允许你重新分割一个详细的URI分段。 n 为你想要得到的段数。 分割数按照从左至右的顺序编排。
默认情况下URI没有分段那么该函数返回 FALSE(布尔值)。如果分段信息丢失,Segment函数还有第二个参数用来设置你的默认值。 例如,这样设置后,当发生错误时,函数就会返回数字“0”。

2.$this->uri->slash_segment(n)
可以通过第二个参数(" ","leading","both")给返回的URI参数加上“/”线, 如果不使用该参数,就会在后面增加斜画线


3.$this->uri->uri_to_assoc(n)
index.php/user/search/name/joe/location/UK/gender/male
[array]
(
   'name' => 'joe'
   'location' => 'UK'
   'gender' => 'male'
)


4.$this->uri->uri_string()
返回一个包含完整URI信息的字符串


        
        5.$CI->route->fetch_class   //获取控制器
【25】User-Agent 类
用户代理类提供的功能是,帮助识别是浏览器,还是移动设备或是机器人访问你的站点。另外,你可以得到referrer信息(译注:referrer信息就是访客来源信息,可以参照一般的统计系统来理解),以及语言,和支持的字符集信息


1.初始化类
$this->load->library('user_agent');
一旦加载, 对象就可以使用了: $this->agent


2.用户代理定义
application/config/user_agents.php




3.函数参考
$this->agent->is_browser()根据用户代理是否是一个已知的web浏览器,返回 TRUE/FALSE (boolean)
$this->agent->is_mobile()根据用户代理是否是一个已知的移动设备,返回 TRUE/FALSE (boolean) 
$this->agent->is_robot()根据用户代理是否是机器人,返回 TRUE/FALSE (boolean)
注意:  用户代理类仅包含了最常见的机器人定义。它不是一个完整的机器人清单。如果你觉得有些经常访问你的网站的机器人不在名单中,你可以将它们添加到你的application/config/user_agents.php 文件中.
$this->agent->is_referral()根据用户代理是否是从另一网站链接过来,返回 TRUE/FALSE (boolean)
$this->agent->browser()返回一个字符串,就是浏览你的网站的浏览器名称
$this->agent->version()返回浏览器的版本号
$this->agent->mobile()返回访问你的站点的移动设备名称
$this->agent->robot()返回访问你的站点的机器人名称
$this->agent->platform()返回访问你的站点的操作系统(Linux, Windows, OS X, 等等).
$this->agent->agent_string()返回一个字符串包含所有用户代理信息


【26】XML-RPC 和 XML-RPC 服务器类


【27】Zip 编码类
CodeIgniter的zip编码类允许你创建ZIP压缩文档。文档可以保存在你的桌面或者某个文件夹里


1.初始化
$this->load->library('zip');
一旦加载,ZIP库对象可以用$this->zip来使用


2.使用样例
$name = 'mydata1.txt';
$data = 'A Data String!';


$this->zip->add_data($name, $data);


// 在你的服务器的文件夹里写.zip文件。命名为"my_backup.zip"
$this->zip->archive('/path/to/directory/my_backup.zip');


// 下载此文件到桌面,命名为"my_backup.zip"
$this->zip->download('my_backup.zip'); 


3.函数参考
$this->zip->add_data()添加数据进zip文件里
$this->zip->read_file()允许你压缩一个服务器某处存在的文件。提供一个文件路径,zip类将读取它并添加到存档。如果你想压缩文档保持原来文件的目录结构,可以把第二个参数设置为 TRUE (布尔值)


$this->zip->read_dir()允许你压缩一个服务器某处存在的文件夹(以及它里面的文件和子文件夹)。提供一个文件夹路径,zip类将递归读取它并重新创建添加到存档。 你所提供的路径下面的所有文件都会被压缩进来,也包括所有子文件夹。
默认Zip文件会把第一个参数的完整文件夹路径保存到Zip文件里。如果你想忽略目标路径之前的文件夹结构,你可以传递 FALSE (布尔值) 到第二个参数


$this->zip->archive()将Zip压缩文件写入服务器的一个目录下
$this->zip->download()本函数将使用户从你的服务器上下载一个Zip文件。你必须把你想要使用的文件名作为参数传递给函数


$this->zip->clear_data()Zip编码类会对你的zip数据进行缓存,因此,调用上面的各个函数时,你不需要每次都重新建立Zip文件。然而,如果你要创建多个有着各自不同数据的Zip文件的话,你可以在调用期间清理掉缓存。


【28】缓存适配器

1.支持的缓存适配器(缓存适配器,我们可以理解为一个“通电的插座”;而APC缓存,相当于我们希望插在插座上使用的空调;文本缓存我们可以理解与空调功能相同但效率却完全不同的电风扇。)
Alternative PHP Cache (APC) 缓存
纯文本缓存
Memcached缓存
虚拟缓存




2.函数参考


if ($this->cache->apc->is_supported())
{
    if ($data = $this->cache->apc->get('my_cache'))
    {
 // do things.
    }




$foo = $this->cache->get('my_cached_item');
$this->cache->save('cache_item_id', 'data_to_cache');
$this->cache->delete('cache_item_id');此函数尝试从缓存系统中删除某个指定的缓存项
$this->cache->clean();此函数用来清空所有缓存
var_dump($this->cache->cache_info());此函数将返回所有缓存信息.
var_dump($this->cache->get_metadata('my_cached_item'));此函数将返回缓存系统中指定缓存项的详细信息。

3.支持的缓存适配器
Alternative PHP Cache (APC) 缓存
$this->load->driver('cache');
$this->cache->apc->save('foo', 'bar', 10);


基于文件的缓存
$this->load->driver('cache');
$this->cache->file->save('foo', 'bar', 10);


Memcached 缓存
使用分布式 Memcached 服务器 可以通过配置文件: memcached.php 来配置,该文件在 application/config/ 目录下
$this->load->driver('cache');
$this->cache->memcached->save('foo', 'bar', 10);



【29】数据库类
1.结果查询
$this->db->query($sql)
2.快捷查询
$query = $this->db->get('table_name');
3.快捷插入(insert)
$this->db->insert('mytable', $data);

4.连接你的数据库
“自动连接” 功能将在每一个页面加载时被自动实例化数据库类。


5.链接多个数据库
译注:要连接多个数据库请先设置 config/database.php 中的 $db['xxxxxx']['pconnect'] = FALSE;


6.重新连接 / 保持连接有效
当你正在进行一些重量级的PHP操作(例如处理图片)时,如果超出了数据库服务器的空闲超时限度,你应该考虑在执行更多查询之前使用reconnect()方法来向服务器发送ping命令,这样可以优雅地保持或重新建立连接。
$this->db->reconnect(); 


7.手动关闭连接
虽然CodeIgniter 可以智能的管理并自动关闭数据库连接,你仍可以用下面的方法显式的关闭掉。
$this->db->close();




8.Working with Database prefixes manually


If you have configured a database prefix and would like to prepend it to a table name for use in a native SQL query forexample, then you can use the following:


$this->db->dbprefix('tablename');
// outputs prefix_tablename


If for any reason you would like to change the prefix programatically without needing to create a new connection, you can usethis method:


$this->db->set_dbprefix('newprefix');


9.转义查询
$this->db->escape() 这个函数将会确定数据类型,以便仅对字符串类型数据进行转义。并且,它也会自动把数据用单引号括起来,所以你不必手动添
加单引号


10.封装查询
封装,通过让系统为你组装各个查询语句,能够简化你的查询语法。参加下面的范例:
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";


$this->db->query($sql, array(3, 'live', 'Rick'));


查询语句中的问号会自动被查询函数中位于第二个参数位置的数组中的值所替代。


使用封装查询的第二个好处是所有的值都会被自动转义,形成了较为安全的查询语句。你无需手动地去转义这些数据;控制器将会自动为你进行。
$this->db->dbprefix('tablename');


11.生成查询记录集
result_array()
row_array()
$query->num_rows()//该函数将会返回当前请求的行数。


12.查询辅助函数
$this->db->insert_id()这个ID号是执行数据插入时的ID。
$this->db->affected_rows()当执行写入操作(insert,update等)的查询后,显示被影响的行数。
$this->db->count_all();计算出指定表的总行数并返回。在第一个参数中写入被提交的表名
$this->db->last_query();返回最后运行的查询(是查询语句,不是查询结果)
$this->db->insert_string(); 
$this->db->update_string(); 




【30】Active Record 类
1.$this->db->get();运行选择查询语句并且返回结果集,第二和第三个参数允许你设置一个结果集每页纪录数(limit)和结果集的偏移(offset)
$query = $this->db->get('mytable', 10, 20);
// Produces: SELECT * FROM mytable LIMIT 20, 10 (MySQL语法. 其他数据库在语法上略有不同


2.$this->db->get_where();
跟上面的函数一样,只是它允许你在函数的第二个参数那里添加一个 where 从句,从而不用使用 db->where() 这个函数:
$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset)


3.$this->db->select();如果你要查询表中的所有列,你可以不用写这个函数。省略后,CodeIgniter 会认为你要查询 全部列(SELECT *)


        4.$this->db->select_max();  SELECT MAX(field)
        5.$this->db->select_min();  SELECT MIN(field)
6.$this->db->select_avg();  SELECT AVG(field)
        7.$this->db->select_sum();  SELECT SUM(field)
8.$this->db->from();    查询中的FROM部分可以在 $this->db->get() 函数中指定
        9.$this->db->join();    $this->db->join('comments', 'comments.id = blogs.id', 'left');


        10.$this->db->where();
        {
            1.简单的 key/value 方法:    $this->db->where('name', $name); 
            2.自定义 key/value 方法:    $this->db->where('id <', $id); 
            3.关联数组方法:             $this->db->where($array); 
            4.自定义字符串:             $where = "name='Joe' AND status='boss' OR status='active'";


        }


        11.$this->db->or_where();   // 生成: WHERE name != 'Joe' OR id > 50
        12.$this->db->where_in();   // 生成: WHERE username IN ('Frank', 'Todd', 'James')
        13.$this->db->or_where_in();    // 生成: OR username IN ('Frank', 'Todd', 'James')
        14.$this->db->where_not_in();   // 生成: WHERE username NOT IN ('Frank', 'Todd', 'James')
        15.$this->db->or_where_not_in();    // 生成: OR username NOT IN ('Frank', 'Todd', 'James')
        16.$this->db->like();
        {
            1.简单 key/value 方式:   $this->db->like('title', 'match'); // 生成: WHERE title LIKE '%match%' 
                                    如果你想要控制通配符(%)所出现的位置,你可以使用可选的第三个参数。可用的选项是 'before', 'after' 以及 'both' (这是默认值)。
                                    如果你不想使用百分号(%),你可以给第三个可选的参数传递一个'none'


            2.关联数组方式:
                        $array = array('title' => $match, 'page1' => $match, 'page2' => $match);
                        $this->db->like($array); 
        }


        17.$this->db->or_like();    // WHERE title LIKE '%match%' OR body LIKE '%match%'
        18.$this->db->not_like();   // WHERE title NOT LIKE '%match%
        19.$this->db->or_not_like();    // WHERE title LIKE '%match%' OR body NOT LIKE '%match%'
        20.$this->db->group_by();   // 生成: GROUP BY title
        21.$this->db->distinct();   // 生成: SELECT DISTINCT * FROM table
        22.$this->db->having();
        {
            $this->db->having('user_id = 45'); 
            $this->db->having('user_id', 45); 
            $this->db->having(array('title =' => 'My Title', 'id <' => $id)); 
        }


        23.$this->db->or_having();  // 生成: ORDER BY title DESC 
        24.$this->db->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 
        }
        
        25.$this->db->limit();  
        {
            1.$this->db->limit(10); // 生成: LIMIT 10
            2.第二个参数设置的是结果偏移量。 $this->db->limit(10, 20);  // 生成: LIMIT 20, 10 (仅限MySQL中。其它数据库有稍微不同的语法)
        }


        26.$this->db->count_all_results();  允许你获得某个特定的Active Record查询所返回的结果数量
        
        27.$this->db->insert();     //$this->db->insert('mytable', $data); 
        28$this->db->insert_batch();    插入多条记录


        29.$this->db->set();
        {
            
                本函数使您能够设置inserts(插入)或updates(更新)值。
                set() 也接受可选的第三个参数($escape),如果此参数被设置为 FALSE,就可以阻止数据被转义。为了说明这种差异,这里将对 包含转义参数 和 不包含转义参数 这两种情况的 set() 函数做一个说明。
                
                $this->db->set('field', 'field+1', FALSE);
                $this->db->insert('mytable');
                // 得到 INSERT INTO mytable (field) VALUES (field+1)


                $this->db->set('field', 'field+1');
                $this->db->insert('mytable');
                // 得到 INSERT INTO mytable (field) VALUES ('field+1')


                你也可以将一个关联数组传递给本函数:
                $array = array('name' => $name, 'title' => $title, 'status' => $status);


                $this->db->set($array);
                $this->db->insert('mytable'); 
        }


        30.$this->db->update();
        {
            $this->db->where('id', $id);
            $this->db->update('mytable', $data); 


            $this->db->update('mytable', $data, "id = 4");
            $this->db->update('mytable', $data, array('id' => $id));
        }


        31.$this->db->update_batch();
        {
            
            $data = array(
               array(
                  'title' => 'My title' ,
                  'name' => 'My Name 2' ,
                  'date' => 'My date 2'
               ),
               array(
                  'title' => 'Another title' ,
                  'name' => 'Another Name 2' ,
                  'date' => 'Another date 2'
               )
            );


            $this->db->update_batch('mytable', $data, 'title');


            // Produces:
            // UPDATE `mytable` SET `name` = CASE
            // WHEN `title` = 'My title' THEN 'My Name 2'
            // WHEN `title` = 'Another title' THEN 'Another Name 2'
            // ELSE `name` END,
            // `date` = CASE
            // WHEN `title` = 'My title' THEN 'My date 2'
            // WHEN `title` = 'Another title' THEN 'Another date 2'
            // ELSE `date` END
            // WHERE `title` IN ('My title','Another title')
        }


        32.$this->db->delete();
        {
            $this->db->delete('mytable', array('id' => $id)); 
             
            $this->db->where('id', $id);
            $this->db->delete('mytable'); 
        }


        33.$this->db->empty_table();    // DELETE FROM mytable


        34.$this->db->truncate();   // TRUNCATE TABLE mytable 


        35.链式方法/*import*/
        {
            $this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);
            //省略掉多个$this->db
        }


        36.Active Record 缓存
        {
            $this->db->start_cache()
            $this->db->stop_cache()
            $this->db->flush_cache()
        }




    【31】事务
    {
        1.运行事务
        {
            $this->db->trans_start();
            $this->db->query('一条SQL查询...');
            $this->db->query('另一条查询...');
            $this->db->query('还有一条查询...');
            $this->db->trans_complete(); 
        }


        2.严格模式(Strict Mode)
        {
            默认情况下, CodeIgniter 以严格模式运行所有事务。当严格模式被启用时, 如果你正在运行多组的事务, 只要有一组
            失败, 所有组都会被回滚。如果严格模式被禁用, 每一组都被视为独立的组, 这意味着其中一个组的失败不会影响其它组。
            
            $this->db->trans_strict(FALSE); //禁用严格模式
        }


        3.管理错误信息
        {
            如果你在你的 config/database.php 文件中启用了错误报告, 当提交没有成功时, 你会看到一条标准的错误信息。
            如果调试被关闭, 你可以通过这种方式来管理你的错误信息:
            if ($this->db->trans_status() === FALSE)
            {
                // 生成一条错误信息... 或者使用 log_message() 函数来记录你的错误信息
            } 
        }


        4.禁用事务
        {
            当你使用 $this->db->trans_start() 时, 事务就已经被自动启用了。如果你想要禁用事务, 你可以使用 
            $this->db->trans_off() 来实现
        }


        5.测试模式(Test Mode)
        {
            你可以选择性地将事务系统设置到 "测试模式" , 这将导致你的查询被回滚 -- 尽管查询会生成有效结果。要使用测试
            模式, 只需将 $this->db->trans_start() 函数的第一个参数设置为 TRUE 即可
            
            $this->db->trans_start(TRUE); // 查询将被回滚
        }


        6.手动运行事务
        {
             $this->db->trans_begin();


            $this->db->query('AN SQL QUERY...');
            $this->db->query('ANOTHER QUERY...');
            $this->db->query('AND YET ANOTHER QUERY...');


            if ($this->db->trans_status() === FALSE)
            {
                $this->db->trans_rollback();
            }
            else
            {
                $this->db->trans_commit();
            }
        }






    }


    【32】.表数据
    {
        1.$this->db->list_tables(); 返回一个包含当前连接数据库中所有表名称的数组
        2.$this->db->table_exists();判断指定表是否存在很有用
    }


    【33】.字段数据
    {
        1.$this->db->list_fields()  返回一个包含字段名称的数组
        2.$this->db->field_exists()
        3.$this->db->field_data()
    }


    【34】.数据库缓存类: 数据库缓存类允许你把数据库查询结果保存在文本文件中以减少数据库访问。
    {
        1.激活缓存
        {
            激活缓存需要三步:


            在服务器上创建一个可写的目录以便保存缓存文件。
            在文件 application/config/database.php 中$db['xxxx']['cachedir'] 设置其目录。
            激活缓存特性,可以在文件 application/config/database.php 中设置全局选项$db['xxxx']['cache_on']='TRUE',也可以用以本页下面的方法手动设置。


        }


        2.$this->db->cache_on()  /   $this->db->cache_off() 可手动设置缓存开关
        3.$this->db->cache_delete() $this->db->cache_delete('/blog', 'comments');
        4.$this->db->cache_delete_all()
    }




    【35】数据库维护类
    {


        1.初始化    $this->load->dbforge()
            $this->dbforge->create_database('db_name')
            $this->dbforge->drop_database('db_name')


        2.创建和删除表
        {
            1.添加字段  $this->dbforge->add_field()
            2.创建表    $this->dbforge->create_table('table_name');
            3.删除表    $this->dbforge->drop_table('table_name');
        }


        3.修改表
        {
            1.$this->dbforge->add_column()
            2.$this->dbforge->drop_column()
            3.$this->dbforge->modify_column()
        }
    }


    【36】数据库工具类
    {
        1.加载工具类:  $this->load->dbutil()
        2.$this->dbutil->list_databases()
        3.$this->dbutil->database_exists();
        4.$this->dbutil->backup()
    }
0 0
原创粉丝点击