CodeIgniter 用户指南

CodeIgniter 用户指南 版本 1.7.2

 编辑文档、查看近期更改请 登录 或 注册 　找回密码 目录页
CodeIgniter 中国首页 › CodeIgniter 用户指南
搜索用户指南
查看原文

欢迎使用 CodeIgniter

CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包。它提供一套丰富的标准库以及简单的接口和逻辑结构，其目的是使开发人员更快速地进行项目开发。使用 CodeIgniter 可以减少代码的编写量，并将你的精力投入到项目的创造性开发上。

CodeIgniter 是为谁准备的？

CodeIgniter 就是你所需要的，如果...

  • 你想要一个小巧的框架。
  • 你需要出色的性能。
  • 你需要广泛兼容标准主机上的各种 PHP 版本和配置（例如 PHP4）。
  • 你想要一个几乎只需 0 配置的框架。
  • 你想要一个不需使用命令行的框架。
  • 你想要一个不需坚守限制性编码规则的框架。
  • 你对 PEAR 这种大规模集成类库不感兴趣。
  • 你不希望被迫学习一门模板语言（虽然可以选择你喜欢的模板解析器）。
  • 你不喜欢复杂，热爱简单。
  • 你需要清晰、完整的文档。

翻译贡献者: Hex
最后修改: 2009-02-22 00:22:48

页首

CodeIgniter · 版权所有 © 2006-2009 · Ellislab, Inc.

中文化: CodeIgniter 中国 · 制作: Hex · 版本: 1.10 · 鸣谢: 子非鱼


CodeIgniter 中国首页 › 用户指南首页 › 目录
查看原文

目录

基本信息

  • 服务器要求
  • 许可协议
  • 变更记录
  • 关于 CodeIgniter

安装

  • 下载 CodeIgniter
  • 安装指导
  • 从老版本升级
  • 疑难解答

介绍

  • 开始
  • CodeIgniter 是什么？
  • CodeIgniter 速记表
  • 支持特性
  • 应用程序流程图
  • 模型-视图-控制器
  • 架构目标

常规主题

  • CodeIgniter URL
  • 控制器
  • 保留字
  • 视图
  • 模型
  • 辅助函数
  • 插件
  • 使用 CodeIgniter 类库
  • 创建你自己的类库
  • 创建核心类
  • 钩子 - 扩展核心
  • 自动装载资源
  • 公共函数
  • 脚手架(Scaffolding)
  • URI 路由
  • 错误处理
  • 缓存
  • 评测你的应用程序
  • 管理应用程序
  • PHP 替代语法
  • 安全
  • 开发规范

类库参考

  • 基准测试类
  • 日历类
  • 购物车类
  • 配置类
  • 数据库类
  • Email 类
  • 加密类
  • 文件上传类
  • 表单验证类
  • FTP 类
  • HTML 表格类
  • 图像处理类
  • 输入和安全类
  • 装载器类
  • 语言类
  • 输出类
  • 分页类
  • Session 类
  • Trackback 类
  • 模板解析器类
  • 排版类
  • 单元测试类
  • URI 类
  • User-Agent 类
  • XML-RPC 类
  • Zip 编码类

辅助函数参考

  • 数组辅助函数
  • 兼容性辅助函数
  • Cookie 辅助函数
  • 日期辅助函数
  • 目录辅助函数
  • 下载辅助函数
  • Email 辅助函数
  • 文件辅助函数
  • 表单辅助函数
  • HTML 辅助函数
  • Inflector 辅助函数
  • 语言辅助函数
  • 数字辅助函数
  • 路径辅助函数
  • 安全辅助函数
  • 表情辅助函数
  • 字符串辅助函数
  • 文本辅助函数
  • 排版辅助函数
  • URL 辅助函数
  • XML 辅助函数

附加资源

  • 快速参考图
  • 搜索引擎
  • 中文社区
  • 英文社区
  • 社区 Wiki

翻译贡献者: Hex
最后修改: 2009-09-12 15:48:49

页首


CodeIgniter 中国首页 › 用户指南首页 › 服务器要求

服务器要求

  • PHP 版本 4.3.2 或更新的版本。
  • 大多数 Web 应用程序需要数据库。当前支持的数据库为：MySQL (4.1+), MySQLi, MS SQL, Postgres, Oracle, SQLite 和 ODBC。

翻译贡献者: Hex, nameleq
最后修改: 2009-02-21 17:51:32

页首 · 用户指南首页 · 下一个主题: 许可协议


CodeIgniter 中国首页 › 用户指南首页 › 安装 › 下载 CodeIgniter

下载 CodeIgniter

  • CodeIgniter V 1.7.2（最新版本）
  • CodeIgniter V 1.7.1
  • CodeIgniter V 1.7.0
  • CodeIgniter V 1.6.3
  • CodeIgniter V 1.6.2
  • CodeIgniter V 1.6.1
  • CodeIgniter V 1.6.0
  • CodeIgniter V 1.5.4
  • CodeIgniter V 1.5.3
  • CodeIgniter V 1.5.2
  • CodeIgniter V 1.5.1
  • CodeIgniter V 1.4.1
  • CodeIgniter V 1.3.3
  • CodeIgniter V 1.3.2
  • CodeIgniter V 1.3.1
  • CodeIgniter V 1.3
  • CodeIgniter V 1.2
  • CodeIgniter V 1.1
  • CodeIgniter V 1.0

Subversion 服务器

Subversion 是一个版本控制系统。

你可以通过 http://dev.ellislab.com/svn/CodeIgniter/trunk 访问公共 Subversion，请注意：通过这个代码仓库取得的文件，我们不能保证代码完全实现功能。

从 1.6.1 版开始，版本快照（tags）也可以通过 Subversion 服务器访问，地址：http://dev.ellislab.com/svn/CodeIgniter/tags。

翻译贡献者: Hex, thestar
最后修改: 2009-09-12 15:20:25

上一个主题: 关于 CodeIgniter · 页首 · 用户指南首页 · 下一个主题: 安装指导


CodeIgniter 中国首页 › 用户指南首页 › 安装 › 安装指导

安装指导

CodeIgniter 安装分为四个步骤：

  1. 解压缩安装包。
  2. 把 CodeIgniter 文件夹和里面的文件上传到你的服务器。通常 index.php 在根目录。
  3. 用任何文本编辑器打开 application/config/config.php 去设置你的网站根 URL。如果你打算使用加密或 Session，请设置你的加密密钥。
  4. 如果你打算使用数据库，用任何文本编辑器打开 application/config/database.php 去设置你的数据库参数。

如果你希望通过隐藏 CodeIgniter 文件的位置来增加安全性，你可以修改 system 目录的名字，把它改成任何你想改的。 如果已经修改了名字，你必须打开你主目录下面的 index.php 文件设置里面的 $system_folder 变量，把它设成你新改的名字。

以上就是全部安装过程！

如果你刚刚接触 CodeIgniter，请阅读用户指南的开始部分，开始学习如何构造动态的 PHP 应用。让我们享受这个过程吧！

如果下载CodeIgniter之后，对于其中的英文注释看不明白，推荐您到CodeIgniter中国社区学习一下，很多朋友都从那里学到了许多知识，相信您会得到得更多！

翻译贡献者: Hex, thestar
最后修改: 2009-02-22 01:20:47

上一个主题: 关于 CodeIgniter · 页首 · 用户指南首页 · 下一个主题: 从老版本升级


CodeIgniter 中国首页 › 用户指南首页 › 安装 › 疑难解答

疑难解答

如果你发现不管你在 URL 里面写什么都只是出现缺省页面的话，有可能是你的服务器不支持 PATH_INFO 变量，它被用来提供搜索引擎友好的 URL。解决这个问题的第一步是打开 application/config/config.php 文件，查找 URI Protocol 信息。在那里推荐你去尝试一些其他的设置方法。如果这些方法都无效，你就需要让 CodeIgniter 去强行加一个问号去标记你的 URL。为了做到这点，打开你的 application/config/config.php 文件把里面的:

$config['index_page'] = "index.php";

修改成这样:

$config['index_page'] = "index.php?";

翻译贡献者: Hex
最后修改: 2009-02-21 23:10:43

上一个主题: 从老版本升级 · 页首 · 用户指南首页 · 下一个主题: CodeIgniter 是什么？


CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从老版本升级

从老版本升级

请阅读相应的升级注意事项。

  • 从 1.7.1 升级到 1.7.2
  • 从 1.7.0 升级到 1.7.1
  • 从 1.6.3 升级到 1.7.0
  • 从 1.6.2 升级到 1.6.3
  • 从 1.6.1 升级到 1.6.2
  • 从 1.6.0 升级到 1.6.1
  • 从 1.5.4 升级到 1.6.0
  • 从 1.5.3 升级到 1.5.4
  • 从 1.5.2 升级到 1.5.3
  • 从 1.5.0 或 1.5.1 升级到 1.5.2
  • 从 1.4.1 升级到 1.5.0
  • 从 1.4.0 升级到 1.4.1
  • 从 1.3.3 升级到 1.4.0
  • 从 1.3.2 升级到 1.3.3
  • 从 1.3.1 升级到 1.3.2
  • 从 1.3 升级到 1.3.1
  • 从 1.2 升级到 1.3
  • 从 1.1 升级到 1.2
  • 从 Beta 1.0 升级到 Beta 1.1

翻译贡献者: Hex
最后修改: 2009-09-12 13:21:14

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.1 升级到 1.2 最终版

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.1 升级到 1.2 最终版
搜索用户指南
查看原文

Upgrading From Beta 1.1 to Final 1.2

To upgrade to Version 1.2 please replace the following directories with the new versions:

Note: If you have any custom developed files in these folders please make copies of them first.

  • drivers
  • helpers
  • init
  • language
  • libraries
  • plugins
  • scaffolding

Please also replace your local copy of the user guide with the new version.

翻译贡献者: Hex
最后修改: 2009-02-21 23:13:51

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.2 升级到 1.3

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.2 升级到 1.3
搜索用户指南
查看原文

Upgrading from 1.2 to 1.3

Note: The instructions on this page assume you are running version 1.2. If you have not upgraded to that version please do so first.

Before performing an update you should take your site offline by replacing the index.php file with a static one.

Step 1: Update your CodeIgniter files

Replace the following directories in your "system" folder with the new versions:

Note: If you have any custom developed files in these folders please make copies of them first.

  • application/models/ (new for 1.3)
  • codeigniter (new for 1.3)
  • drivers
  • helpers
  • init
  • language
  • libraries
  • plugins
  • scaffolding

Step 2: Update your error files

Version 1.3 contains two new error templates located in application/errors, and for naming consistency the other error templates have been renamed.

If you have not customized any of the error templates simply replace this folder:

  • application/errors/

If you have customized your error templates, rename them as follows:

  • 404.php = error_404.php
  • error.php = error_general.php
  • error_db.php (new)
  • error_php.php (new)

Step 3: Update your index.php file

Please open your main index.php file (located at your root). At the very bottom of the file, change this:

require_once BASEPATH.'libraries/Front_controller'.EXT;

To this:

require_once BASEPATH.'codeigniter/CodeIgniter'.EXT;

Step 4: Update your config.php file

Open your application/config/config.php file and add these new items:

/*
|------------------------------------------------
| URL suffix
|------------------------------------------------
|
| This option allows you to add a suffix to all URLs.
| For example, if a URL is this:
|
| example.com/index.php/products/view/shoes
|
| You can optionally add a suffix, like ".html",
| making the page appear to be of a certain type:
|
| example.com/index.php/products/view/shoes.html
|
*/
$config['url_suffix'] = "";

/*
|------------------------------------------------
| Enable Query Strings
|------------------------------------------------
|
| By default CodeIgniter uses search-engine and
| human-friendly segment based URLs:
|
| example.com/who/what/where/
|
| You can optionally enable standard query string
| based URLs:
|
| example.com?who=me&what;=something&where;=here
|
| Options are: TRUE or FALSE (boolean)
|
| The two other items let you set the query string "words"
| that will invoke your controllers and functions:
| example.com/index.php?c=controller&m;=function
|
*/
$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';

Step 5: Update your database.php file

Open your application/config/database.php file and add these new items:

$db['default']['dbprefix'] = "";
$db['default']['active_r'] = TRUE;

Step 6: Update your user guide

Please also replace your local copy of the user guide with the new version.

翻译贡献者: Hex
最后修改: 2009-02-21 23:15:17

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.3 升级到 1.3.1

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.3 升级到 1.3.1
搜索用户指南
查看原文

Upgrading from 1.3 to 1.3.1

Note: The instructions on this page assume you are running version 1.3. If you have not upgraded to that version please do so first.

Before performing an update you should take your site offline by replacing the index.php file with a static one.

Step 1: Update your CodeIgniter files

Replace the following directories in your "system" folder with the new versions:

Note: If you have any custom developed files in these folders please make copies of them first.

  • drivers
  • init/init_unit_test.php (new for 1.3.1)
  • language/
  • libraries
  • scaffolding

Step 2: Update your user guide

Please also replace your local copy of the user guide with the new version.

翻译贡献者: Hex
最后修改: 2009-02-21 23:16:05

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.3.1 升级到 1.3.2

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.3.1 升级到 1.3.2
搜索用户指南
查看原文

Upgrading from 1.3.1 to 1.3.2

Note: The instructions on this page assume you are running version 1.3.1. If you have not upgraded to that version please do so first.

Before performing an update you should take your site offline by replacing the index.php file with a static one.

Step 1: Update your CodeIgniter files

Replace the following directories in your "system" folder with the new versions:

Note: If you have any custom developed files in these folders please make copies of them first.

  • drivers
  • init
  • libraries

Step 2: Update your user guide

Please also replace your local copy of the user guide with the new version.

翻译贡献者: Hex
最后修改: 2009-02-21 23:16:37

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.3.2 升级到 1.3.3

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.3.2 升级到 1.3.3
搜索用户指南
查看原文

Upgrading from 1.3.2 to 1.3.3

Note: The instructions on this page assume you are running version 1.3.2. If you have not upgraded to that version please do so first.

Before performing an update you should take your site offline by replacing the index.php file with a static one.

Step 1: Update your CodeIgniter files

Replace the following directories in your "system" folder with the new versions:

Note: If you have any custom developed files in these folders please make copies of them first.

  • codeigniter
  • drivers
  • helpers
  • init
  • libraries

Step 2: Update your Models

If you are NOT using CodeIgniter's Models feature disregard this step.

As of version 1.3.3, CodeIgniter does not connect automatically to your database when a model is loaded. This allows you greater flexibility in determining which databases you would like used with your models. If your application is not connecting to your database prior to a model being loaded you will have to update your code. There are several options for connecting, as described here.

Step 3: Update your user guide

Please also replace your local copy of the user guide with the new version.

翻译贡献者: Hex
最后修改: 2009-02-21 23:17:07

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.3.3 升级到 1.4.0

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.3.3 升级到 1.4.0
搜索用户指南
查看原文

Upgrading from 1.3.3 to 1.4.0

Note: The instructions on this page assume you are running version 1.3.3. If you have not upgraded to that version please do so first.

Before performing an update you should take your site offline by replacing the index.php file with a static one.

Step 1: Update your CodeIgniter files

Replace the following directories in your "system" folder with the new versions:

Note: If you have any custom developed files in these folders please make copies of them first.

  • application/config/hooks.php
  • application/config/mimes.php
  • codeigniter
  • drivers
  • helpers
  • init
  • language
  • libraries
  • scaffolding

Step 2: Update your config.php file

Open your application/config/config.php file and add these new items:

/*
|--------------------------------------------------------------------------
| Enable/Disable System Hooks
|--------------------------------------------------------------------------
|
| If you would like to use the "hooks" feature you must enable it by
| setting this variable to TRUE (boolean).  See the user guide for details.
|
*/
$config['enable_hooks'] = FALSE;

/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify which characters are permitted within your URLs.
| When someone tries to submit a URL with disallowed characters they will
| get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible.  By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_-';

Step 3: Update your user guide

Please also replace your local copy of the user guide with the new version.

翻译贡献者: Hex
最后修改: 2009-02-21 23:17:37

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.4.0 升级到 1.4.1

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.4.0 升级到 1.4.1
搜索用户指南
查看原文

Upgrading from 1.4.0 to 1.4.1

Note: The instructions on this page assume you are running version 1.4.0. If you have not upgraded to that version please do so first.

Before performing an update you should take your site offline by replacing the index.php file with a static one.

Step 1: Update your CodeIgniter files

Replace the following directories in your "system" folder with the new versions:

Note: If you have any custom developed files in these folders please make copies of them first.

  • codeigniter
  • drivers
  • helpers
  • libraries

Step 2: Update your config.php file

Open your application/config/config.php file and add this new item:

/*
|--------------------------------------------------------------------------
| Output Compression
|--------------------------------------------------------------------------
|
| Enables Gzip output compression for faster page loads.  When enabled,
| the output class will test whether your server supports Gzip.
| Even if it does, however, not all browsers support compression
| so enable only if you are reasonably sure your visitors can handle it.
|
| VERY IMPORTANT:  If you are getting a blank page when compression is enabled it
| means you are prematurely outputting something to your browser. It could
| even be a line of whitespace at the end of one of your scripts.  For
| compression to work, nothing can be sent before the output buffer is called
| by the output class.  Do not "echo" any values with compression enabled.
|
*/
$config['compress_output'] = FALSE;

Step 3: Rename an Autoload Item

Open the following file: application/config/autoload.php

Find this array item:

$autoload['core'] = array();

And rename it to this:

$autoload['libraries'] = array();

This change was made to improve clarity since some users were not sure that their own libraries could be auto-loaded.

Step 4: Update your user guide

Please also replace your local copy of the user guide with the new version.

翻译贡献者: Hex
最后修改: 2009-02-21 23:18:04

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.4.1 升级到 1.5.0

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.4.1 升级到 1.5.0
搜索用户指南
查看原文

Upgrading from 1.4.1 to 1.5.0

Note: The instructions on this page assume you are running version 1.4.1. If you have not upgraded to that version please do so first.

Before performing an update you should take your site offline by replacing the index.php file with a static one.

Step 1: Update your CodeIgniter files

Replace these files and directories in your "system" folder with the new versions:

  • application/config/user_agents.php (new file for 1.5)
  • application/config/smileys.php (new file for 1.5)
  • codeigniter/
  • database/ (new folder for 1.5. Replaces the "drivers" folder)
  • helpers/
  • language/
  • libraries/
  • scaffolding/

Note: If you have any custom developed files in these folders please make copies of them first.

Step 2: Update your database.php file

Open your application/config/database.php file and add these new items:

$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';

Step 3: Update your config.php file

Open your application/config/config.php file and ADD these new items:

/*
|--------------------------------------------------------------------------
| Class Extension Prefix
|--------------------------------------------------------------------------
|
| This item allows you to set the filename/classname prefix when extending
| native libraries.  For more information please see the user guide:
|
| http://www.codeigniter.com/user_guide/general/core_classes.html
| http://www.codeigniter.com/user_guide/general/creating_libraries.html
|
*/
$config['subclass_prefix'] = 'MY_';

/*
|--------------------------------------------------------------------------
| Rewrite PHP Short Tags
|--------------------------------------------------------------------------
|
| If your PHP installation does not have short tag support enabled CI
| can rewrite the tags on-the-fly, enabling you to utilize that syntax
| in your view files.  Options are TRUE or FALSE (boolean)
|
*/
$config['rewrite_short_tags'] = FALSE;

In that same file REMOVE this item:

/*
|--------------------------------------------------------------------------
| Enable/Disable Error Logging
|--------------------------------------------------------------------------
|
| If you would like errors or debug messages logged set this variable to
| TRUE (boolean).  Note: You must set the file permissions on the "logs" folder
| such that it is writable.
|
*/
$config['log_errors'] = FALSE;

Error logging is now disabled simply by setting the threshold to zero.

Step 4: Update your main index.php file

If you are running a stock index.php file simply replace your version with the new one.

If your index.php file has internal modifications, please add your modifications to the new file and use it.

Step 5: Update your user guide

Please also replace your local copy of the user guide with the new version.

翻译贡献者: Hex
最后修改: 2009-02-21 23:18:34

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.5.0 升级到 1.5.2

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.5.0 升级到 1.5.2
搜索用户指南
查看原文

Upgrading from 1.5.0 to 1.5.2

Note: The instructions on this page assume you are running version 1.5.0 or 1.5.1. If you have not upgraded to that version please do so first.

Before performing an update you should take your site offline by replacing the index.php file with a static one.

Step 1: Update your CodeIgniter files

Replace these files and directories in your "system" folder with the new versions:

  • system/helpers/download_helper.php
  • system/helpers/form_helper.php
  • system/libraries/Table.php
  • system/libraries/User_agent.php
  • system/libraries/Exceptions.php
  • system/libraries/Input.php
  • system/libraries/Router.php
  • system/libraries/Loader.php
  • system/libraries/Image_lib.php
  • system/language/english/unit_test_lang.php
  • system/database/DB_active_rec.php
  • system/database/drivers/mysqli/mysqli_driver.php
  • codeigniter/

Note: If you have any custom developed files in these folders please make copies of them first.

Step 2: Update your user guide

Please also replace your local copy of the user guide with the new version.

翻译贡献者: Hex
最后修改: 2009-02-21 23:18:56

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.5.2 升级到 1.5.3

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.5.2 升级到 1.5.3
搜索用户指南
查看原文

从1.5.2 升级到 1.5.3

在执行升级操作前，你应该把index.php替换成一个静态文件，从而把你的站点断线。

第一步: 升级你的CodeIgniter文件

在你的"system"目录里面用新版本替换这些文件和目录：

  • system/database/drivers
  • system/helpers
  • system/libraries/Input.php
  • system/libraries/Loader.php
  • system/libraries/Profiler.php
  • system/libraries/Table.php

注意: 如果在这些目录里面有你自己开发的文件，请事先备份好。

第二步：升级你的用户指南

请用新的版本用户指南替换你本地的用户指南.

翻译贡献者: Hex, moonster
最后修改: 2009-02-21 23:19:20

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.5.3 升级到 1.5.4

从 1.5.3 升级到 1.5.4

在执行升级操作前，你应该把index.php替换成一个静态文件，从而把你的站点断线。

第一步: 升级你的CodeIgniter文件

在你的"system"目录里面用新版本替换这些文件和目录：

  • system/application/config/mimes.php
  • system/codeigniter
  • system/database
  • system/helpers
  • system/libraries
  • system/plugins

注意: 如果在这些目录里面有你自己开发的文件，请事先备份好。

第二步: 增加charset到你的config.php

增加下面内容到system/application/config/config.php

/*
|--------------------------------------------------------------------------
| Default Character Set
|--------------------------------------------------------------------------
|
| This determines which character set is used by default in various methods
| that require a character set to be provided.
|
*/
$config['charset'] = "UTF-8";

第三步：自动加载语言文件

如果你想自动加载任何语言文件, 在system/application/config/autoload.php里面添加下面的行：

$autoload['language'] = array();

第四步: 升级你的用户指南

使用新版本替换你本地的用户指南。

翻译贡献者: Hex
最后修改: 2009-02-21 23:19:44

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.5.4 升级到 1.6.0

从 1.5.4 升级到 1.6.0

升级之前你需要断开网络，这样才能用静态文件index.php替换你原来的文件.

第一步: 更新你的CodeIgniter文件

在你的"system"目录下，用新版本的文件替换你原来的文件夹和文件:

  • system/codeigniter
  • system/database
  • system/helpers
  • system/libraries
  • system/plugins
  • system/language

Note:如果在这个目录下有你自定义的文件，需要在更新之前做一下备份.

第二步:在你的配置文件config.php中添加time_to_update

使用其他的session配置变量添加如下内容到system/application/config/config.php文件中

$config['sess_time_to_update'] = 300;

第三步: 添加 $autoload['model']

添加如下内容到 system/application/config/autoload.php

/*
| -------------------------------------------------------------------
| Auto-load Model files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['model'] = array('my_model');
|
*/

$autoload['model'] = array();

第四步: 修改你的数据库配置文件database.php

把下面的变化添加到system/application/config/database.php这个文件中:

在数据库配置选项的最上面添加变量$active_group

$active_record = TRUE;

删除如下数据库配置选项:

$db['default']['active_r'] = TRUE;

在你的配置文件database.php中添加下列内容：

$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

第五步: 更新你的用户参考手册

直接用新版本的替换旧版本即可.

翻译贡献者: Hex, zhupeng
最后修改: 2009-09-12 15:22:35

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.6.0 升级到 1.6.1

从 1.6.0 升级到 1.6.1

在执行升级操作前，你应该把 index.php 替换成一个静态文件，从而把你的站点变成离线状态。

步骤 1：更新你的 CodeIgniter 文件

用新版本替换“system”文件夹中的这些文件和目录：

  • system/codeigniter
  • system/database
  • system/helpers
  • system/language
  • system/libraries

注意：如果在这些目录里面有你自己开发的文件，请事先备份好。

步骤 2：更新你的用户指南

请用新版本替换你本地的用户指南。

翻译贡献者: analyzer, Hex
最后修改: 2009-02-21 23:23:21

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.6.1 升级到 1.6.2

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.6.1 升级到 1.6.2
搜索用户指南
查看原文

Upgrading from 1.6.1 to 1.6.2

Before performing an update you should take your site offline by replacing the index.php file with a static one.

Step 1: Update your CodeIgniter files

Replace these files and directories in your "system" folder with the new versions:

  • system/codeigniter
  • system/database
  • system/helpers
  • system/language
  • system/libraries

Note: If you have any custom developed files in these folders please make copies of them first.

Step 2: Encryption Key

If you are using sessions, open up system/application/config.php and verify you've set an encryption key.

Step 3: Constants File

Copy /system/application/config/constants.php to your installation, and modify if necessary.

Step 4: Mimes File

Replace /system/application/config/mimes.php with the dowloaded version. If you've added custom mime types, you'll need to re-add them.

Step 5: Update your user guide

Please also replace your local copy of the user guide with the new version.

翻译贡献者: Hex
最后修改: 2009-02-21 23:23:48

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.6.2 升级到 1.6.3

从 1.6.2 升级到 1.6.3

在执行升级操作前，你应该把 index.php 替换成一个静态文件，从而把你的站点变成离线状态。

步骤 1：更新你的 CodeIgniter 文件

用新版本替换“system”文件夹中的这些文件和目录：

  • system/codeigniter
  • system/database
  • system/helpers
  • system/language
  • system/libraries

注意：如果在这些目录里面有你自己开发的文件，请事先备份好。

步骤 2：更新你的用户指南

请用新版本替换你本地的用户指南。

翻译贡献者: Hex
最后修改: 2009-02-21 23:24:23

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.6.3 升级到 1.7.0

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.6.3 升级到 1.7.0
搜索用户指南
查看原文

Upgrading from 1.6.3 to 1.7.0

Before performing an update you should take your site offline by replacing the index.php file with a static one.

Step 1: Update your CodeIgniter files

Replace these files and directories in your "system" folder with the new versions:

  • system/codeigniter
  • system/database
  • system/helpers
  • system/language
  • system/libraries

Note: If you have any custom developed files in these folders please make copies of them first.

Step 2: Update your Session Table

If you are using the Session class in your application, AND if you are storing session data to a database, you must add a new column named user_data to your session table. Here is an example of what this column might look like for MySQL: user_data text NOT NULL

To add this column you will run a query similar to this:

ALTER TABLE `ci_sessions` ADD `user_data` text NOT NULL

You'll find more information regarding the new Session functionality in the Session class page.

Step 3: Update your Validation Syntax

This is an optional, but recommended step, for people currently using the Validation class. CI 1.7 introduces a new Form Validation class, which deprecates the old Validation library. We have left the old one in place so that existing applications that use it will not break, but you are encouraged to migrate to the new version as soon as possible. Please read the user guide carefully as the new library works a little differently, and has several new features.

Step 4: Update your user guide

Please replace your local copy of the user guide with the new version, including the image files.

翻译贡献者: Hex
最后修改: 2009-02-09 01:36:20

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 1.7.0 升级到 1.7.1

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.7.0 升级到 1.7.1
搜索用户指南
查看原文

Upgrading from 1.7.0 to 1.7.1

Before performing an update you should take your site offline by replacing the index.php file with a static one.

Step 1: Update your CodeIgniter files

Replace these files and directories in your "system" folder with the new versions:

  • system/codeigniter
  • system/database
  • system/helpers
  • system/language
  • system/libraries

Note: If you have any custom developed files in these folders please make copies of them first.

Step 2: Update your user guide

Please replace your local copy of the user guide with the new version, including the image files.

翻译贡献者: Hex
最后修改: 2009-02-22 00:32:06

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 1.7.1 升级到 1.7.2

从 1.7.1 升级到 1.7.2

在进行升级之前，你应该先通过替换 index.php 为静态页面的方式来使你的网站变为脱机状态。

第1步: 升级你的 CodeIgniter 文件

将 "system" 目录下的这些文件和目录替换为新版本:

  • system/codeigniter
  • system/database
  • system/helpers
  • system/language
  • system/libraries

说明: 如果你在这些目录下有自己编写的文件，你应该先备份它们。

第2步: 将404错误模板中的 header() 移除

如果你的404错误模板中使用了 header() ，例如下面显示的默认 error_404.php 模板，请移除那一行代码。

<?php header("HTTP/1.1 404 Not Found"); ?>

现在 show_404() 方法自身已经可以很好地处理404状态头。

第3步: 升级你的用户手册

请将你的本地用户手册替换为新版本，包括图片文件。

翻译贡献者: Hex, yinzhili
最后修改: 2009-09-13 09:35:02

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


从 Beta 1.0 升级到 Beta 1.1

CodeIgniter 中国首页 › 用户指南首页 › 安装 › 从 Beta 1.0 升级到 Beta 1.1
搜索用户指南
查看原文

Upgrading From Beta 1.0 to Beta 1.1

To upgrade to Beta 1.1 please perform the following steps:

Step 1: Replace your index file

Replace your main index.php file with the new index.php file. Note: If you have renamed your "system" folder you will need to edit this info in the new file.

Step 2: Relocate your config folder

This version of CodeIgniter now permits multiple sets of "applications" to all share a common set of backend files. In order to enable each application to have its own configuration values, the config directory must now reside inside of your application folder, so please move it there.

Step 3: Replace directories

Replace the following directories with the new versions:

  • drivers
  • helpers
  • init
  • libraries
  • scaffolding

Step 4: Add the calendar language file

There is a new language file corresponding to the new calendaring class which must be added to your language folder. Add the following item to your version: language/english/calendar_lang.php

Step 5: Edit your config file

The original application/config/config.php file has a typo in it Open the file and look for the items related to cookies:

$conf['cookie_prefix'] = "";
$conf['cookie_domain'] = "";
$conf['cookie_path'] = "/";

Change the array name from $conf to $config, like this:

$config['cookie_prefix'] = "";
$config['cookie_domain'] = "";
$config['cookie_path'] = "/";

Lastly, add the following new item to the config file (and edit the option if needed):

/*
|------------------------------------------------
| URI PROTOCOL
|------------------------------------------------
|
| This item determines which server global
| should be used to retrieve the URI string. The
| default setting of "auto" works for most servers.
| If your links do not seem to work, try one of
| the other delicious flavors:
|
| 'auto' Default - auto detects
| 'path_info' Uses the PATH_INFO
| 'query_string' Uses the QUERY_STRING
*/

$config['uri_protocol'] = "auto";

翻译贡献者: Hex
最后修改: 2009-02-21 23:24:50

上一个主题: 安装指导 · 页首 · 用户指南首页 · 下一个主题: 疑难解答


CodeIgniter 中国首页 › 用户指南首页 › CodeIgniter 是什么？
搜索用户指南

CodeIgniter 是什么？

CodeIgniter 是一个应用程序框架

CodeIgniter 是一个为用 PHP 编写网络应用程序的人员提供的工具包。它的目标是实现让你比从零开始编写代码更快速地开发项目，为此，CI 提供了一套丰富的类库来满足通常的任务需求，并且提供了一个简单的接口和逻辑结构来调用这些库。CodeIgniter 可以将需要完成的任务代码量最小化，这样你就可以把更多的精力放到项目的开发上了。

CodeIgniter 是免费的

CodeIgniter 是经过 Apache/BSD-style 开源许可授权的，只要你愿意就可以使用它。阅读 许可协议 可获得更多的信息。

CodeIgniter 在 PHP 4 上运行

CodeIgniter 的编写完全兼容 PHP 4。尽管 PHP 5 在面向对象处理方面更具优势，我们本该利用此优势来简化我们（在 PHP4 下的）实现创造性解决方案的(例如：多继承)工作，但是我们建立此框架时，PHP 5 并未被广泛使用，这意味着(如果用 PHP 5来写)我们将要放弃大部分的潜在用户。主流操作系统供应商比如 REDHAT 非常缓慢得转向对 PHP5 的支持，并且短期内他们不大可能会全面支持 PHP5。所以，我们认为用 PHP 5 来写 CodeIgniter 不合 PHP 社区的最大利益。

注解: CodeIgniter 能够在PHP5环境下运行。只是它没有使用PHP5独有的高级特征。

CodeIgniter 是轻量级的

真正的轻量级。我们的核心系统只需要一些非常小的库，这与那些需要更多资源的框架完全相反。额外的库文件只在请求的时候加载，依需求而定，所以核心系统是非常快而且轻的。

CodeIgniter 是快速的

速度非常快。你要找到一个比 CodeIgniter 表现更优的框架应该很难吧。

CodeIgniter 使用 M-V-C 模型

CodeIgniter 使用了模型（Model）- 视图（View）- 控制器（Controllers）的方法，这样可以更好地使表现层和逻辑层分离。这对项目的模板设计者来说是非常有用的，它最小化了模板中的程序代码量。我们在 MVC 各自的页面中对此做了更多的介绍。

CodeIgniter 生成干净的 URL

CodeIgniter 生成的 URL 非常干净而且是对搜索引擎友好化的。不同于标准的“字符串查询”方法，CodeIgniter使用了 segment-based 这样的方法：

example.com/news/article/345

注意：index.php 文件是被默认包含在 URL 中的，但是可以通过更改 .htaccess 文件来改变这个设置。

CodeIgniter 功能强大

CodeIgniter 拥有全范围的类库，可以完成大多数通常需要的网络开发任务，包括： 读取数据库、发送电子邮件、数据确认、保存 session 、对图片的操作，以及支持 XML-RPC 数据传输等。

CodeIgniter 是可扩展的

这个系统可以非常简单的通过插件和 helper 类库来进行扩展，或者也可以通过扩展类、系统钩子来实现。

CodeIgniter 不需要模板引擎

虽然 CodeIgniter 确实 自带了一个可选的模板解析器程序，但不要求你必须使用模板。模板引擎完全与本地化PHP代码的性能需求不符，使用模板引擎我们要学习其语法，这最低限度只比学PHP基础要容易一点点。考虑以下PHP代码：

<ul>

<?php foreach ($addressbook as $name):?>

<li><?=$name?></li>

<?php endforeach; ?>

</ul>

再来对比模板引擎所使用的伪代码：

<ul>

{foreach from=$addressbook item="name"}

<li>{$name}</li>

{/foreach}

</ul>

的确，例中模板引擎的代码比较清晰，但这带来一个性能问题，因为伪代码要先被转换成PHP才能运行。我们的目标是性能最大化, 所以我们选择不使用专用的模板引擎。

CodeIgniter 已彻底文档化

程序员都喜欢写代码讨厌写文档。当然我们也一样，但是既然文档和代码本身一样重要，我们就要完成它了。况且我们代码资源极其干净而且方便注释。

CodeIgniter 拥有一个友好的用户社区

你可以在我们的 社区论坛 中看到一个成长中的积极活跃的用户社区。

翻译贡献者: Hex, iptton, irini, Rayne
最后修改: 2009-09-12 15:37:56

上一个主题: 开始 · 页首 · 用户指南首页 · 下一个主题: CodeIgniter 速记表


许可协议

CodeIgniter 中国首页 › 用户指南首页 › 许可协议
搜索用户指南
查看原文

CodeIgniter 许可协议

版权所有 (c) 2008 - 2009, EllisLab 公司
保留所有权利.

本协议是你和EllisLab公司之间为使用CodeIgniter软件（以下简称“软件”）达成的法律协议。获取软件的同时你必须同意完全遵守本协议的条款及条件。

允许使用

只要符合以下条件，你将被允许使用、复制、修改以及分发本软件和它相关的文档，包括你可以修改或者不修改地用于任何目的：

  1. 这个许可协议的一份拷贝必须包含在分发的软件中。
  2. 再分发源代码时必须在所有源代码文件中保留上方的版权提醒。
  3. 以二进制形式再分发时，必须在文档以及/或者随分发提供的其他物品上保留上面的版权提醒。
  4. 任何修改过的文件必须加上对原始代码修改的注释以及修改者名称。
  5. 任何由本软件衍生的产品必须在它们的文档以及/或者随分发提供的物品中表明它们来源于CodeIgniter。
  6. 从本软件衍生的产品可以在名称中完全不出现"CodeIgniter"或者出现"CodeIgniter"，这一点不需要事先从EllisLab公司得到许可。

赔偿

你同意对任何因你使用或者误用本软件或者违反任何本许可协议条款所产生的直接、间接、附带的或相应的第三者索赔、诉讼费用承担赔偿，以及对本软件的作者和任何贡献者无害化。

保修免责条款

该软件提供的是“现况”，没有任何保证，表示或暗示，包括但不限于担保的质量，性能，不侵权，适销性或特定用途的适用性。

责任限制

你将承担所有安装和使用本软件的风险。

翻译贡献者: Hex
最后修改: 2009-09-12 15:46:17

上一个主题: 服务器要求 · 页首 · 用户指南首页 · 下一个主题: 变更记录


CodeIgniter 中国首页 › 用户指南首页 › 变更记录

变更记录

版本 1.7.3

发布日期：尚未发布
SVN 版本:

版本 1.7.2

发布日期：2009年9月11日
SVN 版本: 1737

  • Libraries
    • Added a new Cart Class.
    • Added the ability to pass $config['file_name'] for the File Uploading Class and rename the uploaded file.
    • Changed order of listed user-agents so Safari would more accurately report itself. (#6844)
  • Database
    • Switched from using gettype() in escape() to is_* methods, since future PHP versions might change its output.
    • Updated all database drivers to handle arrays in escape_str()
    • Added escape_like_str() method for escaping strings to be used in LIKE conditions
    • Updated Active Record to utilize the new LIKE escaping mechanism.
    • Added reconnect() method to DB drivers to try to keep alive / reestablish a connection after a long idle.
    • Modified MSSQL driver to use mssql_get_last_message() for error messages.
  • Helpers
    • Added form_multiselect() to the Form helper.
    • Modified form_hidden() in the Form helper to accept multi-dimensional arrays.
    • Modified form_prep() in the Form helper to keep track of prepped fields to avoid multiple prep/mutation from subsequent calls which can occur when using Form Validation and form helper functions to output form fields.
    • Modified directory_map() in the Directory helper to allow the inclusion of hidden files, and to return FALSE on failure to read directory.
    • Modified the Smiley helper to work with multiple fields and insert the smiley at the last known cursor position.
  • General
    • Compatible with PHP 5.3.0
    • Modified show_error() to allow sending of HTTP server response codes.
    • Modified show_404() to send 404 status code, removing non-CGI compatible header() statement from error_404.php template.
    • Added set_status_header() to the Common functions to allow use when the Output class is unavailable.
    • Added is_php() to Common functions to facilitate PHP version comparisons.

    • Added 2 CodeIgniter "cheatsheets" (thanks to DesignFellow.com for this contribution).

1.7.2 修复的 BUG

  • Fixed assorted user guide typos or examples (#6743, #7214, #7516, #7287, #7852, #8224, #8324, #8349).
  • Fixed a bug in the Form Validation library where multiple callbacks weren't working (#6110)
  • doctype helper default value was missing a "1".
  • Fixed a bug in the language class when outputting an error for an unfound file.
  • Fixed a bug in the Calendar library where the shortname was output for "May".
  • Fixed a bug with ORIG_PATH_INFO that was allowing URIs of just a slash through.
  • Fixed a fatal error in the Oracle and ODBC drivers (#6752)
  • Fixed a bug where xml_from_result() was checking for a nonexistent method.
  • Fixed a bug where Database Forge's add_column and modify_column were not looping through when sent multiple fields.
  • Fixed a bug where the File Helper was using '/' instead of the DIRECTORY_SEPARATOR constant.
  • Fixed a bug to prevent PHP errors when attempting to use sendmail on servers that have manually disabled the PHP popen() function.
  • Fixed a bug that would cause PHP errors in XML-RPC data if the PHP data type did not match the specified XML-RPC type.
  • Fixed a bug in the XML-RPC class with parsing dateTime.iso8601 data types.
  • Fixed a case sensitive string replacement in xss_clean()
  • Fixed a bug in form_textarea() where form data was not prepped correctly.
  • Fixed a bug in form_prep() causing it to not preserve entities in the user's original input when called back into a form element
  • Fixed a bug in _protect_identifiers() where the swap prefix ($swap_pre) was not being observed.
  • Fixed a bug where the 400 status header sent with the 'disallowed URI characters' was not compatible with CGI environments.
  • Fixed a bug in the typography class where heading tags could have paragraph tags inserted when using auto_typography().

Version 1.7.1

Release Date: February 10, 2009
SVN Revision: 1640

  • Libraries
    • Fixed an arbitrary script execution security flaw (#6068) in the Form Validation library (thanks to hkk)
    • Changed default current page indicator in the Pagination library to use <strong> instead of <b>
    • A "HTTP/1.1 400 Bad Request" header is now sent when disallowed characters are encountered.
    • Added <big>, <small>, <q>, and <tt> to the Typography parser's inline elements.
    • Added more accurate error reporting for the Email library when using sendmail.
    • Removed a strict type check from the rotate() function of the Image Manipulation Class.
    • Added enhanced error checking in file saving in the Image library when using the GD lib.
    • Added an additional newline between multipart email headers and the MIME message text for better compatibility with a variety of MUAs.
    • Made modest improvements to efficiency and accuracy of explode_name() in the Image lib.
  • Database
    • Added where_in to the list of expected arguments received by delete().
  • Helpers
    • Added the ability to have optgroups in form_dropdown() within the form helper.
    • Added a doctype() function to the HTML helper.
    • Added ability to force lowercase for url_title() in the URL helper.
    • Changed the default "type" of form_button() to "button" from "submit" in the form helper.
    • Changed redirect() in the URL helper to allow redirections to URLs outside of the CI site.
    • Updated get_cookie() to try to fetch the cookie using the global cookie prefix if the requested cookie name doesn't exist.
  • Other Changes
    • Improved security in xss_clean() to help prevent attacks targeting Internet Explorer.
    • Added 'application/msexcel' to config/mimes.php for .xls files.
    • Added 'proxy_ips' config item to whitelist reverse proxy servers from which to trust the HTTP_X_FORWARDED_FOR header to to determine the visitor's IP address.
    • Improved accuracy of Upload::is_allowed_filetype() for images (#6715)

Bug fixes for 1.7.1

  • Database
    • Fixed a bug when doing 'random' on order_by() (#5706).
    • Fixed a bug where adding a primary key through Forge could fail (#5731).
    • Fixed a bug when using DB cache on multiple databases (#5737).
    • Fixed a bug where TRUNCATE was not considered a "write" query (#6619).
    • Fixed a bug where csv_from_result() was checking for a nonexistent method.
    • Fixed a bug _protect_identifiers() where it was improperly removing all pipe symbols from items
  • Fixed assorted user guide typos or examples (#5998, #6093, #6259, #6339, #6432, #6521).
  • Fixed a bug in the MySQLi driver when no port is specified
  • Fixed a bug (#5702), in which the field label was not being fetched properly, when "matching" one field to another.
  • Fixed a bug in which identifers were not being escaped properly when reserved characters were used.
  • Fixed a bug with the regular expression used to protect submitted paragraph tags in auto typography.
  • Fixed a bug where double dashes within tag attributes were being converted to em dash entities.
  • Fixed a bug where double spaces within tag attributes were being converted to non-breaking space entities.
  • Fixed some accuracy issues with curly quotes in Typography::format_characters()
  • Changed a few docblock comments to reflect actual return values.
  • Fixed a bug with high ascii characters in subject and from email headers.
  • Fixed a bug in xss_clean() where whitespace following a validated character entity would not be preserved.
  • Fixed a bug where HTML comments and <pre> tags were being parsed in Typography::auto_typography().
  • Fixed a bug with non-breaking space cleanup in Typography::auto_typography().
  • Fixed a bug in database escaping where a compound statement (ie: SUM()) wasn't handled correctly with database prefixes.
  • Fixed a bug when an opening quote is preceded by a paragraph tag and immediately followed by another tag.
  • Fixed a bug in the Text Helper affecting some locales where word_censor() would not work on words beginning or ending with an accented character.
  • Fixed a bug in the Text Helper character limiter where the provided limit intersects the last word of the string.
  • Fixed a bug (#6342) with plural() in the Inflection helper with words ending in "y".
  • Fixed bug (#6517) where Routed URI segments returned by URI::rsegment() method were incorrect for the default controller.
  • Fixed a bug (#6706) in the Security Helper where xss_clean() was using a deprecated second argument.
  • Fixed a bug in the URL helper url_title() function where trailing periods were allowed at the end of a URL.
  • Fixed a bug (#6669) in the Email class when CRLF's are used for the newline character with headers when used with the "mail" protocol.
  • Fixed a bug (#6500) where URI::A_filter_uri() was exit()ing an error instead of using show_error().
  • Fixed a bug (#6592) in the File Helper where get_dir_file_info() where recursion was not occurring properly.
  • Tweaked Typography::auto_typography() for some edge-cases.

Version 1.7

Release Date: October 23, 2008
SVN Revision: 1541

  • Libraries
    • Added a new Form Validation Class. It simplifies setting rules and field names, supports arrays as field names, allows groups of validation rules to be saved in a config file, and adds some helper functions for use in view files. Please note that the old Validation class is now deprecated. We will leave it in the library folder for some time so that existing applications that use it will not break, but you are encouraged to migrate to the new version.
    • Updated the Sessions class so that any custom data being saved gets stored to a database rather than the session cookie (assuming you are using a database to store session data), permitting much more data to be saved.
    • Added the ability to store libraries in subdirectories within either the main "libraries" or the local application "libraries" folder. Please see the Loader class for more info.
    • Added the ability to assign library objects to your own variable names when you use $this->load->library(). Please see the Loader class for more info.
    • Added controller class/method info to Profiler class and support for multiple database connections.
    • Improved the "auto typography" feature and moved it out of the helper into its own Typography Class.
    • Improved performance and accuracy of xss_clean(), including reduction of false positives on image/file tests.
    • Improved Parser class to allow multiple calls to the parse() function. The output of each is appended in the output.
    • Added max_filename option to set a file name length limit in the File Upload Class.
    • Added set_status_header() function to Output class.
    • Modified Pagination class to only output the "First" link when the link for page one would not be shown.
    • Added support for mb_strlen in the Form Validation class so that multi-byte languages will calculate string lengths properly.
  • Database
    • Improved Active Record class to allow full path column and table names: hostname.database.table.column. Also improved the alias handling.
    • Improved how table and column names are escaped and prefixed. It now honors full path names when adding prefixes and escaping.
    • Added Active Record caching feature to "update" and "delete" functions.
    • Added removal of non-printing control characters in escape_str() of DB drivers that do not have native PHP escaping mechanisms (mssql, oci8, odbc), to avoid potential SQL errors, and possible sources of SQL injection.
    • Added port support to MySQL, MySQLi, and MS SQL database drivers.
    • Added driver name variable in each DB driver, based on bug report #4436.
  • Helpers
    • Added several new "setting" functions to the Form helper that allow POST data to be retrieved and set into forms. These are intended to be used on their own, or with the new Form Validation Class.
    • Added current_url() and uri_segments() to URL helper.
    • Altered auto_link() in the URL helper so that email addresses with "+" included will be linked.
    • Added meta() function to HTML helper.
    • Improved accuracy of calculations in Number helper.
    • Removed added newlines ("\n") from most form and html helper functions.
    • Tightened up validation in the Date helper function human_to_unix(), and eliminated the POSIX regex.
    • Updated Date helper to match the world's current time zones and offsets.
    • Modified url_title() in the URL helper to remove characters and digits that are part of character entities, to allow dashes, underscores, and periods regardless of the $separator, and to allow uppercase characters.
    • Added support for arbitrary attributes in anchor_popup() of the URL helper.
  • Other Changes
    • Added PHP Style Guide to docs.
    • Added sanitization in xss_clean() for a deprecated HTML tag that could be abused in user input in Internet Explorer.
    • Added a few openxml document mime types, and an additional mobile agent to mimes.php and user_agents.php respectively.
    • Added a file lock check during caching, before trying to write to the file.
    • Modified Cookie key cleaning to unset a few troublesome key names that can be present in certain environments, preventing CI from halting execution.
    • Changed the output of the profiler to use style attribute rather than clear, and added the id "codeigniter_profiler" to the container div.

Bug fixes for 1.7.0

  • Fixed bug in xss_clean() that could remove some desirable tag attributes.
  • Fixed assorted user guide typos or examples (#4807, #4812, #4840, #4862, #4864, #4899, #4930, #5006, #5071, #5158, #5229, #5254, #5351).
  • Fixed an edit from 1.6.3 that made the $robots array in user_agents.php go poof.
  • Fixed a bug in the Email library with quoted-printable encoding improperly encoding space and tab characters.
  • Modified XSS sanitization to no longer add semicolons after &[single letter], such as in M&M's, B&B, etc.
  • Modified XSS sanitization to no longer strip XHTML image tags of closing slashes.
  • Fixed a bug in the Session class when database sessions are used where upon session update all userdata would be errantly written to the session cookie.
  • Fixed a bug (#4536) in backups with the MySQL driver where some legacy code was causing certain characters to be double escaped.
  • Fixed a routing bug (#4661) that occurred when the default route pointed to a subfolder.
  • Fixed the spelling of "Dhaka" in the timezone_menu() function of the Date helper.
  • Fixed the spelling of "raspberry" in config/smileys.php.
  • Fixed incorrect parenthesis in form_open() function (#5135).
  • Fixed a bug that was ignoring case when comparing controller methods (#4560).
  • Fixed a bug (#4615) that was not setting SMTP authorization settings when using the initialize function.
  • Fixed a bug in highlight_code() in the Text helper that would leave a stray </span> in certain cases.
  • Fixed Oracle bug (#3306) that was preventing multiple queries in one action.
  • Fixed ODBC bug that was ignoring connection params due to its use of a constructor.
  • Fixed a DB driver bug with num_rows() that would cause an error with the Oracle driver.
  • Fixed MS SQL bug (#4915). Added brackets around database name in MS SQL driver when selecting the database, in the event that reserved characters are used in the name.
  • Fixed a DB caching bug (4718) in which the path was incorrect when no URI segments were present.
  • Fixed Image_lib class bug #4562. A path was not defined for NetPBM.
  • Fixed Image_lib class bug #4532. When cropping an image with identical height/width settings on output, a copy is made.
  • Fixed DB_driver bug (4900), in which a database error was not being logged correctly.
  • Fixed DB backup bug in which field names were not being escaped.
  • Fixed a DB Active Record caching bug in which multiple calls to cached data were not being honored.
  • Fixed a bug in the Session class that was disallowing slashes in the serialized array.
  • Fixed a Form Validation bug in which the "isset" error message was being trigged by the "required" rule.
  • Fixed a spelling error in a Loader error message.
  • Fixed a bug (5050) with IP validation with empty segments.
  • Fixed a bug in which the parser was being greedy if multiple identical sets of tags were encountered.

版本1.6.3

发布日期： 2008年6月26日
版次： 1238

版本1.6.3是一个安全和维护的版本，建议所有用户使用。

  • Database
    • Modified MySQL/MySQLi Forge class to give explicit names to keys
    • Added ability to set multiple column non-primary keys to the Forge class
    • Added ability to set additional database config values in DSN connections via the query string.
  • Libraries
    • Set the mime type check in the Upload class to reference the global mimes variable.
    • Added support for query strings to the Pagination class, automatically detected or explicitly declared.
    • Added get_post() to the Input class.
    • Documented get() in the Input class.
    • Added the ability to automatically output language items as form labels in the Language class.
  • Helpers
    • Added a Language helper.
    • Added a Number helper.
    • Form helper refactored to allow form_open() and form_fieldset() to accept arrays or strings as arguments.
  • Other changes
    • Improved security in xss_clean().
    • Removed an unused Router reference in _display_cache().
    • Added ability to use xss_clean() to test images for XSS, useful for upload security.
    • Considerably expanded list of mobile user-agents in config/user_agents.php.
    • Charset information in the userguide has been moved above title for internationalization purposes (#4614).
    • Added "Using Associative Arrays In a Request Parameter" example to the XMLRPC userguide page.
    • Removed maxlength and size as automatically added attributes of form_input() in the form helper.
    • Documented the language file use of byte_format() in the number helper.

Bug fixes for 1.6.3

  • Added a language key for valid_emails in validation_lang.php.
  • Amended fixes for bug (#3419) with parsing DSN database connections.
  • Moved the _has_operators() function (#4535) into DB_driver from DB_active_rec.
  • Fixed a syntax error in upload_lang.php.
  • Fixed a bug (#4542) with a regular expression in the Image library.
  • Fixed a bug (#4561) where orhaving() wasn't properly passing values.
  • Removed some unused variables from the code (#4563).
  • Fixed a bug where having() was not adding an = into the statement (#4568).
  • Fixed assorted user guide typos or examples (#4574, #4706).
  • Added quoted-printable headers to Email class when the multi-part override is used.
  • Fixed a double opening <p> tag in the index pages of each system directory.

Version 1.6.2

Release Date: May 13, 2008
SVN Revision: 1155

  • Active Record
    • Added the ability to prevent escaping in having() clauses.
    • Added rename_table() into DBForge.
    • Fixed a bug that wasn't allowing escaping to be turned off if the value of a query was NULL.
    • DB Forge is now assigned to any models that exist after loading (#3457).
  • Database
    • Added Strict Mode to database transactions.
    • Escape behaviour in where() clauses has changed; values in those with the "FALSE" argument are no longer escaped (ie: quoted).
  • Config
    • Added 'application/vnd.ms-powerpoint' to list of mime types.
    • Added 'audio/mpg' to list of mime types.
    • Added new user-modifiable file constants.php containing file mode and fopen constants.
    • Added the ability to set CRLF settings via config in the Email class.
  • Libraries
    • Added increased security for filename handling in the Upload library.
    • Added increased security for sessions for client-side data tampering.
    • The MySQLi forge class is now in sync with MySQL forge.
    • Added the ability to set CRLF settings via config in the Email class.
    • Unit Testing results are now colour coded, and a change was made to the default template of results.
    • Added a valid_emails rule to the Validation class.
    • The Zip class now exits within download().
    • The Zip class has undergone a substantial re-write for speed and clarity (thanks stanleyxu for the hard work and code contribution in bug report #3425!)
  • Helpers
    • Added a Compatibility Helper for using some common PHP 5 functions safely in applications that might run on PHP 4 servers (thanks Seppo for the hard work and code contribution!)
    • Added form_button() in the Form helper.
    • Changed the radio() and checkbox() functions to default to not checked by default.
    • Added the ability to include an optional HTTP Response Code in the redirect() function of the URL Helper.
    • Modified img() in the HTML Helper to remove an unneeded space (#4208).
    • Modified anchor() in the URL helper to no longer add a default title= attribute (#4209).
    • The Download helper now exits within force_download().
    • Added get_dir_file_info(), get_file_info(), and get_mime_by_extension() to the File Helper.
    • Added symbolic_permissions() and octal_permissions() to the File helper.
  • Plugins
    • Modified captcha generation to first look for the function imagecreatetruecolor, and fallback to imagecreate if it isn't available (#4226).
  • Other Changes
    • Added ability for xss_clean() to accept arrays.
    • Removed closing PHP tags from all PHP files to avoid accidental output and potential 'cannot modify headers' errors.
    • Removed "scripts" from the auto-load search path. Scripts were deprecated in Version 1.4.1 (September 21, 2006). If you still need to use them for legacy reasons, they must now be manually loaded in each Controller.
    • Added a Reserved Names page to the userguide, and migrated reserved controller names into it.
    • Added a Common Functions page to the userguide for globally available functions.
    • Improved security and performance of xss_clean().

Bugfixes for 1.6.2

  • Fixed a bug where SET queries were not being handled as "write" queries.
  • Fixed a bug (#3191) with ORIG_PATH_INFO URI parsing.
  • Fixed a bug in DB Forge, when inserting an id field (#3456).
  • Fixed a bug in the table library that could cause identically constructed rows to be dropped (#3459).
  • Fixed DB Driver and MySQLi result driver checking for resources instead of objects (#3461).
  • Fixed an AR_caching error where it wasn't tracking table aliases (#3463).
  • Fixed a bug in AR compiling, where select statements with arguments got incorrectly escaped (#3478).
  • Fixed an incorrect documentation of $this->load->language (#3520).
  • Fixed bugs (#3523, #4350) in get_filenames() with recursion and problems with Windows when $include_path is used.
  • Fixed a bug (#4153) in the XML-RPC class preventing dateTime.iso8601 from being used.
  • Fixed an AR bug with or_where_not_in() (#4171).
  • Fixed a bug with xss_clean() that would add semicolons to GET URI variable strings.
  • Fixed a bug (#4206) in the Directory Helper where the directory resource was not being closed, and minor improvements.
  • Fixed a bug in the FTP library where delete_dir() was not working recursively (#4215).
  • Fixed a Validation bug when set_rules() is used with a non-array field name and rule (#4220).
  • Fixed a bug (#4223) where DB caching would not work for returned DB objects or multiple DB connections.
  • Fixed a bug in the Upload library that might output the same error twice (#4390).
  • Fixed an AR bug when joining with a table alias and table prefix (#4400).
  • Fixed a bug in the DB class testing the $params argument.
  • Fixed a bug in the Table library where the integer 0 in cell data would be displayed as a blank cell.
  • Fixed a bug in link_tag() of the URL helper where a key was passed instead of a value.
  • Fixed a bug in DB_result::row() that prevented it from returning individual fields with MySQL NULL values.
  • Fixed a bug where SMTP emails were not having dot transformation performed on lines that begin with a dot.
  • Fixed a bug in display_error() in the DB driver that was instantiating new Language and Exception objects, and not using the error heading.
  • Fixed a bug (#4413) where a URI containing slashes only e.g. 'http://example.com/index.php?//' would result in PHP errors
  • Fixed an array to string conversion error in the Validation library (#4425)
  • Fixed bug (#4451, #4299, #4339) where failed transactions will not rollback when debug mode is enabled.
  • Fixed a bug (#4506) with overlay_watermark() in the Image library preventing support for PNG-24s with alpha transparency
  • Fixed assorted user guide typos (#3453, #4364, #4379, #4399, #4408, #4412, #4448, #4488).

Version 1.6.1

Release Date: February 12, 2008
SVN Revision: 984

  • Active Record
    • Added Active Record Caching.
    • Made Active Record fully database-prefix aware.
  • Database drivers
    • Added support for setting client character set and collation for MySQLi.
  • Core Changes
    • Modified xss_clean() to be more intelligent with its handling of URL encoded strings.
    • Added $_SERVER, $_FILES, $_ENV, and $_SESSION to sanitization of globals.
    • Added a Path Helper.
    • Simplified _reindex_segments() in the URI class.
    • Escaped the '-' in the default 'permitted_uri_chars' config item, to prevent errors if developers just try to add additional characters to the end of the default expression.
    • Modified method calling to controllers to show a 404 when a private or protected method is accessed via a URL.
    • Modified framework initiated 404s to log the controller and method for invalid requests.
  • Helpers
    • Modified get_filenames() in the File Helper to return FALSE if the $source_dir is not readable.

Bugfixes for 1.6.1

  • Deprecated is_numeric as a validation rule. Use of numeric and integer are preferred.
  • Fixed bug (#3379) in DBForge with SQLite for table creation.
  • Made Active Record fully database prefix aware (#3384).
  • Fixed a bug where DBForge was outputting invalid SQL in Postgres by adding brackets around the tables in FROM.
  • Changed the behaviour of Active Record's update() to make the WHERE clause optional (#3395).
  • Fixed a bug (#3396) where certain POST variables would cause a PHP warning.
  • Fixed a bug in query binding (#3402).
  • Changed order of SQL keywords in the Profiler $highlight array so OR would not be highlighted before ORDER BY.
  • Fixed a bug (#3404) where the MySQLi driver was testing if $this->conn_id was a resource instead of an object.
  • Fixed a bug (#3419) connecting to a database via a DSN string.
  • Fixed a bug (#3445) where the routed segment array was not re-indexed to begin with 1 when the default controller is used.
  • Fixed assorted user guide typos.

Version 1.6.0

Release Date: January 30, 2008

  • DBForge
    • Added DBForge to the database tools.
    • Moved create_database() and drop_database() into DBForge.
    • Added add_field(), add_key(), create_table(), drop_table(), add_column(), drop_column(), modify_column() into DBForge.
  • Active Record
    • Added protect_identifiers() in Active Record.
    • All AR queries are backticked if appropriate to the database.
    • Added where_in(), or_where_in(), where_not_in(), or_where_not_in(), not_like() and or_not_like() to Active Record.
    • Added support for limit() into update() and delete() statements in Active Record.
    • Added empty_table() and truncate_table() to Active Record.
    • Added the ability to pass an array of tables to the delete() statement in Active Record.
    • Added count_all_results() function to Active Record.
    • Added select_max(), select_min(), select_avg() and select_sum() to Active Record.
    • Added the ability to use aliases with joins in Active Record.
    • Added a third parameter to Active Record's like() clause to control where the wildcard goes.
    • Added a third parameter to set() in Active Record that withholds escaping data.
    • Changed the behaviour of variables submitted to the where() clause with no values to auto set "IS NULL"
  • Other Database Related
    • MySQL driver now requires MySQL 4.1+
    • Added $this->DB->save_queries variable to DB driver, enabling queries to get saved or not. Previously they were always saved.
    • Added $this->db->dbprefix() to manually add database prefixes.
    • Added 'random' as an order_by() option , and removed "rand()" as a listed option as it was MySQL only.
    • Added a check for NULL fields in the MySQL database backup utility.
    • Added "constrain_by_prefix" parameter to db->list_table() function. If set to TRUE it will limit the result to only table names with the current prefix.
    • Deprecated from Active Record; getwhere() for get_where(); groupby() for group_by(); havingor() for having_or(); orderby() for order_by; orwhere() for or_where(); and orlike() for or_like().
    • Modified csv_from_result() to output CSV data more in the spirit of basic rules of RFC 4180.
    • Added 'char_set' and 'dbcollat' database configuration settings, to explicitly set the client communication properly.
    • Removed 'active_r' configuration setting and replaced with a global $active_record setting, which is more in harmony with the global nature of the behavior (#1834).
  • Core changes
    • Added ability to load multiple views, whose content will be appended to the output in the order loaded.
    • Added the ability to auto-load Models.
    • Reorganized the URI and Routes classes for better clarity.
    • Added Compat.php to allow function overrides for older versions of PHP or PHP environments missing certain extensions / libraries
    • Added memory usage, GET, URI string data, and individual query execution time to Profiler output.
    • Deprecated Scaffolding.
    • Added is_really_writable() to Common.php to provide a cross-platform reliable method of testing file/folder writability.
  • Libraries
    • Changed the load protocol of Models to allow for extension.
    • Strengthened the Encryption library to help protect against man in the middle attacks when MCRYPT_MODE_CBC mode is used.
    • Added Flashdata variables, session_id regeneration and configurable session update times to the Session class.
    • Removed 'last_visit' from the Session class.
    • Added a language entry for valid_ip validation error.
    • Modified prep_for_form() in the Validation class to accept arrays, adding support for POST array validation (via callbacks only)
    • Added an "integer" rule into the Validation library.
    • Added valid_base64() to the Validation library.
    • Documented clear() in the Image Processing library.
    • Changed the behaviour of custom callbacks so that they no longer trigger the "required" rule.
    • Modified Upload class $_FILES error messages to be more precise.
    • Moved the safe mode and auth checks for the Email library into the constructor.
    • Modified variable names in _ci_load() method of Loader class to avoid conflicts with view variables.
    • Added a few additional mime type variations for CSV.
    • Enabled the 'system' methods for the XML-RPC Server library, except for 'system.multicall' which is still disabled.
  • Helpers & Plugins
    • Added link_tag() to the HTML helper.
    • Added img() to the HTML helper.
    • Added ability to "extend" Helpers.
    • Added an email helper into core helpers.
    • Added strip_quotes() function to string helper.
    • Added reduce_multiples() function to string helper.
    • Added quotes_to_entities() function to string helper.
    • Added form_fieldset(), form_fieldset_close(), form_label(), and form_reset() function to form helper.
    • Added support for external urls in form_open().
    • Removed support for db_backup in MySQLi due to incompatible functions.
    • Javascript Calendar plugin now uses the months and days from the calendar language file, instead of hard-coded values, internationalizing it.
  • Documentation Changes
    • Added Writing Documentation section for the community to use in writing their own documentation.
    • Added titles to all user manual pages.
    • Added attributes into <html> of userguide for valid html.
    • Added Zip Encoding Class to the table of contents of the userguide.
    • Moved part of the userguide menu javascript to an external file.
    • Documented distinct() in Active Record.
    • Documented the timezones() function in the Date Helper.
    • Documented unset_userdata in the Session class.
    • Documented 2 config options to the Database configuration page.

Bug fixes for Version 1.6.0

  • Fixed a bug (#1813) preventing using $CI->db in the same application with returned database objects.
  • Fixed a bug (#1842) where the $this->uri->rsegments array would not include the 'index' method if routed to the controller without an implicit method.
  • Fixed a bug (#1872) where word_limiter() was not retaining whitespace.
  • Fixed a bug (#1890) in csv_from_result() where content that included the delimiter would break the file.
  • Fixed a bug (#2542)in the clean_email() method of the Email class to allow for non-numeric / non-sequential array keys.
  • Fixed a bug (#2545) in _html_entity_decode_callback() when 'global_xss_filtering' is enabled.
  • Fixed a bug (#2668) in the parser class where numeric data was ignored.
  • Fixed a bug (#2679) where the "previous" pagination link would get drawn on the first page.
  • Fixed a bug (#2702) in _object_to_array that broke some types of inserts and updates.
  • Fixed a bug (#2732) in the SQLite driver for PHP 4.
  • Fixed a bug (#2754) in Pagination to scan for non-positive num_links.
  • Fixed a bug (#2762) in the Session library where user agent matching would fail on user agents ending with a space.
  • Fixed a bug (#2784) $field_names[] vs $Ffield_names[] in postgres and sqlite drivers.
  • Fixed a bug (#2810) in the typography helper causing extraneous paragraph tags when string contains tags.
  • Fixed a bug (#2849) where arguments passed to a subfolder controller method would be incorrectly shifted, dropping the 3rd segment value.
  • Fixed a bug (#2858) which referenced a wrong variable in the Image class.
  • Fixed a bug (#2875)when loading plugin files as _plugin. and not _pi.
  • Fixed a bug (#2912) in get_filenames() in the File Helper where the array wasn't cleared after each call.
  • Fixed a bug (#2974) in highlight_phrase() that caused an error with slashes.
  • Fixed a bug (#3003) in the Encryption Library to support modes other than MCRYPT_MODE_ECB
  • Fixed a bug (#3015) in the User Agent library where more then 2 languages where not reported with languages().
  • Fixed a bug (#3017) in the Email library where some timezones were calculated incorrectly.
  • Fixed a bug (#3024) in which master_dim wasn't getting reset by clear() in the Image library.
  • Fixed a bug (#3156) in Text Helper highlight_code() causing PHP tags to be handled incorrectly.
  • Fixed a bug (#3166) that prevented num_rows from working in Oracle.
  • Fixed a bug (#3175) preventing certain libraries from working properly when autoloaded in PHP 4.
  • Fixed a bug (#3267) in the Typography Helper where unordered list was listed "un.
  • Fixed a bug (#3268) where the Router could leave '/' as the path.
  • Fixed a bug (#3279) where the Email class was sending the wrong Content-Transfer-Encoding for some character sets.
  • Fixed a bug (#3284) where the rsegment array would not be set properly if the requested URI contained more segments than the routed URI.
  • Removed extraneous load of $CFG in _display_cache() of the Output class (#3285).
  • Removed an extraneous call to loading models (#3286).
  • Fixed a bug (#3310) with sanitization of globals in the Input class that could unset CI's global variables.
  • Fixed a bug (#3314) which would cause the top level path to be deleted in delete_files() of the File helper.
  • Fixed a bug (#3328) where the smiley helper might return an undefined variable.
  • Fixed a bug (#3330) in the FTP class where a comparison wasn't getting made.
  • Removed an unused parameter from Profiler (#3332).
  • Fixed a bug in database driver where num_rows property wasn't getting updated.
  • Fixed a bug in the upload library when allowed_files wasn't defined.
  • Fixed a bug in word_wrap() of the Text Helper that incorrectly referenced an object.
  • Fixed a bug in Validation where valid_ip() wasn't called properly.
  • Fixed a bug in Validation where individual error messages for checkboxes wasn't supported.
  • Fixed a bug in captcha calling an invalid PHP function.
  • Fixed a bug in the cookie helper "set_cookie" function. It was not honoring the config settings.
  • Fixed a bug that was making validation callbacks required even when not set as such.
  • Fixed a bug in the XML-RPC library so if a type is specified, a more intelligent decision is made as to the default type.
  • Fixed an example of comma-separated emails in the email library documentation.
  • Fixed an example in the Calendar library for Showing Next/Previous Month Links.
  • Fixed a typo in the database language file.
  • Fixed a typo in the image language file "suppor" to "support".
  • Fixed an example for XML RPC.
  • Fixed an example of accept_charset() in the User Agent Library.
  • Fixed a typo in the docblock comments that had CodeIgniter spelled CodeIgnitor.
  • Fixed a typo in the String Helper (uniquid changed to uniqid).
  • Fixed typos in the email Language class (email_attachment_unredable, email_filed_smtp_login), and FTP Class (ftp_unable_to_remame).
  • Added a stripslashes() into the Upload Library.
  • Fixed a series of grammatical and spelling errors in the language files.
  • Fixed assorted user guide typos.

Version 1.5.4

Release Date: July 12, 2007

  • Added custom Language files to the autoload options.
  • Added stripslashes() to the _clean_input_data() function in the Input class when magic quotes is on so that data will always be un-slashed within the framework.
  • Added array to string into the profiler.
  • Added some additional mime types in application/config/mimes.php.
  • Added filename_security() method to Input library.
  • Added some additional arguments to the Inflection helper singular() to compensate for words ending in "s". Also added a force parameter to pluralize().
  • Added $config['charset'] to the config file. Default value is 'UTF-8', used in some string handling functions.
  • Fixed MSSQL insert_id().
  • Fixed a logic error in the DB trans_status() function. It was incorrectly returning TRUE on failure and FALSE on success.
  • Fixed a bug that was allowing multiple load attempts on extended classes.
  • Fixed a bug in the bootstrap file that was incorrectly attempting to discern the full server path even when it was explicity set by the user.
  • Fixed a bug in the escape_str() function in the MySQL driver.
  • Fixed a typo in the Calendar library
  • Fixed a typo in rpcs.php library
  • Fixed a bug in the Zip library, providing PC Zip file compatibility with Mac OS X
  • Fixed a bug in router that was ignoring the scaffolding route for optimization
  • Fixed an IP validation bug.
  • Fixed a bug in display of POST keys in the Profiler output
  • Fixed a bug in display of queries with characters that would be interpreted as HTML in the Profiler output
  • Fixed a bug in display of Email class print debugger with characters that would be interpreted as HTML in the debugging output
  • Fixed a bug in the Content-Transfer-Encoding of HTML emails with the quoted-printable MIME type
  • Fixed a bug where one could unset certain PHP superglobals by setting them via GET or POST data
  • Fixed an undefined function error in the insert_id() function of the PostgreSQL driver
  • Fixed various doc typos.
  • Documented two functions from the String helper that were missing from the user guide: trim_slashes() and reduce_double_slashes().
  • Docs now validate to XHTML 1 transitional
  • Updated the XSS Filtering to take into account the IE [removed]) ability and improved certain deletions to prevent possible exploits
  • Modified the Router so that when Query Strings are Enabled, the controller trigger and function trigger values are sanitized for filename include security.
  • Modified the is_image() method in the Upload library to take into account Windows IE 6/7 eccentricities when dealing with MIMEs
  • Modified XSS Cleaning routine to be more performance friendly and compatible with PHP 5.2's new PCRE backtrack and recursion limits.
  • Modified the URL Helper to type cast the $title as a string in case a numeric value is supplied
  • Modified Form Helper form_dropdown() to type cast the keys and values of the options array as strings, allowing numeric values to be properly set as 'selected'
  • Deprecated the use if is_numeric() in various places since it allows periods. Due to compatibility problems with ctype_digit(), making it unreliable in some installations, the following regular expression was used instead: preg_match("/[^0-9]/", $n)
  • Deprecated: APPVER has been deprecated and replaced with CI_VERSION for clarity.

Version 1.5.3

Release Date: April 15, 2007

  • Added array to string into the profiler
  • Code Igniter references updated to CodeIgniter
  • pMachine references updated to EllisLab
  • Fixed a bug in the repeater function of string helper.
  • Fixed a bug in ODBC driver
  • Fixed a bug in result_array() that was returning an empty array when no result is produced.
  • Fixed a bug in the redirect function of the url helper.
  • Fixed an undefined variable in Loader
  • Fixed a version bug in the Postgres driver
  • Fixed a bug in the textarea function of the form helper for use with strings
  • Fixed doc typos.

Version 1.5.2

Release Date: February 13, 2007

  • Added subversion information to the downloads page.
  • Added support for captions in the Table Library
  • Fixed a bug in the download_helper that was causing Internet Explorer to load rather than download
  • Fixed a bug in the Active Record Join function that was not taking table prefixes into consideration.
  • Removed unescaped variables in error messages of Input and Router classes
  • Fixed a bug in the Loader that was causing errors on Libraries loaded twice. A debug message is now silently made in the log.
  • Fixed a bug in the form helper that gave textarea a value attribute
  • Fixed a bug in the Image Library that was ignoring resizing the same size image
  • Fixed some doc typos.

Version 1.5.1

Release Date: November 23, 2006

  • Added support for submitting arrays of libraries in the $this->load->library function.
  • Added support for naming custom library files in lower or uppercase.
  • Fixed a bug related to output buffering.
  • Fixed a bug in the active record class that was not resetting query data after a completed query.
  • Fixed a bug that was suppressing errors in controllers.
  • Fixed a problem that can cause a loop to occur when the config file is missing.
  • Fixed a bug that occurred when multiple models were loaded with the third parameter set to TRUE.
  • Fixed an oversight that was not unsetting globals properly in the input sanitize function.
  • Fixed some bugs in the Oracle DB driver.
  • Fixed an incorrectly named variable in the MySQLi result driver.
  • Fixed some doc typos.

Version 1.5.0.1

Release Date: October 31, 2006

  • Fixed a problem in which duplicate attempts to load helpers and classes were not being stopped.
  • Fixed a bug in the word_wrap() helper function.
  • Fixed an invalid color Hex number in the Profiler class.
  • Fixed a corrupted image in the user guide.

Version 1.5.0

Release Date: October 30, 2006

  • Added DB utility class, permitting DB backups, CVS or XML files from DB results, and various other functions.
  • Added Database Caching Class.
  • Added transaction support to the database classes.
  • Added Profiler Class which generates a report of Benchmark execution times, queries, and POST data at the bottom of your pages.
  • Added User Agent Library which allows browsers, robots, and mobile devises to be identified.
  • Added HTML Table Class , enabling tables to be generated from arrays or database results.
  • Added Zip Encoding Library.
  • Added FTP Library.
  • Added the ability to extend libraries and extend core classes, in addition to being able to replace them.
  • Added support for storing models within sub-folders.
  • Added Download Helper.
  • Added simple_query() function to the database classes
  • Added standard_date() function to the Date Helper.
  • Added $query->free_result() to database class.
  • Added $query->list_fields() function to database class
  • Added $this->db->platform() function
  • Added new File Helper: get_filenames()
  • Added new helper: Smiley Helper
  • Added support for <ul> and <ol> lists in the HTML Helper
  • Added the ability to rewrite short tags on-the-fly, converting them to standard PHP statements, for those servers that do not support short tags. This allows the cleaner syntax to be used regardless of whether it's supported by the server.
  • Added the ability to rename or relocate the "application" folder.
  • Added more thorough initialization in the upload class so that all class variables are reset.
  • Added "is_numeric" to validation, which uses the native PHP is_numeric function.
  • Improved the URI handler to make it more reliable when the $config['uri_protocol'] item is set to AUTO.
  • Moved most of the functions in the Controller class into the Loader class, allowing fewer reserved function names for controllers when running under PHP 5.
  • Updated the DB Result class to return an empty array when $query->result() doesn't produce a result.
  • Updated the input->cookie() and input->post() functions in Input Class to permit arrays contained cookies that are arrays to be run through the XSS filter.
  • Documented three functions from the Validation class that were missing from the user guide: set_select(), set_radio(), and set_checkbox().
  • Fixed a bug in the Email class related to SMTP Helo data.
  • Fixed a bug in the word wrapping helper and function in the email class.
  • Fixed a bug in the validation class.
  • Fixed a bug in the typography helper that was incorrectly wrapping block level elements in paragraph tags.
  • Fixed a problem in the form_prep() function that was double encoding entities.
  • Fixed a bug that affects some versions of PHP when output buffering is nested.
  • Fixed a bug that caused CI to stop working when the PHP magic __get() or __set() functions were used within models or controllers.
  • Fixed a pagination bug that was permitting negative values in the URL.
  • Fixed an oversight in which the Loader class was not allowed to be extended.
  • Changed _get_config() to get_config() since the function is not a private one.
  • Deprecated "init" folder. Initialization happens automatically now. Please see documentation.
  • Deprecated $this->db->field_names() USE $this->db->list_fields()
  • Deprecated the $config['log_errors'] item from the config.php file. Instead, $config['log_threshold'] can be set to "0" to turn it off.

Version 1.4.1

Release Date: September 21, 2006

  • Added a new feature that passes URI segments directly to your function calls as parameters. See the Controllers page for more info.
  • Added support for a function named _output(), which when used in your controllers will received the final rendered output from the output class. More info in the Controllers page.
  • Added several new functions in the URI Class to let you retrieve and manipulate URI segments that have been re-routed using the URI Routing feature. Previously, the URI class did not permit you to access any re-routed URI segments, but now it does.
  • Added $this->output->set_header() function, which allows you to set server headers.
  • Updated plugins, helpers, and language classes to allow your application folder to contain its own plugins, helpers, and language folders. Previously they were always treated as global for your entire installation. If your application folder contains any of these resources they will be used instead the global ones.
  • Added Inflector helper.
  • Added element() function in the array helper.
  • Added RAND() to active record orderby() function.
  • Added delete_cookie() and get_cookie() to Cookie helper, even though the input class has a cookie fetching function.
  • Added Oracle database driver (still undergoing testing so it might have some bugs).
  • Added the ability to combine pseudo-variables and php variables in the template parser class.
  • Added output compression option to the config file.
  • Removed the is_numeric test from the db->escape() function.
  • Fixed a MySQLi bug that was causing error messages not to contain proper error data.
  • Fixed a bug in the email class which was causing it to ignore explicitly set alternative headers.
  • Fixed a bug that was causing a PHP error when the Exceptions class was called within the get_config() function since it was causing problems.
  • Fixed an oversight in the cookie helper in which the config file cookie settings were not being honored.
  • Fixed an oversight in the upload class. An item mentioned in the 1.4 changelog was missing.
  • Added some code to allow email attachments to be reset when sending batches of email.
  • Deprecated the application/scripts folder. It will continue to work for legacy users, but it is recommended that you create your own libraries or models instead. It was originally added before CI had user libraries or models, but it's not needed anymore.
  • Deprecated the $autoload['core'] item from the autoload.php file. Instead, please now use: $autoload['libraries']
  • Deprecated the following database functions: $this->db->smart_escape_str() and $this->db->fields().

Version 1.4.0

Release Date: September 17, 2006

  • Added Hooks feature, enabling you to tap into and modify the inner workings of the framework without hacking the core files.
  • Added the ability to organize controller files into sub-folders. Kudos to Marco for suggesting this (and the next two) feature.
  • Added regular expressions support for routing rules.
  • Added the ability to remap function calls within your controllers.
  • Added the ability to replace core system classes with your own classes.
  • Added support for % character in URL.
  • Added the ability to supply full URLs using the anchor() helper function.
  • Added mode parameter to file_write() helper.
  • Added support for changing the port number in the Postgres driver.
  • Moved the list of "allowed URI characters" out of the Router class and into the config file.
  • Moved the MIME type array out of the Upload class and into its own file in the applications/config/ folder.
  • Updated the Upload class to allow the upload field name to be set when calling do_upload().
  • Updated the Config Library to be able to load config files silently, and to be able to assign config files to their own index (to avoid collisions if you use multiple config files).
  • Updated the URI Protocol code to allow more options so that URLs will work more reliably in different environments.
  • Updated the form_open() helper to allow the GET method to be used.
  • Updated the MySQLi execute() function with some code to help prevent lost connection errors.
  • Updated the SQLite Driver to check for object support before attempting to return results as objects. If unsupported it returns an array.
  • Updated the Models loader function to allow multiple loads of the same model.
  • Updated the MS SQL driver so that single quotes are escaped.
  • Updated the Postgres and ODBC drivers for better compatibility.
  • Removed a strtolower() call that was changing URL segments to lower case.
  • Removed some references that were interfering with PHP 4.4.1 compatibility.
  • Removed backticks from Postgres class since these are not needed.
  • Renamed display() to _display() in the Output class to make it clear that it's a private function.
  • Deprecated the hash() function due to a naming conflict with a native PHP function with the same name. Please use dohash() instead.
  • Fixed an bug that was preventing the input class from unsetting GET variables.
  • Fixed a router bug that was making it too greedy when matching end segments.
  • Fixed a bug that was preventing multiple discrete database calls.
  • Fixed a bug in which loading a language file was producing a "file contains no data" message.
  • Fixed a session bug caused by the XSS Filtering feature inadvertently changing the case of certain words.
  • Fixed some missing prefixes when using the database prefix feature.
  • Fixed a typo in the Calendar class (cal_november).
  • Fixed a bug in the form_checkbox() helper.
  • Fixed a bug that was allowing the second segment of the URI to be identical to the class name.
  • Fixed an evaluation bug in the database initialization function.
  • Fixed a minor bug in one of the error messages in the language class.
  • Fixed a bug in the date helper timespan function.
  • Fixed an undefined variable in the DB Driver class.
  • Fixed a bug in which dollar signs used as binding replacement values in the DB class would be treated as RegEx back-references.
  • Fixed a bug in the set_hash() function which was preventing MD5 from being used.
  • Fixed a couple bugs in the Unit Testing class.
  • Fixed an incorrectly named variable in the Validation class.
  • Fixed an incorrectly named variable in the URI class.
  • Fixed a bug in the config class that was preventing the base URL from being called properly.
  • Fixed a bug in the validation class that was not permitting callbacks if the form field was empty.
  • Fixed a problem that was preventing scaffolding from working properly with MySQLi.
  • Fixed some MS SQL bugs.
  • Fixed some doc typos.

Version 1.3.3

Release Date: June 1, 2006

  • Models do not connect automatically to the database as of this version. More info here.
  • Updated the Sessions class to utilize the active record class when running session related queries. Previously the queries assumed MySQL syntax.
  • Updated alternator() function to re-initialize when called with no arguments, allowing multiple calls.
  • Fixed a bug in the active record "having" function.
  • Fixed a problem in the validation class which was making checkboxes be ignored when required.
  • Fixed a bug in the word_limiter() helper function. It was cutting off the fist word.
  • Fixed a bug in the xss_clean function due to a PHP bug that affects some versions of html_entity_decode.
  • Fixed a validation bug that was preventing rules from being set twice in one controller.
  • Fixed a calendar bug that was not letting it use dynamically loaded languages.
  • Fixed a bug in the active record class when using WHERE clauses with LIKE
  • Fixed a bug in the hash() security helper.
  • Fixed some typos.

Version 1.3.2

Release Date: April 17, 2006

  • Changed the behavior of the validation class such that if a "required" rule is NOT explicitly stated for a field then all other tests get ignored.
  • Fixed a bug in the Controller class that was causing it to look in the local "init" folder instead of the main system one.
  • Fixed a bug in the init_pagination file. The $config item was not being set correctly.
  • Fixed a bug in the auto typography helper that was causing inconsistent behavior.
  • Fixed a couple bugs in the Model class.
  • Fixed some documentation typos and errata.

Version 1.3.1

Release Date: April 11, 2006

  • Added a Unit Testing Library.
  • Added the ability to pass objects to the insert() and update() database functions. This feature enables you to (among other things) use your Model class variables to run queries with. See the Models page for details.
  • Added the ability to pass objects to the view loading function: $this->load->view('my_view', $object);
  • Added getwhere function to Active Record class.
  • Added count_all function to Active Record class.
  • Added language file for scaffolding and fixed a scaffolding bug that occurs when there are no rows in the specified table.
  • Added $this->db->last_query(), which allows you to view your last query that was run.
  • Added a new mime type to the upload class for better compatibility.
  • Changed how cache files are read to prevent PHP errors if the cache file contains an XML tag, which PHP wants to interpret as a short tag.
  • Fixed a bug in a couple of the active record functions (where and orderby).
  • Fixed a bug in the image library when realpath() returns false.
  • Fixed a bug in the Models that was preventing libraries from being used within them.
  • Fixed a bug in the "exact_length" function of the validation class.
  • Fixed some typos in the user guide

Version 1.3

Release Date: April 3, 2006

  • Added support for Models.
  • Redesigned the database libraries to support additional RDBMs (Postgres, MySQLi, etc.).
  • Redesigned the Active Record class to enable more varied types of queries with simpler syntax, and advanced features like JOINs.
  • Added a feature to the database class that lets you run custom function calls.
  • Added support for private functions in your controllers. Any controller function name that starts with an underscore will not be served by a URI request.
  • Added the ability to pass your own initialization parameters to your custom core libraries when using $this->load->library()
  • Added support for running standard query string URLs. These can be optionally enabled in your config file.
  • Added the ability to specify a "suffix", which will be appended to your URLs. For example, you could add .html to your URLs, making them appear static. This feature is enabled in your config file.
  • Added a new error template for use with native PHP errors.
  • Added "alternator" function in the string helpers.
  • Removed slashing from the input class. After much debate we decided to kill this feature.
  • Change the commenting style in the scripts to the PEAR standard so that IDEs and tools like phpDocumenter can harvest the comments.
  • Added better class and function name-spacing to avoid collisions with user developed classes. All CodeIgniter classes are now prefixed with CI_ and all controller methods are prefixed with _ci to avoid controller collisions. A list of reserved function names can be found here.
  • Redesigned how the "CI" super object is referenced, depending on whether PHP 4 or 5 is being run, since PHP 5 allows a more graceful way to manage objects that utilizes a bit less resources.
  • Deprecated: $this->db->use_table() has been deprecated. Please read the Active Record page for information.
  • Deprecated: $this->db->smart_escape_str() has been deprecated. Please use this instead: $this->db->escape()
  • Fixed a bug in the exception handler which was preventing some PHP errors from showing up.
  • Fixed a typo in the URI class. $this->total_segment() should be plural: $this->total_segments()
  • Fixed some typos in the default calendar template
  • Fixed some typos in the user guide

Version 1.2

Release Date: March 21, 2006

  • Redesigned some internal aspects of the framework to resolve scoping problems that surfaced during the beta tests. The problem was most notable when instantiating classes in your constructors, particularly if those classes in turn did work in their constructors.
  • Added a global function named get_instance() allowing the main CodeIgniter object to be accessible throughout your own classes.
  • Added new File Helper: delete_files()
  • Added new URL Helpers: base_url(), index_page()
  • Added the ability to create your own core libraries and store them in your local application directory.
  • Added an overwrite option to the Upload class, enabling files to be overwritten rather than having the file name appended.
  • Added Javascript Calendar plugin.
  • Added search feature to user guide. Note: This is done using Google, which at the time of this writing has not crawled all the pages of the docs.
  • Updated the parser class so that it allows tag pars within other tag pairs.
  • Fixed a bug in the DB "where" function.
  • Fixed a bug that was preventing custom config files to be auto-loaded.
  • Fixed a bug in the mysql class bind feature that prevented question marks in the replacement data.
  • Fixed some bugs in the xss_clean function

Version Beta 1.1

Release Date: March 10, 2006

  • Added a Calendaring class.
  • Added support for running multiple applications that share a common CodeIgniter backend.
  • Moved the "uri protocol" variable from the index.php file into the config.php file
  • Fixed a problem that was preventing certain function calls from working within constructors.
  • Fixed a problem that was preventing the $this->load->library function from working in constructors.
  • Fixed a bug that occurred when the session class was loaded using the auto-load routine.
  • Fixed a bug that can happen with PHP versions that do not support the E_STRICT constant
  • Fixed a data type error in the form_radio function (form helper)
  • Fixed a bug that was preventing the xss_clean function from being called from the validation class.
  • Fixed the cookie related config names, which were incorrectly specified as $conf rather than $config
  • Fixed a pagination problem in the scaffolding.
  • Fixed a bug in the mysql class "where" function.
  • Fixed a regex problem in some code that trimmed duplicate slashes.
  • Fixed a bug in the br() function in the HTML helper
  • Fixed a syntax mistake in the form_dropdown function in the Form Helper.
  • Removed the "style" attributes form the form helpers.
  • Updated the documentation. Added "next/previous" links to each page and fixed various typos.

Version Beta 1.0

Release Date: February 28, 2006

First publicly released version.

翻译贡献者: Hex, yygcom
最后修改: 2009-09-12 15:44:32

上一个主题: 许可协议 · 页首 · 用户指南首页 · 下一个主题: 关于 CodeIgniter


应用程序流程

CodeIgniter 中国首页 › 用户指南首页 › 应用程序流程
搜索用户指南
查看原文

应用程序流程图

下图说明数据流如何贯穿整个系统：

  1. index.php 作为前端控制器，初始化运行 CodeIgniter 所需要的基本资源。
  2. Router 检查 HTTP 请求，以确定谁来处理请求。
  3. 如果缓存(Cache)文件存在，它将绕过通常的系统执行顺序，被直接发送给浏览器。
  4. 安全(Security)。应用程序控制器(Application Controller)装载之前，HTTP 请求和任何用户提交的数据将被过滤。
  5. 控制器(Controller)装载模型、核心库、插件、辅助函数，以及任何处理特定请求所需的其它资源。
  6. 最终视图(View)渲染发送到 Web 浏览器中的内容。如果开启缓存(Caching)，视图首先被缓存，所以将可用于以后的请求。

翻译贡献者: Hex
最后修改: 2008-09-08 16:40:49

上一个主题: CodeIgniter 特性 · 页首 · 用户指南首页 · 下一个主题: 模型-视图-控制器


特性

CodeIgniter 中国首页 › 用户指南首页 › 特性
搜索用户指南
查看原文

CodeIgniter 特性

开发框架优秀与否与它有多少特性没有太大的关系。你从特性中不能推断出用户的体验、不能体验到框架设计是不是直接了当，是不是智能。特性也不能告诉你框架代码的质量如何、性能如何、细节处理的如何、安全性如何。判断一个框架的唯一办法是在使用中了解它。安装CodeIgniter很简单，所以，请你使用它。CodeIgniter的主要特性如下：

  • 基于 MVC 体系
  • 兼容 PHP 4
  • 超轻量级
  • 对数种数据库平台的全特性支持的数据库类
  • Active Record 支持
  • 表单与数据验证
  • 安全性与 XSS 过滤
  • Session 管理
  • 邮件发送类，支持附件，HTML 或文本邮件，多协议(sendmail, SMTP 和 Mail)及更多。
  • 图像处理类库(剪裁，缩放，旋转等)。支持 GD，ImageMagick 和 BetPBM
  • 文件上传类
  • FTP 类
  • 本地化
  • 分页
  • 数据加密
  • 基准测试
  • 全页面缓存
  • 错误日志
  • 应用程序评测
  • 脚手架(Scaffolding)
  • 日历类
  • User-Agent 类
  • Zip 编码类
  • 模板引擎类
  • Trackback 类
  • XML-RPC 类库
  • 单元测试类
  • “搜索引擎友好”的 URL
  • 灵活的 URI 路由
  • 支持勾子，类扩展及插件
  • 大量的辅助函数

翻译贡献者: architectcom, Hex, iptton
最后修改: 2009-09-12 15:39:09

上一个主题: CodeIgniter 速记表 · 页首 · 用户指南首页 · 下一个主题: 应用程序流程图


目标

CodeIgniter 中国首页 › 用户指南首页 › 目标
搜索用户指南
查看原文

设计和架构目标

CodeIgniter 的目标是在最小化，最轻量级的开发包中得到最大的执行效率、功能和灵活性。

为了达到这个目标，我们在开发过程的每一步都致力于基准测试、重构和简化工作，拒绝加入任何对实现目标没有帮助的东西。

从技术和架构角度看，CodeIgniter 按照下列目标创建：

  • 动态实例化。在 CodeIgniter 中，组件的导入和函数的执行只有在被要求的时候才执行，而不是在全局范围。除了最小的核心资源外，不假设系统需要任何资源，因此缺省的系统非常轻量级。被 HTTP 请求所触发的事件，以及你设计的控制器和视图将决定它们什么时候被引用。
  • 松耦合。耦合是指一个系统的组件之间的相关程度。越少的组件相互依赖那么这个系统的重用性和灵活性就越好。我们的目标是一个非常松耦合的系统。
  • 组件专一性。专一是指组件有一个非常小的专注目标。在 CodeIgniter 里，为了达到最大的用途，每个类和它的功能都是高度自治的。

CodeIgniter 是一个动态实例化，高度组件专一性的松耦合系统。它在小巧的基础上力求做到简单、灵活和高性能。

翻译贡献者: 85868405, Hex
最后修改: 2009-02-22 01:37:53

上一个主题: 模型-视图-控制器 · 页首 · 用户指南首页 · 下一个主题: 开始


MVC

CodeIgniter 中国首页 › 用户指南首页 › MVC
搜索用户指南
查看原文

模型-视图-控制器

CodeIgniter 是基于模型-视图-控制器这一设计模式的。MVC 是一种将应用程序的逻辑层和表现层进行分离的方法。在实践中，由于表现层从 PHP 脚本中分离了出来，所以它允许你的网页中只包含很少的脚本。

  • 模型(Model)代表你的数据结构。通常来说，你的模型类将包含取出、插入、更新你的数据库资料这些功能。
  • 视图(View)是展示给用户的信息。一个视图通常是一个网页，但是在 CodeIgniter 中，一个视图也可以是一个页面片段，如页头、页尾。它还可以是一个 RSS 页面，或任何其它类型的“页面”。
  • 控制器(Controller)是模型、视图以及其他任何处理 HTTP 请求所必须的资源之间的中介，并生成网页。

CodeIgniter 在 MVC 使用上非常宽松，因此模型不是必需的。如果你不需要使用这种分离方式，或是发觉维护模型比你想象中的复杂很多，你可以不用理会它们而创建自己的应用程序，并最少化使用控制器和视图。CodeIgniter 也可以和你现有的脚本合并使用，或者允许自行开发此系统的核心库，其目的是，使你可以以最适合你的方式工作。

翻译贡献者: bigfat, Hex, irini, soyota
最后修改: 2008-12-08 10:18:00

上一个主题: 应用程序流程图 · 页首 · 用户指南首页 · 下一个主题: 架构目标


开始

CodeIgniter 中国首页 › 用户指南首页 › 开始
搜索用户指南
查看原文

CodeIgniter 将从这里开始

任何应用软件的学习都需要花费一定的精力。我们尽了自己最大的努力使大家在学习中少走弯路，并且充满乐趣。

第一步就是安装 CodeIgniter，然后阅读介绍部分的所有主题。

接下来按顺序阅读常规主题(请点击右上角的“目录”或点击目录页)里面的每一个内容。那里的每个内容都是承接前一个的，并且提供了方便实践的例子代码。

一旦你掌握了这些基础概念，你就可以浏览类库参考和辅助函数参考，学习如何使用类库和辅助函数文件了。

如果遇到了问题可以到我们的中国开发者社区寻找解答，同时，英文的 Wiki 里面也提供了其他用户所写的例子代码。

翻译贡献者: Hex
最后修改: 2008-11-09 02:05:13

页首 · 用户指南首页 · 下一个主题: CodeIgniter 是什么？


CodeIgniter 中国首页 › 用户指南首页 › CodeIgniter 速记表

CodeIgniter 速记表

类库参考

CodeIgniter Library Reference

辅助函数参考

CodeIgniter Library Reference

翻译贡献者: Hex
最后修改: 2009-09-12 13:17:00

上一个主题: CodeIgniter 是什么？ · 页首 · 用户指南首页 · 下一个主题: CodeIgniter 特性


Active Record 模式

CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › Active Record 模式
搜索用户指南
查看原文

Active Record 类

CodeIgniter 使用的是修改过的 Active Record 数据库模式。 这种模式是以较少的程序代码来实现信息在数据库中的获取，插入，更改。 有时只用一两行的代码就能完成对数据库的操作。 CodeIgniter 不需要每一个数据库表拥有自己的类。它提供了一个更简单的接口。

不只是简单，使用 Active Record 的一个主要的优点是允许你创建独立的数据库应用程序，因为查询语法是由数据库的适配器来产生的。它可以进行更安全的查询，因为系统会自动的对所有的输入值进行转义。

注意: 你如果想要写自己的查询表达式，可以在数据库配置文件中禁止这个类。同时相比 Active Record，使用核心数据库类库和适配器将会使用更少资源。

  • 选择数据
  • 插入数据
  • 更新数据
  • 删除数据
  • 链式方法
  • Active Record 缓存

选择数据

下面的函数帮助你构建 SQL SELECT语句。

备注：如果你正在使用 PHP5，你可以在复杂情况下使用链式语法。本页面底部有具体描述。

$this->db->get();

运行选择查询语句并且返回结果集。可以获取一个表的全部数据。

$query = $this->db->get('mytable');

// Produces: SELECT * FROM mytable

第二和第三个参数允许你设置一个结果集每页纪录数(limit)和结果集的偏移(offset)

$query = $this->db->get('mytable', 10, 20);

// Produces: SELECT * FROM mytable LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)

注意：第二参数是每页纪录数，第三个参数是偏移

你会注意到上面的函数由一个变量$query执行，这个$query可以用来显示结果集。

$query = $this->db->get('mytable');

foreach ($query->result() as $row)
{
    echo $row->title;
}

请访问查询结果页查看详细的生成结果的方法。

$this->db->get_where();

跟上面的函数一样，只是它允许你在函数的第二个参数那里添加一个 where 从句，从而不用使用 db->where() 这个函数：

$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);

请阅读下面的 where 函数了解更多。

注意: get_where() 在以前的版本中写作 getwhere()，这是已经过时的用法。

$this->db->select();

允许你在SQL查询中写 SELECT 部分:

$this->db->select('title, content, date');

$query = $this->db->get('mytable');

// Produces: SELECT title, content, date FROM mytable

注意: 如果你你要查询表中的所有行，你可以不用写这个函数。省略后，CodeIgniter 会认为你要查询 全部行(SELECT *)。

$this->db->select() 可接受一个可选的第二个参数。如果你把它设为FALSE， CodeIgniter 将不会使用反引号保护你的字段或者表名 。这在进行复合查询时很有用。

$this->db->select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid', FALSE);
$query = $this->db->get('mytable');

$this->db->select_max();

为你的查询编写一个 "SELECT MAX(field)"。你可以选择性的给出第二个参数，以便重命名结果字段名。

$this->db->select_max('age');
$query = $this->db->get('members');
// Produces: SELECT MAX(age) as age FROM members

$this->db->select_max('age', 'member_age');
$query = $this->db->get('members');
// Produces: SELECT MAX(age) as member_age FROM members

$this->db->select_min();

为你的查询编写一个 "SELECT MIN(field)" 。与 select_max() 相似, 你可以选择性地给出第二个参数，用来给结果字段重命名。

$this->db->select_min('age');
$query = $this->db->get('members');
// 生成: SELECT MIN(age) as age FROM members

$this->db->select_avg();

为你的查询编写一个 "SELECT AVG(field)" 。与 select_max() 相似, 你可以选择性地给出第二个参数，用来给结果字段重命名。

$this->db->select_avg('age');
$query = $this->db->get('members');
// 生成: SELECT AVG(age) as age FROM members

$this->db->select_sum();

为你的查询编写一个 "SELECT SUM(field)" 。与 select_max() 相似, 你可以选择性地给出第二个参数，用来给结果字段重命名。

$this->db->select_sum('age');
$query = $this->db->get('members');
// 生成: SELECT SUM(age) as age FROM members

$this->db->from();

允许你编写查询中的FROM部分:

$this->db->select('title, content, date');
$this->db->from('mytable');

$query = $this->db->get();

// 生成: SELECT title, content, date FROM mytable

说明: 正如前面所说，查询中的FROM部分可以在 $this->db->get() 函数中指定，所以你可以根据自己的喜好来选择使用哪个方法。

$this->db->join();

允许你编写查询中的JOIN部分:

$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

如果你想要在查询中使用多个连接，可以多次调用本函数。

如果你需要使用除自然连接(natural join)之外的其它连接，你可以通过本函数的第三个参数来指定。可选项包括：left, right, outer, inner, left outer, 以及 right outer.

$this->db->join('comments', 'comments.id = blogs.id', 'left');

// 生成: LEFT JOIN comments ON comments.id = blogs.id

$this->db->where();

本函数允许你使用四种方法中的一种来设置 WHERE 子句:

说明: 传递给本函数的所有值都会被自动转义，以便生成安全的查询。

  1. 简单的 key/value 方法: $this->db->where('name', $name);

    // 生成: WHERE name = 'Joe'

    请注意等号已经为你添加。

    如果你多次调用本函数，那么这些条件会被 AND 连接起来:

    $this->db->where('name', $name);
    $this->db->where('title', $title);
    $this->db->where('status', $status);

    // WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
  2. 自定义 key/value 方法:

    你可以在第一个参数中包含一个运算符，以便控制比较:

    $this->db->where('name !=', $name);
    $this->db->where('id <', $id);

    // 生成: WHERE name != 'Joe' AND id < 45
  3. 关联数组方法: $array = array('name' => $name, 'title' => $title, 'status' => $status);

    $this->db->where($array);

    // 生成: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'

    使用这个方法时你也可以包含运算符:

    $array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);

    $this->db->where($array);
  4. 自定义字符串:

    你可以手动的编写子句:

    $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();

本函数与上面的那个几乎完全相同，唯一的区别是本函数生成的子句是用 OR 来连接的:

$this->db->where('name !=', $name);
$this->db->or_where('id >', $id);

// 生成: WHERE name != 'Joe' OR id > 50

说明: or_where() 以前被叫作 orwhere(), 后者已经过时。

$this->db->where_in();

生成一段 WHERE field IN ('item', 'item') 查询语句，如果合适的话，用 AND 连接起来。

$names = array('Frank', 'Todd', 'James');
$this->db->where_in('username', $names);
// 生成: WHERE username IN ('Frank', 'Todd', 'James')

$this->db->or_where_in();

生成一段 WHERE field IN ('item', 'item') 查询语句，如果合适的话，用 OR 连接起来。

$names = array('Frank', 'Todd', 'James');
$this->db->or_where_in('username', $names);
// 生成: OR username IN ('Frank', 'Todd', 'James')

$this->db->where_not_in();

生成一段 WHERE field NOT IN ('item', 'item') 查询语句，如果合适的话，用 AND 连接起来。

$names = array('Frank', 'Todd', 'James');
$this->db->where_not_in('username', $names);
// 生成: WHERE username NOT IN ('Frank', 'Todd', 'James')

$this->db->or_where_not_in();

生成一段 WHERE field NOT IN ('item', 'item') 查询语句，如果合适的话，用 OR 连接起来。

$names = array('Frank', 'Todd', 'James');
$this->db->or_where_not_in('username', $names);
// 生成: OR username NOT IN ('Frank', 'Todd', 'James')

$this->db->like();

本函数允许你生成 LIKE 子句，在做查询时非常有用。

说明: 传递给本函数的所有值都会被自动转义。

  1. 简单 key/value 方式: $this->db->like('title', 'match');

    // 生成: WHERE title LIKE '%match%'

    如果你多次调用本函数，那么这些条件将由 AND 连接起来:

    $this->db->like('title', 'match');
    $this->db->like('body', 'match');

    // WHERE title LIKE '%match%' AND body LIKE '%match%'     如果你想要控制通配符(%)所出现的位置，你可以使用可选的第三个参数。可用的选项是 'before', 'after' 以及 'both' (这是默认值)。 $this->db->like('title', 'match', 'before');
    // 生成: WHERE title LIKE '%match'

    $this->db->like('title', 'match', 'after');
    // 生成: WHERE title LIKE 'match%'

    $this->db->like('title', 'match', 'both');
    // 生成: WHERE title LIKE '%match%'
  2. 关联数组方式:

 $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->or_like();

本函数与上面那个函数几乎完全相同，唯一的区别是多个实例之间是用 OR 连接起来的:

$this->db->like('title', 'match');
$this->db->or_like('body', $match);

// WHERE title LIKE '%match%' OR body LIKE '%match%'

说明: or_like() 曾经被称为 orlike(), 后者已经过时。

$this->db->not_like();

本函数与 like() 几乎完全相同，唯一的区别是它生成 NOT LIKE 语句:

$this->db->not_like('title', 'match');

// WHERE title NOT LIKE '%match%

$this->db->or_not_like();

本函数与 not_like() 几乎完全相同，唯一的区别是多个实例之间是用 OR 连接起来的:

$this->db->like('title', 'match');
$this->db->or_not_like('body', 'match');

// WHERE title LIKE '%match%' OR body NOT LIKE '%match%'

$this->db->group_by();

允许你编写查询语句中的 GROUP BY 部分:

$this->db->group_by("title");

// 生成: GROUP BY title

你也可以把多个值作为数组传递过去:

$this->db->group_by(array("title", "date"));

// 生成: GROUP BY title, date

说明: group_by() 曾经被称为 groupby(), 后者已经过时。

$this->db->distinct();

为查询语句添加 "DISTINCT" 关键字:

$this->db->distinct();
$this->db->get('table');

// 生成: SELECT DISTINCT * FROM table

$this->db->having();

允许你为你的查询语句编写 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->having('user_id', 45);
// 生成: HAVING `user_id` = 45 (在诸如MySQL等数据库中)
$this->db->having('user_id', 45, FALSE);
// 生成: HAVING user_id = 45

$this->db->or_having();

与 having() 函数几乎完全一样，唯一的区别是多个子句之间是用 "OR" 分隔的。

$this->db->order_by();

帮助你设置一个 ORDER BY 子句。第一个参数是你想要排序的字段名。第二个参数设置结果的顺序，可用的选项包括 asc (升序)或 desc(降序), 或 random(随机)。

$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

说明: order_by() 曾经被称为 orderby(), 后者已经过时。

说明: 目前 Oracle 和 MSSQL 的驱动还不支持随机排序，将被默认设置为 'ASC'(升序)。

$this->db->limit();

限制查询所返回的结果数量:

$this->db->limit(10);

// 生成: LIMIT 10

第二个参数设置的是结果偏移量。

$this->db->limit(10, 20);

// 生成: LIMIT 20, 10 (仅限MySQL中。其它数据库有稍微不同的语法)

$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

插入数据

$this->db->insert();

生成一条基于你所提供的数据的SQL插入字符串并执行查询。你可以向函数传递 数组 或一个 对象。下面是一个使用数组的例子：

$data = array(
               'title' => 'My title' ,
               'name' => 'My Name' ,
               'date' => 'My date'
            );

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

// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')

第一个参数包含表名，第二个是一个包含数据的关联数组。

下面是一个使用对象的例子：

/*
    class Myclass {
        var $title = 'My Title';
        var $content = 'My Content';
        var $date = 'My Date';
    }
*/

$object = new Myclass;

$this->db->insert('mytable', $object);

// Produces: INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')

第一个参数包含表名，第二个是一个对象。（原文有错：The first parameter will contain the table name, the second is an associative array of values.）

注意: 所有的值已经被自动转换为安全查询。

$this->db->set();

本函数使您能够设置inserts(插入)或updates(更新)值。

它可以用来代替那种直接传递数组给插入和更新函数的方式:

$this->db->set('name', $name);
$this->db->insert('mytable');

// 生成: INSERT INTO mytable (name) VALUES ('{$name}')

如果你多次调用本函数，它们会被合理地组织起来，这取决于你执行的是插入操作还是更新操作:

$this->db->set('name', $name);
$this->db->set('title', $title);
$this->db->set('status', $status);
$this->db->insert('mytable');

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');

或者一个对象也可以:

/*
    class Myclass {
        var $title = 'My Title';
        var $content = 'My Content';
        var $date = 'My Date';
    }
*/

$object = new Myclass;

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

更新数据

$this->db->update();

根据你提供的数据生成并执行一条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

或者你也可以传递一个对象:

/*
    class Myclass {
        var $title = 'My Title';
        var $content = 'My Content';
        var $date = 'My Date';
    }
*/

$object = new Myclass;

$this->db->where('id', $id);
$this->db->update('mytable', $object);

// 生成:
// UPDATE mytable
// SET title = '{$title}', name = '{$name}', date = '{$date}'
// WHERE id = $id

说明: 所有值都会被自动转义，以便生成安全的查询。

你会注意到 $this->db->where() 函数的用法，它允许你设置 WHERE 子句。你可以有选择性地将这一信息直接以字符串的形式传递给 update 函数:

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

或者是一个数组:

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

在进行更新时，你还可以使用上面所描述的 $this->db->set() 函数。

删除数据

$this->db->delete();

生成并执行一条DELETE(删除)语句。

$this->db->delete('mytable', array('id' => $id));

// 生成:
// DELETE FROM mytable
// WHERE id = $id

第一个参数是表名，第二个参数是where子句。你可以不传递第二个参数，使用 where() 或者 or_where() 函数来替代它:

$this->db->where('id', $id);
$this->db->delete('mytable');

// 生成:
// DELETE FROM mytable
// WHERE id = $id

如果你想要从一个以上的表中删除数据，你可以将一个包含了多个表名的数组传递给delete()函数。

$tables = array('table1', 'table2', 'table3');
$this->db->where('id', '5');
$this->db->delete($tables);

如果你想要删除表中的全部数据，你可以使用 truncate() 函数，或者 empty_table() 函数。

$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

说明: 如果 TRUNCATE 命令不可用，truncate() 将会以 "DELETE FROM table" 的方式执行。

链式方法

链式方法允许你以连接多个函数的方式简化你的语法。考虑一下这个范例:

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);

$query = $this->db->get();

说明: 链式方法只能在PHP 5下面运行。

Active Record 缓存

尽管不是 "真正的" 缓存，Active Record 允许你将查询的某个特定部分保存(或"缓存")起来，以便在你的脚本执行之后重用。一般情况下，当一次Active Record调用结束，所有已存储的信息都会被重置，以便下一次调用。如果开启缓存，你就可以使信息避免被重置，方便你进行重用。

缓存调用是累加的。如果你调用了两次有缓存的 select()，然后再调用两次没有缓存的 select()，这会导致 select() 被调用4次。有三个可用的缓存函数:

$this->db->start_cache()

本函数必须被用来开启缓存。所有类型正确的(下面给出了支持的查询类型) Active Record 查询都会被存储起来供以后使用。

$this->db->stop_cache()

本函数可以被用来停止缓存。

$this->db->flush_cache()

本函数从Active Record 缓存中删除全部项目。

这里是一个使用范例:

$this->db->start_cache();
$this->db->select('field1');
$this->db->stop_cache();

$this->db->get('tablename');

//Generates: SELECT `field1` FROM (`tablename`)

$this->db->select('field2');
$this->db->get('tablename');

//Generates: SELECT `field1`, `field2` FROM (`tablename`)

$this->db->flush_cache();

$this->db->select('field2');
$this->db->get('tablename');

//Generates: SELECT `field2` FROM (`tablename`)

说明: 下列语句能够被缓存: select, from, join, where, like, groupby, having, orderby, set

翻译贡献者: aykirk, Fanbin, Hex, huanxiangwu, imjie, thankwsx, yinzhili, zhangminghua218
最后修改: 2009-09-22 09:36:16

上一个主题: 查询辅助函数 · 页首 · 用户指南首页 · 下一个主题: 事务


CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 数据库缓存类

数据库缓存类

数据库缓存类允许你把数据库查询结果保存在文本文件中以减少数据库访问。

重要提示： 本类在激活后会随数据库驱动自动初始化。切勿手动加载。

另： 并非所有查询结果都能被缓存。请仔细阅读本页内容。

激活缓存

激活缓存需要三步：

  • 在服务器上创建一个可写的目录以便保存缓存文件。
  • 在文件 application/config/database.php 中设置其目录。
  • 激活缓存特性，可以在文件 application/config/database.php 中设置全局选项，也可以用以本页下面的方法手动设置。

一旦被激活，每一次含有数据库查询的页面被加载时缓存就会自动发生。

缓存如何工作？

当页面被浏览时CodeIgniter的查询缓存系统能够动态执行。如果缓存特性被激活，那么在此页面首次被加载时，数据库查询的结果对象将会被序列化并保存在你服务器的文本文件中。而页面再次被加载时缓存文件将会替代数据库查询。如此，在被缓存的页面中，你的数据库使用率会降至0。

只有 读类型(read-type) (SELECT) 查询会被缓存，因为只有这种查询会产生结果集。 写类型(Write-type) (INSERT, UPDATE, 等等) 查询，因为不会产生结果集，故缓存系统不对之进行缓存。

缓存文件不会过期，除非你删掉，否则任何被缓存了的查询会一直存在。缓存系统允许你按页面清除，或把所有缓存都清除掉。一般来说，你可以在某些事件(比如向数据库添加了数据)发生时用下面的函数来清除缓存。

缓存能够提升站点的性能吗？

缓存能否获得性能增益，取决于很多因素。如果您有一个负荷很少而高度优化的数据库，你可能不会看到性能提升。 如果您的数据库正在大量使用,您可能会看到缓存后带来的性能提升，前提是你的文件系统是并没有太多开销。(这里'CI中国社区'要补充一点:生成缓存以及索引缓存等一系列操作(缓存系统自身运算)也是存在开销的.) Remember that caching simply changes how your information is retrieved, shifting it from being a database operation to a file-system one.

在一些群集服务器环境，会出现这样的情况，因为文件系统的操作太过频繁,缓存无法正确生成。 在单一的服务器在共享的环境，高速缓存可能会是有益的。是否能有性能上的提升应还取决于您的数据库。这要看您的具体情况.

缓存文件如何存储？

CodeIgniter拥有每个 places the result of EACH query into its own cache file. Sets of cache files are further organized into sub-folders corresponding to your controller functions. To be precise, the sub-folders are named identically to the first two segments of your URI (the controller class name and function name).

For example, let's say you have a controller called blog with a function called comments that contains three queries. The caching system will create a cache folder called blog+comments, into which it will write three cache files.

If you use dynamic queries that change based on information in your URI (when using pagination, for example), each instance of the query will produce its own cache file. It's possible, therefore, to end up with many times more cache files than you have queries.

管理您的缓存文件

由于缓存文件不会过期，您需要在您的应用程序中写入删除缓存操作的代码。例如，假设您有一个博客，让用户发表评论。每当有新的评论被提交 您一定希望在某个控制器的方法中删除缓存文件与控制器的功能 . 你会发现如下两个删除功能的介绍，可以帮助您清除数据.

并非所有的数据库方法都带缓存

最后，我们需要指出的是，由于对象是缓存 是一个简化版本的全部结果对象。出于这一原因，一些不具备数据查询结果的方法不被缓存 如 插入 更新。.

下列方法不能和缓存搭配使用:

  • num_fields()
  • field_names()
  • field_data()
  • free_result()

同样, the two database resources (result_id and conn_id) are not available when caching, since result resources only pertain to run-time operations.

函数参考

$this->db->cache_on() / $this->db->cache_off()

可手动设置缓存开关。如果您想保留某些查询不被缓存 这个功能就十分有用。例如：:

// 打开缓存开关
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM mytable");

// 使下面这条查询不被缓存
$this->db->cache_off();
$query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");

// Turn caching back on
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM another_table");

$this->db->cache_delete()

删除缓存文件与特定网页。如果你需要清除缓存后，更新您的数据库.

缓存系统会在缓存存放目录中建立与被访问的URL所对应的子目录,同时把缓存文件存放在那个子目录中.缓存主目录就是您在application/config/database.php 里面设置的缓存目录. 例如, 如果您正在浏览地址为 example.com/index.php/blog/comments的页面, 缓存系统会把所有生成的缓存文件放进一个以 blog+comments做为名称的文件夹里. 如果您要删除关于刚才提到的这个例子与之对应的缓存文件 需要执行以下代码:

$this->db->cache_delete('blog', 'comments');

如果您不使用任何参数,目前的URI设置将决定什么时候应该清除/更新 该缓存.

$this->db->cache_delete_all()

清除所有所有的缓存文件。例子:

$this->db->cache_delete_all();

翻译贡献者: Hex, iptton, soyota, yz20sui
最后修改: 2009-02-21 17:05:20

上一个主题: 自定义函数调用 · 页首 · 用户指南首页 · 下一个主题: 数据库维护类


CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 自定义函数调用

自定义函数调用

$this->db->call_function();

这个函数可以允许你用一个独立的方法来调用一些 CodeIgniter 中没有定义的PHP数据库函数. 举个例子, 比如说你要调用 mysql_get_client_info() 这个 CodeIgniter 中并没有定义的函数, 你可以这样:

$this->db->call_function('get_client_info');

你必须提供一个没有 mysql_ 前缀的函数名来作为第一个参数, 这个前缀会根据当前正在使用的数据库类型来自动添加. 这样允许你可以在不同的数据库平台下使用同一个函数来操作. 当然了, 并不是所有数据库使用的函数都是一样的, 那么这个函数还是非常易用的.

任何你需要添加的其它参数都放在第一个参数后面.

$this->db->call_function('some_function', $param1, $param2, etc..);

通常情况下, 你会需要提供一个 connection ID 或是一个 result ID, connection ID 可以这样来获得:

$this->db->conn_id;

result ID 则包含在一个结果集(result object)中, 你可以这样来获得它:

$query = $this->db->query("SOME QUERY");

$query->result_id;

翻译贡献者: 498621, Hex
最后修改: 2008-04-07 11:22:37

上一个主题: 字段元数据 · 页首 · 用户指南首页 · 下一个主题: 查询缓存


CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 数据库配置

数据库配置

CodeIgniter 有一个配置文件让你存放数据库连接值（username:用户名，password:密码，database name:数据库名，等等..）. 配置文件位于以下路径:

application/config/database.php

配件文件存放在一个如下格式的一个多维数组里:

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

我们使用多维数组的原因是为了让你随意的存储多个连接值的设置。举例：如果你运行多个环境（development：开发、production：制作、test：测试 等等..），你能为每个环境建立独立的连接组，并在组直接进行切换。举例，设置一个"test"环境，你可以这样做：

$db['test']['hostname'] = "localhost";
$db['test']['username'] = "root";
$db['test']['password'] = "";
$db['test']['database'] = "database_name";
$db['test']['dbdriver'] = "mysql";
$db['test']['dbprefix'] = "";
$db['test']['pconnect'] = TRUE;
$db['test']['db_debug'] = FALSE;
$db['test']['cache_on'] = FALSE;
$db['test']['cachedir'] = "";
$db['test']['char_set'] = "utf8";
$db['test']['dbcollat'] = "utf8_general_ci";

那么，告诉系统使用"test"组，你可以设置位于配置文件中的变量：

$active_group = "test";

注意: "test"的名字是任意的，这可以让你自由设置，我们的主要连接默认使用"default"这个名字，当然，您可以基于您的项目为它起一个更有意义的名字。

Active Record

Active Record 类 可以通过数据库配置文件里的$active_record变量进行全局的设定（允许/禁止 TRUE/FALSE (boolean)）. 如果你不用这个类，哪么你可以通过将这个变量值设置成FALSE来减少在数据库类初始化时对电脑资源的消耗。

$active_record = TRUE;

注意： 一些CodeIgniter的类，例如Sessions，在执行一些函数的时候需要Active Records的支持。

参数解析:

  • hostname - 数据库的主机名，通常位于本机，可以表示为 "localhost".
  • username - 需要连接到数据库的用户名.
  • password - 登陆数据库的密码.
  • database - 你需要连接的数据库名.
  • dbdriver - 数据库类型。如：mysql、postgres、odbc 等。必须为小写字母。
  • dbprefix - 当运行Active Record查询时数据表的前缀,它允许在一个数据库上安装多个CodeIgniter程序.
  • pconnect - TRUE/FALSE (boolean) - 使用持续连接.
  • db_debug - TRUE/FALSE (boolean) - 显示数据库错误信息.
  • cache_on - TRUE/FALSE (boolean) - 数据库查询缓存是否开启，详情请见数据库缓存类。
  • cachedir - 数据库查询缓存目录所在的服务器绝对路径。
  • char_set - 与数据库通信时所使用的字符集。
  • dbcollat - 与数据库通信时所使用的字符规则(character collation )。
  • port - 数据库端口号. 当前只用于 Postgres 驱动程序. 要使用这个值，你应该添加一行代码到数据库配置数组。$db['default']['port'] = 5432;

提示: 并不是所有的值都是必须的,这取决与您所使用的数据库平台,如(MySQL, Postgres, 等.) 例如, 当你使用SQLite时,你不需要提供username 或 password, 数据库名字就是您数据库文件的路径. 以上内容假定您使用的是 MySQL 数据库.

翻译贡献者: Hex, pipi95, tanqimin, thankwsx, yinzhili
最后修改: 2009-07-14 15:04:13

上一个主题: 入门: 例子 · 页首 · 用户指南首页 · 下一个主题: 连接到你的数据库


连接

CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 连接
搜索用户指南
查看原文

连接你的数据库

有两种方法连接数据库：

自动连接

“自动连接” 功能将在每个一页面加载时被自动实例化数据库类。要启用“自动连接”，可在如下文件中的 library 数组里添加 database：

application/config/autoload.php

手动连接

如果仅仅是一部分页面要求数据库连接，你可以在你有需要的函数里手工添加如下代码或者在你的类里手工添加以供该类使用。

$this->load->database();

如果以上函数的第一个参数没有任何信息，它将会在系统指定的数据库配置文件中寻找，对多数人而言，这是一个首选的方法。

可用的参数

  1. 数据库连接值，用数组或DSN字符串传递。
  2. TRUE/FALSE (boolean)。是否返回连接ID (参阅下面的“连接多数据库”)。
  3. TRUE/FALSE (boolean)。是否启用 Active Record 类。默认设置为 TRUE。

手动连接到一个数据库

函数的第一个参数能够从你的配置文件中自由的指定你自定义的详细的数据库配置信息。或者你甚至可以不通过指定的配置文件来提交数据库的连接属性。 样例：

要从你的配置文件中选择一个指定的数组你可以这么做：

$this->load->database('group_name');

group_name指的是存在于你的配置文件中的带有数据库连接信息的数组的名字。

要手动连接你要求的数据库你可以通过定义以下数组来实现：

$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);

想得到每一个配置属性的详细信息可点击 这里.

或者你可以以DSN的方式提交数据库配置信息。 DSN必然通过以下方式实现：

$dsn = 'dbdriver://username:password@hostname/database';

$this->load->database($dsn);

当用 DSN 字符串连接时，要覆盖配置默认值，则添加配置变量为查询字符串。

$dsn = 'dbdriver://username:password@hostname/database?char_set=utf8&dbcollat=utf8_general_ci&cache_on=true&cachedir=/path/to/cache';

$this->load->database($dsn);

连接多数据库

如果你需要同时连接多于一个的数据库，你可以用以下方式来实现：

$DB1 = $this->load->database('group_one', TRUE);
$DB2 = $this->load->database('group_two', TRUE);

注意：改变 "group_one" 和 "group_two" 为你指定了连接属性的组名 (或者通过上边说过的连接数组的数组名)。

通过设置函数的第二个参数为TRUE(boolean)来返回一个数据库对象。

当你使用这种方法，你将用对象名来执行操作命令而不是用户向导模式，也就是说，你将用以下方式执行数据库操作：

$DB1->query();
$DB1->result();
etc...

而不是：

$this->db->query();
$this->db->result();
etc...

重新连接 / 保持连接有效

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

$this->db->reconnect();

翻译贡献者: Fanbin, Hex, lishen2, szlinz, thankwsx, xian366, yinzhili
最后修改: 2009-09-22 09:31:59

上一个主题: 数据库配置 · 页首 · 用户指南首页 · 下一个主题: 查询


数据库例子代码

CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 数据库例子代码
搜索用户指南
查看原文

数据库快速入门例子代码

下面的内容将简单说明怎样使用数据库。更详细的信息请阅读各个函数的单独介绍页面。

初始化数据库类

下面的代码将依据你的数据库配置载入并初始化数据库类:

$this->load->database();

一旦被载入，你可以在任何地方像这样使用它：

注意: 如果你的所有页面均要求初始化数据库类，你可以让它自动加载。详见 数据库连接。

多结果标准查询（对象形式）

$query = $this->db->query('SELECT name, title, email FROM my_table');

foreach ($query->result() as $row)
{
    echo $row->title;
    echo $row->name;
    echo $row->email;
}

echo 'Total Results: ' . $query->num_rows();

上面的result()函数返回一个对象的数组。例如：$row->title

多结果标准查询（数组形式）

$query = $this->db->query('SELECT name, title, email FROM my_table');

foreach ($query->result_array() as $row)
{
    echo $row['title'];
    echo $row['name'];
    echo $row['email'];
}

上面的result_array()函数返回一个带下标的数组。例如：$row['title']

测试查询结果

如果你的查询可能不返回结果，我们建议你先使用 num_rows()函数来测试:

$query = $this->db->query("YOUR QUERY");

if ($query->num_rows() > 0)
{
   foreach ($query->result() as $row)
   {
      echo $row->title;
      echo $row->name;
      echo $row->body;
   }
}

单结果标准查询（对象形式）

$query = $this->db->query('SELECT name FROM my_table LIMIT 1');

$row = $query->row();
echo $row->name;

上面的row()函数返回一个 对象。例如：$row->name

单结果标准查询（数组形式）

$query = $this->db->query('SELECT name FROM my_table LIMIT 1');

$row = $query->row_array();
echo $row['name'];

上面的row_array()函数返回一个 数组。例如：$row['name']

标准插入(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();

快捷查询

快捷查询类能为我们提供快速取得数据的途径:

$query = $this->db->get('table_name');

foreach ($query->result() as $row)
{
    echo $row->title;
}

上面的get()函数返回数据表中所有的结果。 快捷查询类 提供所有数据库操作的快捷函数。

快捷插入(insert)

$data = array(
               'title' => $title,
               'name' => $name,
               'date' => $date
            );

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

// Produces: INSERT INTO mytable (title, name, date) VALUES ('{$title}', '{$name}', '{$date}')

翻译贡献者: gaochao, Hex, longbill
最后修改: 2008-01-02 20:21:50

上一个主题: 数据库类 · 页首 · 用户指南首页 · 下一个主题: 数据库配置


字段元数据

CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 字段元数据
搜索用户指南
查看原文

字段数据

$this->db->list_fields()

Returns an array containing the field names. This query can be called two ways:

返回一个抉字段名称的数组。这个查询可以用两种方法调用：

1. You can supply the table name and call it from the $this->db-> object:

1.您可以将表名称提供给$this->db->调用。 $fields = $this->db->list_fields('table_name');

foreach ($fields as $field)
{
   echo $field;
}

2. You can gather the field names associated with any query you run by calling the function from your query result object:

2.您可以将组合查询语句传递给query函数执行并返回： $query = $this->db->query('SELECT * FROM some_table');

foreach ($query->list_fields() as $field)
{
   echo $field;
}

$this->db->field_exists()

Sometimes it's helpful to know whether a particular field exists before performing an action. Returns a boolean TRUE/FALSE. Usage example:

执行一个动作前确认字段是否存在时它就变得非常有用了。返回一个布尔值：TRUE/FALSE。实例： if ($this->db->field_exists('field_name', 'table_name'))
{
   // some code...
}

Note: Replace field_name with the name of the column you are looking for, and replace table_name with the name of the table you are looking for.

注解：替换field_name为您要查找人字段名称，同时替换table_name为您要查找表名。

$this->db->field_data()

Returns an array of objects containing field information.

返回一个包含字段名称信息的数组。

Sometimes it's helpful to gather the field names or other metadata, like the column type, max length, etc.

取得字段名称或者其它元数据时就变得非常有用了，例如列的数据类型、最大长度等。

Note: Not all databases provide meta-data.

注解：并非所有数据库都提供元数据。

Usage example:

例子： $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;
}

If you have run a query already you can use the result object instead of supplying the table name:

如果您想执行一个已有的查询时你可用返回项替换掉表格名称： $query = $this->db->query("YOUR QUERY");
$fields = $query->field_data();

The following data is available from this function if supported by your database:

如果这个函数支持您的数据库，它将会返回以下数据：
  • name - 列名称
  • max_length - 列的最大长度
  • primary_key - 1 如果此列被定义为主键
  • type - 指定列的数据类型

翻译贡献者: analyzer, Hex
最后修改: 2008-06-28 02:36:02

上一个主题: 数据库表数据 · 页首 · 用户指南首页 · 下一个主题: 自定义函数调用


CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 数据库维护类

数据库维护类

该类包含了一些帮助你管理数据库的函数。

目录

  • 初始化
  • 创建数据库
  • 删除数据库
  • 添加字段
  • 添加主键
  • 创建表
  • 删除表
  • 重命名表
  • 修改表

初始化

注意: 欲初始化数据库维护类，请确保你的数据库驱动已经运行，因为该类依赖于数据库驱动。

使用如下方法载入数据库维护类:

$this->load->dbforge()

一旦初始化，就可以使用$this->dbforge 对象访问类中函数:

$this->dbforge->some_function()

$this->dbforge->create_database('db_name')

允许你创建由第一个参数指定的数据库。根据成功或失败，返回 TRUE/FALSE:

if ($this->dbforge->create_database('my_db'))
{
    echo '数据库已经被创建!';
}

$this->dbforge->drop_database('db_name')

允许你删除由第一个参数指定的数据库。根据成功或失败，返回 TRUE/FALSE:

if ($this->dbforge->drop_database('my_db'))
{
    echo '数据库已经被删除!';
}

创建和删除表

创建表时有这么几件事需要你来完成。添加字段，添加主键和修改列。CodeIgniter提供如下方法完成这些操作。

添加字段

字段由关联数组创建。在数组中必须包含与字段数据类型相关的“类型”键。例如，INT,VARCHAR,TEXT等等。许多数据类型（如 VARCHAR）还需要“约束”键。

$fields = array(
                        'users' => array(
                                                 'type' => 'VARCHAR',
                                                 'constraint' => '100',
                                          ),
                );

// 当字段被添加后，将被翻译为 "users VARCHAR(100)" .

此外，还可以使用下列键/值:

  • unsigned/true: 在字段定义中生成“UNSIGNED”。
  • default/value: 在字段定义中生成一个缺省值。
  • null/true: 在字段定义中生成“NULL” 。没有这个，字段缺省为“NOT NULL”。
  • auto_increment/tue: 为字段生成自动增量标记。注意，字段类型必须支持自动增量标记，如整型。

$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,
                                          ),
                );

字段定义后，使用$this->dbforge->add_field($fields); 添加字段。接下来调用 create_table() 函数创建表。

$this->dbforge->add_field()

添加字段函数将接受上面这个数组。

传递字符串作为字段定义

如果你确切地知道自己要如何创建一个字段，你可以将字符串作为字段定义传递给 add_field():

$this->dbforge->add_field("label varchar(100) NOT NULL DEFAULT 'default label'");

说明: 多次调用 add_field() 是累加性的。

创建一个 id 字段

创建id字段有一种特殊的例外情况。一个id类型的字段将会被自动地赋值为 INT(9) 类型的自动递增主键。

$this->dbforge->add_field('id');
// 生成 id INT(9) NOT NULL AUTO_INCREMENT

添加键

一般来说，你会需要表中有键。这是通过 $this->dbforge->add_key('field') 来实现的。可选的第二个参数如果被设置为TRUE，那么就会生成一个主键。请注意 add_key() 后面必须调用 create_table()。

多列的非主键必须通过数组来传递。下面的示例输出是用于 MySQL 的。

$this->dbforge->add_key('blog_id', TRUE);
// 生成 PRIMARY KEY `blog_id` (`blog_id`)

$this->dbforge->add_key('blog_id', TRUE);
$this->dbforge->add_key('site_id', TRUE);
// 生成 PRIMARY KEY `blog_id_site_id` (`blog_id`, `site_id`)

$this->dbforge->add_key('blog_name');
// 生成 KEY `blog_name` (`blog_name`)

$this->dbforge->add_key(array('blog_name', 'blog_label'));
// 生成 KEY `blog_name_blog_label` (`blog_name`, `blog_label`)

创建表

声明了字段和键之后，你就可以使用下面的方法来创建一个表:

$this->dbforge->create_table('table_name');
// 生成 CREATE TABLE table_name

可选的第二个参数如果被设置为TRUE，那么，表的定义中就会添加 "IF NOT EXISTS" 子句

$this->dbforge->create_table('table_name', TRUE);
// 生成 CREATE TABLE IF NOT EXISTS table_name

删除表

执行一条 DROP TABLE 语句

$this->dbforge->drop_table('table_name');
// 生成 DROP TABLE IF EXISTS table_name

重命名表

执行一次表重命名

$this->dbforge->rename_table('old_table_name', 'new_table_name');
// 生成 ALTER TABLE old_table_name RENAME TO new_table_name

修改表

$this->dbforge->add_column()

这里的 add_column() 函数被用来修改一个已存在的表。 它接受与上面相同的数组参数，并可用于无限数量的附加字段。

$fields = array(
                        'preferences' => array('type' => 'TEXT')
);
$this->dbforge->add_column('table_name', $fields);

// 生成 ALTER TABLE table_name ADD preferences TEXT

$this->dbforge->drop_column()

用于从表中移除一个列。

$this->dbforge->drop_column('table_name', 'column_to_drop');

$this->dbforge->modify_column()

本函数的用法与 add_column() 几乎完全相同，唯一的区别在于，本函数的用途是修改一个已存在的列，而不是添加一个新的。要使用本函数，你必须在字段定义数组中添加一个 "name" 键。

$fields = array(
                        'old_name' => array(
                                                         'name' => 'new_name',
                                                         'type' => 'TEXT',
                                                ),
);
$this->dbforge->modify_column('table_name', $fields);

// 生成 ALTER TABLE table_name CHANGE old_name new_name TEXT

翻译贡献者: Hex, ianyang, yeto, yinzhili
最后修改: 2009-09-22 09:04:02

上一个主题: 数据库缓存类 · 页首 · 用户指南首页 · 下一个主题: 数据库工具类


CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 查询辅助函数

查询辅助函数

$this->db->insert_id()

The insert ID number when performing database inserts.

这个ID号是执行数据插入时的ID。

$this->db->affected_rows()

Displays the number of affected rows, when doing "write\" type queries (insert, update, etc.).

当执行写入操作（insert,update等）的查询后，显示被影响的行数。

Note: In MySQL "DELETE FROM TABLE" returns 0 affected rows. The database class has a small hack that allows it to return the correct number of affected rows. By default this hack is enabled but it can be turned off in the database driver file.

注意：在 MySQL 中“DELETE FROM TABLE”的被影响行数将会返回 0。database 类有一个小 hack 允许返回正确的被影响的行数。默认情况下这个 hack 功能是打开的但可以在数据库驱动文件中关闭它。

$this->db->count_all();

Permits you to determine the number of rows in a particular table. Submit the table name in the first parameter. Example:

计算出指定表的总行数并返回。在第一个参数中写入被提交的表名。例如： echo $this->db->count_all('my_table');

// Produces an integer, like 25

$this->db->platform()

Outputs the database platform you are running (MySQL, MS SQL, Postgres, etc...):

输出系统使用的数据库平台 echo $this->db->platform();

$this->db->version()

Outputs the database version you are running:

输出系统正在运行的数据库版本号 echo $this->db->version();

$this->db->last_query();

Returns the last query that was run (the query string, not the result). Example:

返回最后运行的查询（是查询语句，不是查询结果） $str = $this->db->last_query();

// Produces: SELECT * FROM sometable....

The following two functions help simplify the process of writing database INSERTs and UPDATEs.

下面的两个函数简化了写入数据库的insert和update函数。

$this->db->insert_string();

This function simplifies the process of writing database inserts. It returns a correctly formatted SQL insert string. Example:

这个函数简化了写入数据库的insert函数。它返回一个标准的SQL insert字符串。例如： $data = array('name' => $name, 'email' => $email, 'url' => $url);

$str = $this->db->insert_string('table_name', $data);

The first parameter is the table name, the second is an associative array with the data to be inserted. The above example produces:

第一个参数是表名，第二个是被插入数据的联合数组，上面的例子可以写成： INSERT INTO table_name (name, email, url) VALUES ('Rick', 'rick@example.com', 'example.com')

Note: Values are automatically escaped, producing safer queries.

注解：被插入的数据会被自动转换和过滤，生成安全的查询语句。

$this->db->update_string();

This function simplifies the process of writing database updates. It returns a correctly formatted SQL update string. Example:

这个函数简化了写入数据库的update函数。它返回一个标准的SQL update字符串。例如： $data = array('name' => $name, 'email' => $email, 'url' => $url);

$where = "author_id = 1 AND status = 'active'";

$str = $this->db->update_string('table_name', $data, $where);

The first parameter is the table name, the second is an associative array with the data to be updated, and the third parameter is the "where" clause. The above example produces:

第一个参数是表名，第二个是被更新数据的关联数组，第三个参数是“where”参数。上面的例子可以写成： UPDATE table_name SET name = 'Rick', email = 'rick@example.com', url = 'example.com' WHERE author_id = 1 AND status = 'active'

Note: Values are automatically escaped, producing safer queries.

注解：被插入的数据会被自动转换和过滤，生成安全的查询语句。

翻译贡献者: analyzer, Hex
最后修改: 2009-02-21 17:28:52

上一个主题: 查询结果 · 页首 · 用户指南首页 · 下一个主题: Active Record 模式


数据库类库

CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 数据库类库
搜索用户指南
查看原文

数据库类

CodeIgniter 内置了速度快、功能强大的数据库类作为数据库的中间抽象层。数据库类支持传统架构以及 Active Record 架构。类中的数据库函数使用简单明了的语法。

  • 入门：用法举例
  • 数据库配置
  • 连接数据库
  • 查询
  • 生成查询结果
  • 查询辅助函数
  • Active Record 类
  • 事务
  • 表格元数据
  • 字段元数据
  • 自定义函数调用
  • 查询缓存
  • 数据库维护类
  • 数据库工具类

翻译贡献者: canglan, Hex
最后修改: 2009-02-21 17:24:11

上一个主题: 配置类 · 页首 · 用户指南首页 · 下一个主题: 入门:例子


CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 查询

查询

$this->db->query();

要提交一个查询，用以下函数：

$this->db->query('YOUR QUERY HERE');

query() 函数以object(对象)的形式返回一个数据库结果集. 当使用 "read" 模式来运行查询时, 你可以使用“显示你的结果集”来显示查询结果; 当使用 "write" 模式来运行查询时, 将会仅根据执行的成功或失败来返回 TRUE 或 FALSE. 当你需要将返回的结果赋值给一个自定义变量的时候, 你可以这样操作:

$query = $this->db->query('YOUR QUERY HERE');

$this->db->simple_query();

这是一个简化版本的 $this->db->query() 函数. 它仅返回 True(bool) 和 False(bool) 以表示查询成功与失败. 它将不会返回查询数据集，无法设置查询计时器(设置环境变量)，无法编译绑定数据，不能够存储查询诊断信息。 简单地说，他是一个用于提交查询的函数，对于大多数用户而言并不会使用到它。

手工添加数据库前缀

如果你需要为一个数据库手工添加前缀，你可以使用以下步骤。

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

保护标识符

在许多数据库中，保护表(table)和字段(field)的名称是明智的，例如在MySQL中使用反引号。Active Record的查询都已被自动保护，然而，如果您需要手动保护一个标识符，您也可以这样：

$this->db->protect_identifiers('table_name');

这个函数也会给你的表名添加一个前缀，它假定在你的数据库配置文件中已指定了一个前缀。可通过将第二个参数设置为TRUE (boolen) 启用前缀:

$this->db->protect_identifiers('table_name', TRUE);

转义查询

将数据转义以后提交到你的数据库是非常好的安全做法，CodeIgniter 提供了 3 个函数帮助你完成这个工作。

  1. $this->db->escape() 这个函数将会确定数据类型，以便仅对字符串类型数据进行转义。它将会自动增加单引号(single quotes)在数据的周围，所以你不能这样做： $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
  2. $this->db->escape_str() 此函数将忽略数据类型对传入数据进行转义。更多时候你将使用上面的函数而不是这个。这个函数的使用方法是： $sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')";
  3. $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. $search = '20% raise';
    $sql = "SELECT id FROM table WHERE column LIKE '%".$this->db->escape_like_str($search)."%'";

封装查询

封装，通过让系统为你组装各个查询语句，能够简化你的查询语法。参加下面的范例：

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";

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

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

使用封装查询的第二个好处是所有的值都会被自动转义，形成了较为安全的查询语句。你无需手动地去转义这些数据；控制器将会自动为你进行。

翻译贡献者: 498621, Fanbin, Hex, kkorange, szlinz, xjflyttp
最后修改: 2009-09-12 13:41:21

上一个主题: 连接到你的数据库 · 页首 · 用户指南首页 · 下一个主题: 查询结果


查询结果

CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 查询结果
搜索用户指南
查看原文

生成查询记录集

支持使用以下方法生成记录集

result()

该方法执行成功返回一个对象数组，失败则返回一个空数组。 一般情况下，我们使用下面的方法遍历结果，代码就像这样：

$query = $this->db->query("要执行的 SQL");

foreach ($query->result() as $row)
{
   echo $row->title;
   echo $row->name;
   echo $row->body;
}

本函数的别名是 result_object()。

如果当前所执行的 SQL 可能不会返回记录集，我们可以使用如下方法进行判断：

$query = $this->db->query("要执行的 SQL");

if ($query->num_rows() > 0)
{
   foreach ($query->result() as $row)
   {
      echo $row->title;
      echo $row->name;
      echo $row->body;
   }
}

result_array()

该方法执行成功时将记录集作为关联数组返回。失败时返回空数组。一般情况下，我们使用下面的方法遍历结果，代码就像这样：

$query = $this->db->query("要执行的 SQL");

foreach ($query->result_array() as $row)
{
   echo $row['title'];
   echo $row['name'];
   echo $row['body'];
}

row()

该函数将当前请求的第一行数据作为 object 返回。这里是示例代码：

$query = $this->db->query("要执行的 SQL");

if ($query->num_rows() > 0)
{
   $row = $query->row();

   echo $row->title;
   echo $row->name;
   echo $row->body;
}

你可以传递参数以便获得某一行的数据。比如我们要获得第 5 行的数据：

$row = $query->row(5);

row_array()

功能与 row() 一样, 区别在于该函数返回的是一个数组：

$query = $this->db->query("要执行的 SQL");

if ($query->num_rows() > 0)
{
   $row = $query->row_array();

   echo $row['title'];
   echo $row['name'];
   echo $row['body'];
}

你可以传递参数以便获得某一行的数据。比如我们要获得第 5 行的数据：

$row = $query->row_array(5);

除此以外, 我们还可以使用下面的方法通过游标的方式获取记录：

$row = $query->first_row()
$row = $query->last_row()
$row = $query->next_row()
$row = $query->previous_row()

默认情况下他们将返回一个 object，同时你也可以传递参数 "array" 以便使用 array 的方式获取数据

$row = $query->first_row('array')
$row = $query->last_row('array')
$row = $query->next_row('array')
$row = $query->previous_row('array')

结果集辅助函数

$query->num_rows()

该函数将会返回当前请求的行数。在本例子中, $query 表示当前 SQL 所产生的请求结果对象：

$query = $this->db->query('SELECT * FROM my_table');

echo $query->num_rows();

$query->num_fields()

该函数返回当前请求的字段数（列数）：

$query = $this->db->query('SELECT * FROM my_table');

echo $query->num_fields();

$query->free_result()

该函数将会释放当前查询所占用的内存并删除其关联的资源标识。通常来说，PHP 将会脚本执行结束后自动释放内存。如果当前执行的请求将要花很长时间并且占用比较大的资源时,该函数可以在一定程度上降低资源的消耗：

$query = $this->db->query('SELECT title FROM my_table');

foreach ($query->result() as $row)
{
   echo $row->title;
}
$query->free_result(); // $query 将不再可用

$query2 = $this->db->query('SELECT name FROM some_table');

$row = $query2->row();
echo $row->name;
$query2->free_result(); // $query2 将不再可用

翻译贡献者: Hex, kakera, lishen2
最后修改: 2008-06-01 09:48:16

上一个主题: 查询 · 页首 · 用户指南首页 · 下一个主题: 查询助手函数


数据库表数据

CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 数据库表数据
搜索用户指南
查看原文

表数据

以下函数可以获取表信息

$this->db->list_tables();

返回一个包含当前连接数据库中所有表名称的数组。例如：

$tables = $this->db->list_tables();

foreach ($tables as $table)
{
   echo $table;
}

$this->db->table_exists();

有时，在对某个表执行操作之前，使用该函数判断指定表是否存在很有用。返回一个布尔值：TRUE/FALSE。例子：

if ($this->db->table_exists('table_name'))
{
   // some code...
}

备注：用你所查找的表名替换 table_name

翻译贡献者: analyzer, Hex, ianyang
最后修改: 2009-06-15 00:19:56

上一个主题: 事务 · 页首 · 用户指南首页 · 下一个主题: 字段元数据


CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 事务

事务

CodeIgniter的数据库抽象允许你在支持事务安全的数据库表中使用事务。在MySQL中，你需要用InnoDB或BDB表而不是更常用的MyISAM。大多数其它的数据库平台都原生支持事务。

如果你对事务不熟悉，我们建议您上网寻找相关资源学习。以下信息假设你已经明白事务的相关概念。

CodeIgniter 的事务方法

CodeIgniter 使用的事务方法与流行的数据库类ADODB所使用的处理过程非常相似。我们选择那种方法是因为它极大地简化了运行事务的处理过程。大多数情况下你只需要编写两行代码就行了。

传统上, 事务需要实现大量工作, 他们要求你随时跟踪你的查询, 并根据查询的成功或失败来决定 提交 还是 回滚。这是特别麻烦的嵌套查询。相比之下, 我们实现了一种智能的事务系统, 它将自动地为你做这些事情(如果你选择手动管理你的事务, 这也是可以的, 但这确实没什么好处)。

运行事务

要使用事务来运行你的查询, 你可以使用如下所述的 $this->db->trans_start() 和 $this->db->trans_complete() 函数:

$this->db->trans_start();
$this->db->query('一条SQL查询...');
$this->db->query('另一条查询...');
$this->db->query('还有一条查询...');
$this->db->trans_complete();

在 start/complete 函数之间, 你想运行多少条查询都可以, 根据任何给定查询的成功或失败, 它们将被提交或者回滚。

严格模式(Strict Mode)

默认情况下, CodeIgniter 以严格模式运行所有事务。当严格模式被启用时, 如果你正在运行多组的事务, 只要有一组失败, 所有组都会被回滚。如果严格模式被禁用, 每一组都被视为独立的组, 这意味着其中一个组的失败不会影响其它组。

严格模式能以下面的方式禁用:

$this->db->trans_strict(FALSE);

管理错误信息

如果你在你的 config/database.php 文件中启用了错误报告, 当提交没有成功时, 你会看到一条标准的错误信息。如果调试被关闭, 你可以通过这种方式来管理你的错误信息:

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->trans_complete();

if ($this->db->trans_status() === FALSE)
{
    // 生成一条错误信息... 或者使用 log_message() 函数来记录你的错误信息
}

启用事务

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

$this->db->trans_off()

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();

当事务被禁用的时候, 你的查询将被自动提交, 就像没有使用事务时那样。

测试模式(Test Mode)

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

$this->db->trans_start(TRUE); // 查询将被回滚
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();

手动运行事务

如果你想要手动运行事务, 可以使用下面的方法:

$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();
}

说明: 手动运行事务时, 请务必使用 $this->db->trans_begin() 函数, 而不是 $this->db->trans_start().

翻译贡献者: Hex, iptton, yinzhili
最后修改: 2009-09-21 12:29:13

上一个主题: 字段元数据 · 页首 · 用户指南首页 · 下一个主题: 数据库表元数据


CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 数据库工具类

数据库工具类

数据库工具类包含有帮助你管理数据库的函数

目录

  • 初始化数据库工具类
  • 列出所有数据库名
  • 优化数据表
  • 修复数据库
  • 优化数据库
  • 从数据库结果集导出CSV文件
  • 从数据库结果集导出XML文件
  • 备份数据库

初始化数据库工具类

重要提示： 初始化数据库工具类之前，你的数据库驱动必须已经运行,因为工具类依赖于此。

加载工具类：

$this->load->dbutil()

一旦初始化完毕，你可以通过 $this->dbutil 对象来访问成员函数：

$this->dbutil->some_function()

$this->dbutil->list_databases()

返回一个含有数据库名的数组:

$dbs = $this->dbutil->list_databases();

foreach($dbs as $db)
{
    echo $db;
}

$this->dbutil->optimize_table('table_name');

注意： 此特性仅在MySQL/MySQLi数据库中可用。

允许你优化第一个参数为表名的表。基于操作的成功或失败返回TRUE或FALSE：

if ($this->dbutil->optimize_table('table_name'))
{
    echo 'Success!';
}

注意： 并非所有数据库平台都支持表优化

$this->dbutil->repair_table('table_name');

注意： 此特性仅在MySQL/MySQLi数据库中可用。

允许你修复第一个参数为表名的表。基于操作的成功或失败返回TRUE或FALSE：

if ($this->dbutil->repair_table('table_name'))
{
    echo 'Success!';
}

注意： 并非所有数据库平台都支持表修复。

$this->dbutil->optimize_database();

注意： 此特性仅在MySQL/MySQLi数据库中可用。

允许你优化当前DB类所连接到的数据库。返回一个包含DB状态信息的数组，失败返回 FALSE。

$result = $this->dbutil->optimize_database();

if ($result !== FALSE)
{
    print_r($result);
}

注意： 并非所有数据平台都支持表优化。

$this->dbutil->csv_from_result($db_result)

允许你从查询结果集生成一个CSV文件。第一个参数必须为查询结果集对象。例如：

$this->load->dbutil();

$query = $this->db->query("SELECT * FROM mytable");

echo $this->dbutil->csv_from_result($query);

第二和第三个参数允许你设置分隔符和换行符。默认使用tab（跳格）作为分隔符，使用“\n”作为换行符。例如：

$delimiter = ",";
$newline = "\r\n";

echo $this->dbutil->csv_from_result($query, $delimiter, $newline);

重要： 此函数不会将生成的CSV文件保存到磁盘。它只是简单的创建CSV格式。如果需要将文件保存到磁盘，使用文件辅助函数。

$this->dbutil->xml_from_result($db_result)

允许你从结果集中生成一个XML文件。第一个参数是查询结果集对象，第二个参数为可选数组参数，数组包含配置参数。例如：

$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);

重要： 此函数不会将生成的XML文件保存到磁盘。它只是简单的创建XML格式。如果需要将文件保存到磁盘，使用文件辅助函数。

$this->dbutil->backup()

允许你备份整个数据库或者独立的表。备份数据可以压缩为Zip或Gzip格式。

注意： 该特性仅在使用MySQL数据库时有效。

备注：由于PHP执行时间和内存的限制，备份巨大的数据库可能不太容易成功。如果你的数据库非常大，你可能需要直接从命令行执行相关命令；或者如果你没有相应权限，你可能需要服务器管理员为你做这件事。

用法：

// 加载数据库工具类
$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"               // 备份文件中的换行符
              );

$this->dbutil->backup($prefs);

备份参数说明

参数 | 默认值 | 选项 | 描述
tables | 空数组 | 无 | 你想备份的数据表数组,如果留空将备份所有数据表.
ignore | 空数组 | 无 | 忽略备份的数据表数组
format | gzip | gzip, zip, txt | 导出文件的格式
filename | 当前日期/时间 | 无 | 备份文件名. 如果您使用了zip压缩这个名字是必填的.
add_drop | TRUE | TRUE/FALSE | 是否在您的输出的SQL文件里包含DROP TABLE声明.
add_insert | TRUE | TRUE/FALSE | 是否在您的输出的SQL文件里包含INSERT声明.
newline | "\n" | "\n", "\r", "\r\n" | 使用在您输出的SQL文件里的换行符类型.

翻译贡献者: Hex, ianyang, iptton, skey, thankwsx, yinzhili
最后修改: 2009-09-22 09:19:45

上一个主题: 数据库工厂类 · 页首 · 用户指南首页 · 下一个主题: Email 类


PHP 替代语法

CodeIgniter 中国首页 › 用户指南首页 › PHP 替代语法
搜索用户指南
查看原文

视图文件的 PHP 替代语法

如果你不使用 CodeIgniter 的模板引擎，则你可以在视图文件中使用原始 PHP 代码。要使 PHP 代码达到最精简并使其更容易辨认，因此建议你使用 PHP 替代语法控制结构及短标记的 echo 语句。 建议您使用 PHP 的语法为您的控制结构和简短的输出标签。如果你不熟悉这个语法，它允许你从你的代码中消灭大括号，并且消灭“echo”语句。

自动短标记支持

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

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

替代 Echo

正常的 echo 和 print 输出一般是这样的形式：

<?php echo $variable; ?>

使用替代语法，你能改成这样的形式：

<?=$variable?>

替代控制结构

控制结构，像 if，for，foreach，和 while 也可以写成简化的形式。这里是一个用 foreach 的例子：

<ul>

<?php foreach($todo as $item): ?>

<li><?=$item?></li>

<?php endforeach; ?>

</ul>

注意，这里没有大括号。相反，结束大括号被替换成了 endforeach。上面列出的每一个控制结构也有相似的关闭语法：endif，endfor，endforeach，和 endwhile

并且在每个结构以后注意不要使用分号(除了最后一个)，用冒号。这是很重要的！

这有另一个例子，使用 if/elseif/else。注意冒号：

<?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; ?>

翻译贡献者: Hex, laotan
最后修改: 2008-04-07 16:03:45

上一个主题: 管理应用程序 · 页首 · 用户指南首页 · 下一个主题: 安全


CodeIgniter 用户指南

CodeIgniter 中国首页 › CodeIgniter 用户指南
搜索用户指南
查看原文

欢迎使用 CodeIgniter

CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包。它提供一套丰富的标准库以及简单的接口和逻辑结构，其目的是使开发人员更快速地进行项目开发。使用 CodeIgniter 可以减少代码的编写量，并将你的精力投入到项目的创造性开发上。

CodeIgniter 是为谁准备的？

CodeIgniter 就是你所需要的，如果...

  • 你想要一个小巧的框架。
  • 你需要出色的性能。
  • 你需要广泛兼容标准主机上的各种 PHP 版本和配置（例如 PHP4）。
  • 你想要一个几乎只需 0 配置的框架。
  • 你想要一个不需使用命令行的框架。
  • 你想要一个不需坚守限制性编码规则的框架。
  • 你对 PEAR 这种大规模集成类库不感兴趣。
  • 你不希望被迫学习一门模板语言（虽然可以选择你喜欢的模板解析器）。
  • 你不喜欢复杂，热爱简单。
  • 你需要清晰、完整的文档。

翻译贡献者: Hex
最后修改: 2009-02-22 00:22:48

页首


自动装载资源

CodeIgniter 中国首页 › 用户指南首页 › 自动装载资源
搜索用户指南
查看原文

自动加载资源

CodeIgniter有一个自动加载属性它允许在系统运行过程中初始的自动加载库(libraries),帮助函数(helpers),插件(plugins),如果你想要特定的资源全局在你的程序中全局使用,你会发现将他们自动加载是很方便的。

以下列表项目可以自动加载：

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

要自动加载资源，先打开 application/config/autoload.php 文件，然后增加你想要自动加载的项目在 autoload 数组中，你能看见文件中的有与上边项目对应的指示。

注意： 在增加项目到自动加载数组中的时候，不要包括文件扩展名(.php)。

翻译贡献者: Hex, lnnujxxy
最后修改: 2008-06-28 11:37:06

上一个主题: 钩子 - 扩展核心 · 页首 · 用户指南首页 · 下一个主题: 公共函数


页面缓存

CodeIgniter 中国首页 › 用户指南首页 › 页面缓存
搜索用户指南
查看原文

网页缓存

Codeigniter 支持缓存技术，以达到最快的速度。

尽管CI已经相当高效了，但是网页中的动态内容、主机的内存CPU 和数据库读取速度等因素直接影响了网页的加载速度。 依靠网页缓存，你的网页可以达到近乎静态网页的加载速度，因为他们将程序输出的结果保存到硬盘上了。

缓存是怎么工作的？

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

注意：Benchmark 标签在使用了缓存的页面仍然可用。

启动缓存

只需将下面的代码放在你的controller的function中的任何位置:

$this->output->cache(n);

其中 n 是你希望缓存更新的 分钟 数。

上面的代码可以放到任何一个function里面。他的出现顺序对缓存并没有影响，所以，将它放在你认为最好的地方。一旦上面的代码放到了controller的function中，页面就会被缓存。

警告: 由于CI存储缓存文件的方式，只有通过 view 文件的输出才能被缓存。

注意: 在缓存文件产生之前，请确保 system/cache 文件夹可写。

清除缓存

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

翻译贡献者: Hex, jinhao7773, longbill
最后修改: 2008-03-23 16:19:16

上一个主题: 错误处理 · 页首 · 用户指南首页 · 下一个主题: 评测你的应用程序


CodeIgniter 中国首页 › 用户指南首页 › 公共函数

公共函数

CodeIgniter 使用了一些全局定义的函数来完成操作，在任何情况下你都能够使用这些函数。使用他们不需要载入任何类库或辅助函数。

is_php('version_number')

is_php() 判断正在使用的PHP的版本号是否高于你所提供的 version_number 。

if (is_php('5.3.0'))
{
    $str = quoted_printable_encode($str);
}

如果已安装的PHP版本号等于或高于你所提供的版本号，本函数将返回布尔值 TRUE。如果安装的PHP版本号低于你所提供的那个版本号，本函数将返回 FALSE。

is_really_writable('path/to/file')

在Windows平台，is_writable()函数在实际没有文件写权限时也返回真。那是因为，只有文件有只读属性时，操作系统才向PHP报告为假。这个函数依靠对文件的先行写入来判断是否真的具有写权限。 通常情况下，只有在这个信息不可靠的平台上才推荐使用。

if (is_really_writable('file.txt'))
{
    echo "I could write to this if I wanted to";
}
else
{
    echo "File is not writable";
}

config_item('item_key')

尽管使用config_item()函数能够取得单个配置信息，但是配置类是访问这些信息的优选方式。更多信息请见类库参考。

show_error('message'), show_404('page'), log_message('level', 'message')

这些函数在错误处理中描述。

set_status_header(code, 'text');

允许你手动设置服务器状态头(header)。例如:

set_status_header(401);
// 将header设置为: Unauthorized

单击这里 查看全部的header列表。

翻译贡献者: Hex, lishen2, yinzhili
最后修改: 2009-09-13 13:45:14

上一个主题: 自动装载资源 · 页首 · 用户指南首页 · 下一个主题: 脚手架(Scaffolding)


CodeIgniter 中国首页 › 用户指南首页 › 控制器

控制器

控制器是应用程序的心脏，因为它们决定如何处理 HTTP 请求。

  • 什么是控制器？
  • 你好，世界
  • 方法
  • 将 URI 片段传递给方法
  • 定义一个默认控制器
  • 重新定义方法的调用规则
  • 控制数据输出
  • 私有方法
  • 如何将控制器放入子文件夹中
  • 构造函数
  • 已保留的方法名称

什么是控制器？

简而言之，一个控制器就是一个类文件，是以一种能够和 URI 关联在一起的方式来命名的。

假设这个 URI:

example.com/index.php/blog/

在上面的例子中，CodeIgniter 将尝试寻找并装载一个名为 blog.php 的控制器。

当控制器的名字匹配 URI 的第一段时，它将被装载。

让我们试试看: 你好，世界！

我们来创建一个简单的控制器，以便更直观地了解其工作原理。使用你的文本编辑器，创建一个名为 blog.php 的文件，然后输入下列代码：

然后保存文件到 application/controllers/ 文件夹。

现在使用类似这样的 URL 访问你的站点：

example.com/index.php/blog/

如果你做的没错，你应该看到你好，世界！.

注意：类名必须以大写字母开头。换句话说，这是有效的：

<?php
class Blog extends Controller {

}
?>

这是无效的：

<?php
class blog extends Controller {

}
?>

同时，始终确保你的控制器扩展自父控制器类，以便它能够继承其所有的方法。

方法

上面的例子中用到的方法名是 index()。如果 URI 的第二部分为空的话，会默认载入 “index” 方法。也可以将地址写成这样来访问 “Hello World”：

example.com/index.php/blog/index/

URI 的第二部分是用来决定调用控制器中哪个方法的。

我们再来试试。在你的控制器中加入一个新的方法：

现在在地址栏中输入下面的内容来访问 comments 方法：

example.com/index.php/blog/comments/

你应该看到新的信息了：Look at this!

将 URI 片段传递给方法

如果你的 URI 超过两个部分，那么超过的将被作为参数传递给方法。

举例来说，如果你的 URI 是这样的：

example.com/index.php/products/shoes/sandals/123

URI 的第3和第4部分会被传递给你的方法（“sandals” 和 “123”）：

<?php
class Products extends Controller {

    function shoes($sandals, $id)
    {
        echo $sandals;
        echo $id;
    }
}
?>

上面的方法调用时必须给两个相应的参数，要不然会出错。当然你也可以像下面这样写，就不用在调用的时候给参数了！

<?php
class Products extends Controller {

    function shoes($sandals='Test', $id=1)
    {
        echo $sandals;
        echo $id;
    }
}
?>

注意：如果你使用 URI 路由特性，则传递到方法中的 URI 片段将被重新路由一次。

定义默认控制器

当你的网站没有设置 URI 或者直接从根目录访问的时候，CodeIgniter 会加载默认控制器。打开 application/config/routes.php 文件来设置默认控制器：

$route['default_controller'] = 'Blog';

这里的 Blog 就是你希望使用的控制器的名字。如果此时你不指定任何 URI 片段来访问你的主页就会看到默认的“Hello World”信息。

重新定义方法的调用规则

如上所述，URI 的第二片段决定会调用控制器中的哪个方法。CodeIgniter 允许你使用 _remap() 方法来废除这种规则：

function _remap()
{
    // Some code here...
}

注意：如果你的控制器中包含一个名为 _remap() 的方法，那么不管你的 URI 中包含什么，它总会被忽略掉。这个方法会废除掉由 URI 片段来决定哪个方法被调用的规则，允许你重新定义调用方法的规则（方法的路由规则）。

被重新定义的方法调用方式（一般是 URI 中的第二片段）将作为一个参数传递给 _remap() ：

function _remap($method)
{
    if ($method == 'some_method')
    {
        $this->$method();
    }
    else
    {
        $this->comments();
    }
}

你可以这样理解上面的方法：当 $method 等于你定义的参数时程序执行一个特殊的操作，这里可以灵活运用。如下面的方法如果参数等于 c 就调用 comments，否则就调用用户输入的方法

function _remap($method)
{
    if ($method == 'c')
    {
        $this->$comment();
    }
    else
    {
        $this->method();
    }
}

处理输出

CodeIgniter 拥有一个输出类用来确保你修改的数据会自动被传递给浏览器。关于这个的更多信息可以在视图和输出类里找到。有些时候，你可能想要自己发布修改一些最终的数据或是自己把它传递给浏览器。CodeIgniter 允许你给你的控制器增加一个名为 _output() 的方法来接收最终的数据。

注意： 如果你的控制器包含一个 _output() 方法，那么它将总是被调用，而不是直接输出最终的数据。这个方法类似于OO里的析构函数，不管你调用任何方法这个方法总是会被执行。

例如：

function _output()
{
    echo 'I am here';
}

请注意，你的 _output() 将接收最终的数据。 Benchmark and memory usage data will be rendered, cache files written (if you have caching enabled), and headers will be sent (if you use that feature) before it is handed off to the _output() function. If you are using this feature the page execution timer and memory usage stats might not be perfectly accurate since they will not take into acccount any further processing you do. For an alternate way to control output before any of the final processing is done, please see the available methods in the Output Class.

私有方法

在某些情况下，你可能想要隐藏一些方法使之无法对外查阅。将方法私有化很简单，只要在方法名字前面加一个下划线（“_”）做前缀就无法通过 URL 访问到了。例如，如果你有一个像这样的方法：

function _utility()
{
  // some code
}

那么，通过下面这样的 URL 进行访问是无法访问到的：

example.com/index.php/blog/_utility/

如何将控制器放入子文件夹中

如果你在建立一个大型的应用程序，你会发现 CodeIgniter 可以很方便的将控制器放到一些子文件夹中。

只要在 application/controllers 目录下创建文件夹并放入你的控制器就可以了。

注意： 如果你要使用某个子文件夹下的功能，就要保证 URI 的第一个片段是用于描述这个文件夹的。例如说你有一个控制器在这里：

application/controllers/products/shoes.php

调用这个控制器的时候你的 URI 要这么写：

example.com/index.php/products/shoes/show/123

你的每个子文件夹中需要包含一个默认的控制器，这样如果 URI 中只有子文件夹而没有具体功能的时候它将被调用。只要将你作为默认的控制器名称在 application/config/routes.php 文件中指定就可以了。

CodeIgniter 也允许你使用 URI 路由 功能来重新定向 URI。

构造函数

如果要在你的任意控制器中使用构造函数的话，那么必须在里面加入下面这行代码：

parent::Controller();

这行代码的必要性在于，你此处的构造函数会覆盖掉这个父控制器类中的构造函数，所以我们要手动调用它。

如果你对构造函数不熟悉可以看这里，在 PHP 4 中，一个构造函数就是一个拥有和类名完全相同的名字的简单函数：

<?php
class Blog extends Controller {

       function Blog()
       {
            parent::Controller();
       }
}
?>

在 PHP 5 中，构造函数的语法是这样的：

<?php
class Blog extends Controller {

       function __construct()
       {
            parent::Controller();
       }
}
?>

如果你需要设定某些默认的值或是在实例化类的时候运行一个默认的程序，那么构造函数在这方面就非常有用了。
构造函数并不能返回值，但是可以用来设置一些默认的功能。

已保留的方法名称

因为你添加的控制器类继承了主要的应用程序控制器，所以你要小心你的方法名不要和那个类中的方法名一样了，否则你的方法会覆盖原有的。详细信息请查看保留字部分。

就这样了！

OK，总的来说，这就是关于控制器的所有内容了。

翻译贡献者: 34333432, Hex, irini, longjianghu
最后修改: 2009-07-06 16:53:47

上一个主题: CodeIgniter URL · 页首 · 用户指南首页 · 下一个主题: 保留字


CodeIgniter 中国首页 › 用户指南首页 › 创建核心系统类

创建核心系统类

每次CodeIgniter运行时都有很多基础类作为核心框架的一部分被自动初始化.但你也可以使用经过你修改的类来替换甚至扩展这些原始的核心系统类.

大多数用户一般不会有这种需求,但对于那些想较大幅度的改变CodeIgniter的人来说,我们依然提供了替换和扩展核心系统类的选择.

注意: 改变系统核心类会产生很大影响,所以在你做之前必须清楚地知道自己正在做什么.

系统类清单

以下是系统核心文件的清单,它们在每次CodeIgniter启动时被调用:

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

替换核心类

要使用你自己的系统类替换默认类只需简单的将你自己的.php文件放入本地文件夹 application/libraries

application/libraries/some-class.php

如果这个文件夹不存在你可以自己创建一个.

只要你自定义的文件名与默认的完全一样,它就会自动替换原有的类.

要注意的是你自定义的类必须以CI作为前缀,例如你自己建立了Input.php类的名字必须是:

class CI_Input {

}

扩展核心类

如果你需要在现有类库中加入一两个新的功能,那就完全不必要替换整个类库文件.你只需简单地扩展(继承)现有的类,扩展一个类就像在类中增加一些例外:

  • 扩展的类必须申明由母类扩展而来.
  • 新扩展的类所在的文件必须以 MY_ 为前缀(这个选项是可配置的,下面有说明).

例如,要扩展原有的Input 类,你应该新建一个文件名为application/libraries/MY_Input.php, 并按如下声明你的类:

class MY_Input extends CI_Input {

}

注意:如果你需要在类中使用构造函数,你必须在构造函数中显式继承母类构造函数:

class MY_Input extends CI_Input {

    function MY_Input()
    {
        parent::CI_Input();
    }
}

Tip: 所有在你的新类中定义的函数如果与母类中函数的命名完全一样,这些函数就能取代母类中原有的函数 (这也被称为"方法重载").这允许你在本质上改变CodeIgniter的核心.

如果你扩展了控制器核心类，那么也要在你的应用程序控制器的构造函数中使用这个新类。

class Welcome extends MY_Controller {

    function Welcome()
    {
        parent::MY_Controller();
    }

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

自定义前缀

要设定你自己的子类前缀,请打开application/config/config.php 文件并找到这一项:

$config['subclass_prefix'] = 'MY_';

请注意所有原始CodeIgniter类库以 CI_ 作为前缀,所以请勿以CI_作为你自己的前缀.

翻译贡献者: Hex, longbill, skey, thinksand
最后修改: 2009-09-12 13:48:41

上一个主题: 创建你自己的程序库 · 页首 · 用户指南首页 · 下一个主题: 钩子 - 扩展核心


CodeIgniter 中国首页 › 用户指南首页 › 创建程序库

创建程序库

当我们使用术语"类库"时,我们一般指的是位于libraries 文件夹中的类,它们在wiki的"类库参考"这个板块被讨论.在当前这个话题中,我们将讨论如何在 application/libraries 文件夹中建立你自己的类库,并使它们与全框架的资源维持分离.

作为一个额外的功能,当你需要在原始类中简单地添加一些功能时,CodeIgniter能使你的类库extend 自原始类.你甚至可以通过在application/libraries文件夹下安放同名类库文件的方法来完全替换原始类.

总之:

  • 你可以创建全新的类库.
  • 你可以扩展原始类库.
  • 你可以替换原始类库.

以下页面将深入介绍这三个概念.

注意: 除了数据库类和装载器类(PHP4 环境中)无法被扩展或取代，剩余其他类均可。

建立你的类库文件

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

命名约定

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

类文件

所有的类应有基础原型(注意,这里我们以 Someclass 这个名字为例):

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

    function some_function()
    {
    }
}

?>

使用你自己的类

在所有的Controller 函数中,你可以用以下的标准方式初始化你的类:

$this->load->library('someclass');

当 someclass 是文件名时,不用加上".php"扩展名.这里名字不分大小写.

一旦你自定义的类加载完毕,你可以通过以下方式调用类,注意使用 小写 的名字:

$this->someclass->some_function();  // 对象的实例名永远都是小写的

在初始化自定义类时传递参数

当初始化类库时，你可以通过第二个参数动态的传递数组到类的构造函数中去:

$params = array('type' => 'large', 'color' => 'red');

$this->load->library('Someclass', $params);

当你使用这个特性时,你必须为类的构造函数加上参数:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

    function Someclass($params)
    {
        // Do something with $params
    }
}

?>

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

在你自定义的类库中初始化CodeIgniter资源

要你自定义的类库中访问CodeIgniter的原始资源,你必须使用 get_instance() 函数.这个函数返回一个CodeIgniter super object.

一般来说在你的控制器函数中你可以通过 $this 调用任何可用的CodeIgniter函数:

$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
etc.

$this, 只直接作用在你自己的控制器,模型和视图中.当你在自定义类中想使用CodeIgniter原始类时,你可以这样做:

首先,定义CodeIgniter对象赋给一个变量:

$CI =& get_instance();

一旦定义某个对象为一个变量,你就可以使用那个变量名 取代 $this:

$CI =& get_instance();

$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
etc.

注意: 你将注意到get_instance()这个函数通过被引用的方式被传递:

$CI =& get_instance();

这十分重要. 通过引用的方式赋给变量将使使用原始的CodeIgniter对象,而不是创建一个拷贝

同时,请注意: 如果你使用php 4,那么请最好不要在类的构造函数中调用 get_instance() .php4在引用位于构造函数中的CI super object时存在问题,因为对象只有在类完全实例化后才存在.

用你自己的类替换原始类

简单的将你自己的类命名为与原始类一样就能使CodeIgniter使用这个新类．要使用这个特性，文件名与类声明必须与原始类完全一致。例如，要替换原始的 Email 类库。你必须创建一个文件application/libraries/Email.php, 并按如下方式声明类:

class CI_Email {

}

注意大多数原始类以CI_为前缀.

你可以只用标准载入函数来载入你自己的类:

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

注意: 这个时候Database无法替换为你自定义的类.

扩展现有类

如果你需要在现有类库中加入一两个新的功能,那就完全不必要替换整个类库文件.你只需简单地扩展(继承)现有的类,扩展一个类就像在类中增加一些例外:

  • 扩展的类必须申明由母类扩展而来.
  • 新扩展的类所在的文件必须以 MY_ 为前缀(这个选项是可配置的,下面有说明).

例如，要扩展原始类 Email 类你要建立文件 application/libraries/MY_Email.php, 并按如下方式在文件中声明:

class MY_Email extends CI_Email {

}

注意:如果你需要在类中使用构造函数,你必须在构造函数中显式继承母类构造函数:

class MY_Email extends CI_Email {

    function My_Email()
    {
        parent::CI_Email();
    }
}

载入你的子类

要载入扩展子类，你应该使用标准字符名. 请不要使用前缀. 例如,要载入上文说过的email扩展子类，你应该这样写:

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

扩展子类一旦被载入，就能想一般的类一样使用它们. Email类中的所有函数就能被调用:

$this->email->some_function();

设定自定义前缀

要设定你自己的子类前缀,请打开 application/config/config.php 文件并找到这一项:

$config['subclass_prefix'] = 'MY_';

注意所有原始CodeIgniter类库以 CI_ 作为前缀,所以请勿以CI_作为你自己的前缀.

翻译贡献者: billycui, Hex, shishirui, soyota, thinksand
最后修改: 2009-09-12 13:51:47

上一个主题: 使用 CodeIgniter 程序库 · 页首 · 用户指南首页 · 下一个主题: 创建核心系统类


CodeIgniter 中国首页 › 用户指南首页 › 关于 CodeIgniter

关于 CodeIgniter

CodeIgniter 最早是由 Rick Ellis 开发的（Ellislab 公司的 CEO）。这个框架是为真实应用而编写的，集成了很多类库、辅助函数(helpers)以及从ExpressionEngine借用的子系统。

CodeIgniter 当前由“ExpressionEngine 开发团队”开发并维护。

来自 Ruby on Rails 的灵感启发我们创造了一个 PHP 框架，并且将框架的概念引入到网络社区的一般意识中。

翻译贡献者: Hex, imjie, irini
最后修改: 2009-03-06 16:40:14

上一个主题: 变更记录 · 页首 · 用户指南首页 · 下一个主题: 下载 CodeIgniter


CodeIgniter 中国首页 › 用户指南首页 › 错误处理

错误处理

在你的程序里使用以下的函数，CodeIgniter将允许你建立自己的错误报告。另外，他有一个错误记录类能够将错误和调试信息保存为文本文档。

注意: 在默认的情况下, CodeIgniter 会显示所有的PHP错误.　但是当你开发程序结束时，你可能想要改变这个情况. 你会发现在index.php文件顶端有这个函数error_reporting()，通过它可以进行对错误的设置。 即使你关闭了错误报告，当有错误发生时，错误记录也不会停止。

不像大多数系统, CodeIgniter的错误报告函数是一个简单的程序接口，可以在整个应用程序里使用。 不用考虑类或者是函数的范围，这种办法可以直接触发错误通知。

可以使用以下函数来产生错误消息:

show_error('消息' [, int $status_code = 500 ] )

这个函数将会使用以下错误模版来显示错误消息:

application/errors/error_general.php

The optional parameter $status_code determines what HTTP status code should be sent with the error.

show_404('页面')

这个函数将会使用以下错误模版来显示 404 错误信息:

application/errors/error_404.php

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

log_message('级别', '消息')

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

if ($some_var == "")
{
    log_message('error', 'Some variable did not contain a value.');
}
else
{
    log_message('debug', 'Some variable was correctly set');
}

log_message('info', 'The purpose of some variable is to provide some value.');

有三种不同类型的消息:

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

注意: 确保"logs" 文件夹是可写的,才能准确地将消息写入记录文件中。另外，你必须要设置记录的“threshold“来进行记录。例如通过设置“threshold“，你可以只记录错误类型的消息，而不用记录其他两种。如果你将“threshold“设为0，记录就会被禁止。

翻译贡献者: aykirk, borisauschina, Hex, tyronecai, xjflyttp
最后修改: 2009-09-12 13:54:41

上一个主题: URI 路由 · 页首 · 用户指南首页 · 下一个主题: 页面缓存


辅助函数

CodeIgniter 中国首页 › 用户指南首页 › 辅助函数
搜索用户指南
查看原文

辅助函数（helpers）

辅助函数，顾名思义，是帮助我们完成特定任务的函数。每个辅助函数文件仅仅是一些函数的集合。例如，URL Helpers 可以帮助我们创建链接，Form Helpers 可以帮助我们创建表单，Text Helpers 提供一系列的格式化输出方式，Cookie Helpers 能帮助我们设置和读取COOKIE， File Helpers 能帮助我们处理文件，等等。

跟其他部分不同的是，辅助函数不是用类的方式来实现的。它们仅仅是一些简单的过程处理函数。 每个辅助函数处理一个特定的任务，并且不必依靠其他函数。

CodeIgniter 默认是没有载入辅助函数文件的，所以如果你想用辅助函数，就必须先载入它。 一旦被载入，辅助函数将全局可用(globally available)，你可以在 controller 和 views 中使用它们。

辅助函数文件一般保存在 system/helpers 或 system/application/helpers 文件夹中。CodeIgniter 将会先在 system/application/helpers 寻找对应的辅助函数文件，如果目录不存在或者目录下没有对应的辅助函数文件，CI 才会载入 system/helpers 下的辅助函数文件。

载入辅助函数

载入辅助函数是非常简单的:

$this->load->helper('name');

name 是辅助函数文件的名字(不带.php后缀 和"helper" 部分)。

例如，要载入文件名为url_helper.php的URL Helper，你将会用到下面的语句：

$this->load->helper('url');

辅助函数可以在你的控制器(controller)的任何地方被载入，甚至可以在视图(View)文件中被载入(我们并不建议你这么做)。 请在使用辅助函数之前载入他们。你可以在你的控制器构造函数中载入它们，以便辅助函数能自动在其他函数之前被载入。你也可以在要用到辅助函数的地方当场载入。

注意: 辅助函数载入函数并不返回值，所以不要尝试将它付给一个变量，直接像这样用就可以了。

载入多个辅助函数

如果你想一次载入多个辅助函数，你可以这样做:

$this->load->helper( array('helper1', 'helper2', 'helper3') );

自动载入辅助函数

如果你想要的话，CodeIgniter可以自动为你载入辅助函数。你可以通过打开 application/config/autoload.php ，并往自动载入数组(autoload array)中增加辅助函数来实现。

使用辅助函数

一旦你载入了想要用到辅助函数文件，你就可以用标准的函数调用方法来使用里面的函数。

例如，要使用anchor() 函数来建立一个链接，在视图(View)文件里面你可以这样做:

<?php echo anchor('blog/comments', 'Click Here');?>

"Click Here" 是链接的名字，"blog/comments" 是链接的URI。

"扩展" Helpers

你如果想 "扩展"一个原有的 Helpers,，可以在你的 application/helpers/ 目录下创建一个新的helper，新的helper的名字是在被“扩展”的Helper的名字开头多加一个 MY_ (这是可以配置的. 见下.).

如果你想做的只是在原有的helper中添加一些新的功能，比如，添加一两个新的方法，或者是修改一个方法；就不值得重写自己的helper。在这种情况下，最好是“扩展”已有的helper。“扩展”一词用在这里不是很恰当，因为Helper的方法是procedural 和 discrete的，在传统的语言环境中无法被“扩展”，不过在CodeIgniter中，你可以添加或修改helper的方法。

例如，扩展一个本地已有的 Array Helper 你应该建立一个文件： application/helpers/MY_array_helper.php, 并添加或重写（override）其中的一些方法:

// any_in_array() is not in the Array Helper, so it defines a new function
function any_in_array($needle, $haystack)
{
    $needle = (is_array($needle)) ? $needle : array($needle);

    foreach ($needle as $item)
    {
        if (in_array($item, $haystack))
        {
            return TRUE;
        }
        }

    return FALSE;
}

// random_element() is included in Array Helper, so it overrides the native function
function random_element($array)
{
    shuffle($array);
    return array_pop($array);
}

设定你自己的前缀（Prefix）

用于"扩展" helper 而加上前缀的文件同样也是对库和核心类的扩展.为了设置你自定义的前缀,请打开 application/config/config.php 文件,然后找到如下的条目:

$config['subclass_prefix'] = 'MY_';

请注意所以CodeIgniter自带的库都被冠以 CI_ 这样的前缀,所以请不使用这样的自定义前缀.

现在可以做什么?

在目录里面有所有辅助函数的列表，你可以打开每个文件看看他们都能做些什么。

翻译贡献者: architectcom, borisauschina, Hex, lishen2, longbill, sheshi37c, shishirui
最后修改: 2008-12-27 14:09:44

上一个主题: 模型 · 页首 · 用户指南首页 · 下一个主题: 插件


CodeIgniter 中国首页 › 用户指南首页 › 钩子 - 扩展框架的核心

钩子 - 扩展框架的核心

CodeIgniter 的钩子功能使得您可以在不修改系统核心文件的基础上来改变或增加系统的核心运行功能。 当 CodeIgniter 运行后，它会产生出一个特殊的进程，这个进程在 项目流程 页面中有说明。 当然，您可以自定义一些动作来替代程序运行过程中的某些阶段。例如，您可以在控制器刚刚载入前或刚刚载入后来运行特定的脚本，或者在其他时刻来触发您的脚本。

启用钩子

钩子功能可以在全局范围内打开或关闭，您可以在 application/config/config.php 文件中设定:

$config['enable_hooks'] = TRUE;

定义钩子

钩子是在 application/config/hooks.php 文件中定义的。 每个钩子可以用以下格式的数组来定义:

$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 你希望传递给脚本的任何参数. 此项是可选的.

同一挂钩点的多次引用

如果你想在同一个挂钩点引用多个脚本,最简单的方式就是把你的数组定义成二维的,像这样:

$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')
                                );

注意在每个数组索引后面的中括号:

$hook['pre_controller'][]

这允许你的多个脚本拥有相同的挂钩点。你定义数组的顺序将是程序执行的顺序.

挂勾点

以下是一组可用的挂钩点.

  • 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
    在最终着色页面发送到浏览器之后,浏览器接收完最终数据的系统执行末尾调用

翻译贡献者: anbutu, chouqiuqiu, elviscai, Hex, Jack, nardo, shishirui
最后修改: 2009-03-19 17:31:20

上一个主题: 创建核心类 · 页首 · 用户指南首页 · 下一个主题: 自动装载资源


CodeIgniter 中国首页 › 用户指南首页 › 使用 CodeIgniter 类库

使用 CodeIgniter 类库

所有的类库文件存放在system/libraries 文件夹。大多数情况下你需要预先在controller中初始化后才能使用它们:

$this->load->library('class name');

class name是你想要使用的类名。例如，要载入'验证类'，你可以这样做：

$this->load->library('validation');

一旦类库被载入，你就可以按照用户手册中的方法来使用它们。

创建类库

请阅读用户手册中关于 创建你自己的类库 的部分。

翻译贡献者: Hex, lishen2, longbill
最后修改: 2008-05-23 12:39:53

上一个主题: 插件 · 页首 · 用户指南首页 · 下一个主题: 创建程序库


CodeIgniter 中国首页 › 用户指南首页 › 管理你的应用程序

管理你的应用程序

默认情况下，你会将应用程序放入system/application/中，并且可能用 CodeIgniter 只管理这一个应用程序。当然，多个应用程序共享一个 CodeIgniter， 甚至对 application 文件夹进行重命名或更换路径也是可行的。

对应用程序文件夹重命名

如果你要对 application 进行重命名， 你需要打开 index.php 文件，对变量 $application_folder 进行更改:

$application_folder = "application";

更改你的应用程序的文件夹路径

你可以将 application文件夹从system 文件夹中挪放到服务器的其他的位置。但是你还要更改 index.php 文件里将$application_folder变量设置为服务器的全路径。

$application_folder = "/Path/to/your/application";

在一个 CodeIgniter 下运行多个应用程序

如果你想要多个应用程序共享同一个 CodeIgniter， 你要将 application 下所有的文件夹放在不同的应用程序的文件夹内。

例如，你要建立两个应用程序 "foo" 和 "bar",你的应用程序文件夹的结构可能会像下面的这样:

system/application/foo/
system/application/foo/config/
system/application/foo/controllers/
system/application/foo/errors/
system/application/foo/libraries/
system/application/foo/models/
system/application/foo/views/
system/application/bar/
system/application/bar/config/
system/application/bar/controllers/
system/application/bar/errors/
system/application/bar/libraries/
system/application/bar/models/
system/application/bar/views/

要选择使用某个应用程序，你需要打开主 index.php 文件，并且设置 $application_folder 变量为目标路径。例如，通过如下设置，就可以选择使用 "foo" 应用程序:

$application_folder = "application/foo";

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

翻译贡献者: aykirk, Hex, thankwsx, zhupeng
最后修改: 2008-04-29 17:21:49

上一个主题: 评测你的应用程序 · 页首 · 用户指南首页 · 下一个主题: PHP 替代语法


CodeIgniter 中国首页 › 用户指南首页 › 模型

模型

模型对于那些想用传统MVC方式的人来说是可选的。

  • 什么是模型?
  • 剖析模型
  • 载入模型
  • 自动载入模型
  • 连接数据库

什么是模型?

模型是专门用来和数据库打交道的PHP类。例如，假设你想用CodeIgniter来做一个Blog。你可以写一个模型类，里面包含插入、更新、删除Blog数据的方法。下面的例子将向你展示一个普通的模型类:

class Blogmodel extends Model {

    var $title   = '';
    var $content = '';
    var $date    = '';

    function Blogmodel()
    {
        // Call the Model constructor for PHP4
        parent::Model();
    }

    function get_last_ten_entries()
    {
        $query = $this->db->get('entries', 10);
        return $query->result();
    }

    function insert_entry()
    {
        $this->title   = $_POST['title']; // 请阅读下方的备注
        $this->content = $_POST['content'];
        $this->date    = time();

        $this->db->insert('entries', $this);
    }

    function update_entry()
    {
        $this->title   = $_POST['title'];
        $this->content = $_POST['content'];
        $this->date    = time();

        $this->db->update('entries', $this, array('id' => $_POST['id']));
    }

}

注意: 上面用到的函数是 Active Record 数据库函数.

备注: 为了简单一点，我们直接使用了$_POST。不过，这不太好，平时我们应该使用 输入类：$this->input->post('title')

剖析模型

模型类文件存放在 application/models/ 文件夹。 如果你愿意，可以在里面建立子文件夹。

最基本的模型类必须像这样:

class Model_name extends Model {

    function Model_name()
    {
        parent::Model();
    }
}

Model_name 是模型类的名字。 类名的首字母必须大写，其他字母小写。 并且确保你的类继承了基本模型类(Base Model Class)。

文件名应该是模型类名的小写版。比如，如果你的类是:

class User_model extends Model {

    function User_model()
    {
        parent::Model();
    }
}

类的文件名应该是：

application/models/user_model.php

载入模型

模型可以在 controller 中被引用。 就像这样:

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

如果模型文件在子文件夹下，引用的时候要带上相对路径名。例如：如果你有一个模型 application/models/blog/queries.php。 下面的代码可以引用它:

$this->load->model('blog/queries');

模型一旦被载入，你就能通过下面的方法使用它:

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

$this->Model_name->function();

如果你想给你的model指派一个不同的对象名，可以在加载模型函数中指定第二个参数：

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

$this->fubar->function();

这里有个控制器的例子，加载一个模型，然后通过视图显示出来

class Blog_controller extends Controller {

    function blog()
    {
        $this->load->model('Blog');

        $data['query'] = $this->Blog->get_last_ten_entries();

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

自动载入模型

如果您需要一个在整个项目中都起作用的特定模型，您可以让 CodeIgniter 在初始化时自动装载它。实现的方法是打开 application/config/autoload.php 文件，然后在自动装载数组中添加上这个模型。

连接到数据库

当一个模型被载入时，它并不会自动连接数据库。以下方法可以使您连接数据库:

  • 您可以使用标准方法来连接数据库（说明）, 也可以通过控制器或者您的自定义模型。
  • 您可以把第三个参数设置为TRUE来使模型装载函数自动连接数据库，连接配置可以在您的数据库配置文件中可以定义:
    • $this->load->model('Model_name', '', TRUE);
  • 您可以手动设定第三个参数来载入您的自定义数据库配置:

  $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);

翻译贡献者: analyzer, Hex, longbill, shishirui, soyota
最后修改: 2008-11-26 23:01:42

上一个主题: 视图 · 页首 · 用户指南首页 · 下一个主题: 辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 插件

插件

插件的工作方式几乎和辅助函数一模一样。它们最主要的区别在于插件文件一般只有一个函数，而辅助函数文件里面通常是一系列函数。 辅助函数被看作系统核心的一部分，而插件通常是网友制作和分享的。

插件文件一般保存在system/plugins 文件夹。 但是你仍然可以选择在你的application文件夹下建立一个叫plugins的文件夹来存放它们。CodeIgniter 将会先在system/application/plugins 寻找对应的插件文件，如果目录不存在或者目录下没有对应的插件文件，CI 才会载入 system/plugins下的插件文件。

载入插件

载入插件是非常简单的:

$this->load->plugin('name');

name 是插件文件的名字(不带.php后缀 和"plugin" 部分)。

例如，要载入文件名为captcha_pi.php的Captcha 插件，你将会用到下面的语句:

$this->load->plugin('captcha');

插件可以在你的控制器(controller)的任何地方被载入，甚至可以在视图(View)文件中被载入(我们并不建议你这么做)。请在使用插件之前载入他们。你可以在你的控制器构造函数中载入它们，以便插件能自动在其他函数之前被载入。你也可以在要用到插件的地方当场载入。

注意: 插件载入函数并没有返回值，所以不要尝试将它赋给一个变量，直接像这样用就可以了。

载入多个插件

如果你想一次载入多个插件，你可以这样做:

$this->load->plugin( array('plugin1', 'plugin2', 'plugin3') );

自动载入插件

如果你想要的话，CodeIgniter可以自动为你载入插件。你可以通过打开 application/config/autoload.php ，并往自动载入数组(autoload array)中增加插件来实现。

使用插件

一旦你载入了想要用到插件文件，你就可以用标准的函数调用方法来使用里面的函数。

翻译贡献者: Hex, longbill, shishirui, zhupeng
最后修改: 2008-10-05 12:21:11

上一个主题: 助手函数 · 页首 · 用户指南首页 · 下一个主题: 使用程序库


CodeIgniter 中国首页 › 用户指南首页 › 评测你的应用程序

评测你的应用程序

该分析器将在页面下方显示基准测试结果，运行过的 SQL 语句，以及 $_POST 数据。这些信息有助于开发过程中的调试和优化。

初始化类

注意: 此分析器无须手动初始化.如果已按照下面的方式激活,他将被输出类自动装载。

激活分析器

在控制器中设置以下方法以激活该分析器

$this->output->enable_profiler(TRUE);

分析器激活后将产生一个报告并插入您的页面底部

使用以下方法禁用该分析器:

$this->output->enable_profiler(FALSE);

设定基准点

为了让该分析器编译和显示你的测试数据，你必须使用特定的语法命名基准点。

请在基准测试类部分阅读关于设置基准点的资料。

翻译贡献者: chouqiuqiu, Hex, teamoustar
最后修改: 2008-06-28 12:34:02

上一个主题: 缓存 · 页首 · 用户指南首页 · 下一个主题: 管理应用程序


CodeIgniter 中国首页 › 用户指南首页 › 快速参考图

快速参考图

此图的 PDF 版本，单击这里。

翻译贡献者: Hex
最后修改: 2008-02-02 20:12:57

页首


CodeIgniter 中国首页 › 用户指南首页 › 保留字

保留字

为了便于编程，CodeIgniter使用了一系列的函数和名称来完成操作。所以，有些名称不能被程序员使用。下面是不能被程序员使用的保留字列表。

控制器名称

因为你的控制器类将继承主程序控制器，所以你的函数命名一定不能和主程序控制器类中的函数名相同，否则你的局部函数将会覆盖他们。下面列出了已经保留的名称，请不要将你的控制器方法命名为这些：

  • Controller
  • CI_Base
  • _ci_initialize
  • _ci_scaffolding
  • index

如果你使用的是 PHP 4 这里有一些附加的名字。这些只在 PHP 4 下会被使用。

  • CI_Loader
  • 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()

变量

  • $config
  • $mimes
  • $lang

常量

  • 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

翻译贡献者: Hex, lishen2
最后修改: 2009-02-22 00:42:30

上一个主题: 控制器 · 页首 · 用户指南首页 · 下一个主题: 视图


CodeIgniter 中国首页 › 用户指南首页 › URI 路由

URI 路由

一般来说，URI字符串有着和它唯一对应的控制器(controller)类/方法。URI的各个部分是如下模式（pattern）：

example.com/class/function/id/

然而在一些例子中,你也许想重定向这种关系来调用一个不同的类/方法(class/function),而不是与URL一一对应(的调用).

例如，你可能想使你的URL采用这种原型（prototype）：

example.com/product/1/
example.com/product/2/
example.com/product/3/
example.com/product/4/

一般情况下，URL的第二个部分表示方法名，不过在上面的例子中，它表示一个产品的ID。CodeIgniter可以实现这个功能，让用户可以重新定向(remap)URI处理程序.

设定你自己的路由规则

路由规则定义在application/config/routes.php 文件中. 在此文件中，你可以看到一个名为 $route的数组，它可以让你定义你自己的路由规则。 定义可以用两种方式： 通配符(wildcards) 或者 正则表达式(Regular Expressions)

通配符

一个典型的通配符路由看起来是这样的：

$route['product/:num'] = "catalog/product_lookup";

在一个路由中,数组的键包含着被匹配的URI,而数组的值包含着路由将被重定向的目的地.在上面的例子中,如果单词“product”出现在URL的第一个部分中，而且数字(:num)出现在URI的第二个部分中,"catalog"类和"product_lookup"方法将被替代使用(即将被重定向).

你可以匹配文字的值或者使用以下两种通配符类型:

:num
:any

:num 将匹配一个只包含有数字的segment(段).
:any 将匹配一个包含任何字符的segment.

注意: 路由将会按照定义的顺序来运行.高层的路由总是优先于低层的路由.

Examples

下面是一些简单的例子:

$route['journals'] = "blogs";

如果URL的第一个分段（类名）是关键字"journals"，那么将会重定向到"blogs"类中处理.

$route['blog/joe'] = "blogs/users/34";

如果URL的前两个分段是"blog"和"joe"，那么将会重定向到"blogs"类的"users"方法中处理.并且将ID"34"设为参数.

$route['product/:any'] = "catalog/product_lookup";

当"product"作为URL中第一个分段时, 无论第二分段是什么都将被重定向到"catalog"类的"product_lookup"方法.

$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";

当“product”作为 URL 中第一个分段时, 无论第二分段是什么都将被重定向到“catalog”类，并传递所匹配的内容到“product_lookup_by_id”方法中。

重要提示: 不要在前面或后面加"/".

正则表达式

如果你喜欢可以使用正则表达式来自定义你的路由规则. 任何有效的正则表达式都是被允许的, 甚至逆向引用.

注意: 如果你使用逆向引用请将双反斜线语法替换为美元符语法（\\1 替换为 $1).

一个典型的正则表达式看起来像下面的样子:

$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";

上例中, 类似于 products/shirts/123 的URI 将换成调用 shirts 控制器类的 id_123 方法.

你也可以混合使用通配符与正则表达式.

Reserved Routes

这里有两个需被保留的路由:

$route['default_controller'] = 'welcome';

这个路由指出当URI中不包含任何数据时默认使用的控制器是哪个,当别人加载你的根URL时这个就是实例. 上例中, "welcome" 类将被默认加载. 你应该总是保证一个默认路由，否则你的首页将会默认显示404错误.

$route['scaffolding_trigger'] = 'scaffolding';

该路由为您设置了一个秘密词，在URL触发器脚手架特点。详情请阅读 脚手架 相关部分页面.

重要讯息: 在所有通配符或正则表达式路由之前使用它.

翻译贡献者: architectcom, caincheung, chouqiuqiu, Hex, nardo, shnwqshnwq
最后修改: 2008-09-04 23:47:34

上一个主题: 脚手架(Scaffolding) · 页首 · 用户指南首页 · 下一个主题: 错误处理


CodeIgniter 中国首页 › 用户指南首页 › 脚手架(Scaffolding)
搜索用户指南

脚手架(Scaffolding)

Scaffolding has been deprecated from CodeIgniter as of 1.6.0.

CodeIgniter 的脚手架功能使您可以在开发过程中方便快速的在数据库中添加、删除、修改数据。

非常重要: 脚手架(Scaffolding)只可以在开发过程中使用。因为它提供了非常少的安全保护，所以可以访问到您的 CodeIgniter 站点的任何人都可以添加删除或修改您数据库中的数据。如果您使用脚手架，那么请确认您在使用完之后一定要立刻禁止它。千万不要在上线的站点中激活它，并且一定要在使用前给它设置一个密匙（secret word）。

为什么要使用脚手架？

这是一个经典场景：开发过程中，你创建了一个数据表并且希望快速地插入一些数据。没有“脚手架”时，你要么写些插入命令，要么就使用如phpMyAdmin之类的数据库管理工具。用CodeIgniter的脚手架特性，你可以快捷地通过浏览器添加数据。当你用完时，也可以轻易删除掉这些数据。

设置一个密匙（Secret Word）

激活脚手架之前，要先设置一个密匙。我们将通过这个密匙来启动脚手架，所以要用一些不常见的词防止被人猜到。

设置密匙，打开文件 application/config/routes.php 找到下面字段：

$route['scaffolding_trigger'] = '';

把值替换成你的密匙

注意： 脚手架密匙 不能 以下划线开头。

激活脚手架

注意：本页信息假设你已经知道 控制器 是怎么工作的了, 并且你已经有一个正在运行的控制器。同时，我们假设你已经设置好CodeIgniter使之能自动连上 数据库 。如果不是，此页的信息不会很有价值，所以我们建议你先阅读相关内容。最后，我们假设你已经知道什么叫类的构造函数。否则，请阅读 控制器 的最后一节。

激活脚手架，你的控制器构造函数应该有像这样的代码：

<?php
class Blog extends Controller {

       function Blog()
       {
            parent::Controller();

            $this->load->scaffolding('table_name');
       }
}
?>

此处的 table_name 为你想操作的数据表名 (表名，不是数据库名)

一旦初始化脚手架，你可以以这样的URL来访问它：

example.com/index.php/class/secret_word/

比如，控制器名为 Blog ，密匙为 abracadabra , 你可以这样访问脚手架：

example.com/index.php/blog/abracadabra/

脚手架界面是简单明了的。你可以添加，修改或删除数据。

最后需要注意的地方:

脚手架特性只能操作有主键的表，因为这是各种数据库函数所必需的信息。

翻译贡献者: Hex, iptton, shishirui, zwldy001
最后修改: 2009-02-22 00:43:52

上一个主题: 公共函数 · 页首 · 用户指南首页 · 下一个主题: URI 路由


CodeIgniter 中国首页 › 用户指南首页 › 安全

安全

本页描述了一些关于 Web 安全的“最佳实践”，并详细说明了 CodeIgniter 的内部安全特性。

URI 安全

CodeIgniter 严格限制 URI 中所能包含的字符，以此帮助你设计的程序减少被恶意数据入侵的可能。URI 一般只包含下列内容：

  • 字母和数字
  • 波浪符： ~
  • 句号： .
  • 冒号： :
  • 下划线： _
  • 破折号： -

GET、POST 和 COOKIE 数据

当系统使用URI分段而不是传统的URL请求字符串时GET 数据被禁止使用(除非你已经在配置文件中开启了字符串请求). 在系统初始化期间全局GET数据被Input类设为unset.

Register_globals

系统初始化期间所有的全局变量都被unset, 除了那些在$_POST和$_COOKIE 数组中的数据. 实际上unsetting 实例程序的作用与register_globals = off 相同.

magic_quotes_runtime

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

最佳实践

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

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

CodeIgniter 提供了下列函数以辅助这个过程:

  • XSS 过滤

    CodeIgniter带有一个跨站脚本过滤器. 这个过滤器会查找那些用通常手段嵌入到你数据中恶意的Javascript,或其它一些试图欺骗cookie类型的或者做其它恶意事情的代码. XSS Filter的详细描述在 这里.

  • 验证数据

    CodeIgniter 有一个表单验证类用来帮助验证、过滤和预处理数据。

  • 插入数据库之前转义所有数据

    不要插入未转义的信息到你的数据库中。要了解更多信息请参阅查询章节。

翻译贡献者: Hex, lishen2, shnwqshnwq
最后修改: 2009-02-21 17:57:45

上一个主题: PHP 替代语法 · 页首 · 用户指南首页 · 下一个主题: 开发规范


开发规范

CodeIgniter 中国首页 › 用户指南首页 › 开发规范
搜索用户指南
查看原文

常用风格和语法

下面将描述采用CI开发中的编码的规范.

内容列表

  • 文件格式
  • PHP 闭合标签
  • 类和方法的命名
  • 变量命名
  • 注释
  • 常量
  • TRUE, FALSE, 和NULL
  • 逻辑运算符
  • 比较返回值和类型选角
  • 调试代码
  • 空行分割
  • 兼容性
  • 用常规词做类名和文件名
  • 数据库表名
  • 一个文件一个类
  • 空白
  • 断行
  • 代码缩进
  • Bracket and Parenthetic Spacing
  • Localized Text in Control Panel
  • 私有方法和变量
  • PHP 错误
  • 短标签
  • 每行一条语句
  • 字符串
  • SQL 查询
  • 缺省函数参数
  • Overlapping Tag Parameters

文件格式

文件应该使用 Unicode (UTF-8) 编码保存。同时不要使用 字节序标记(BOM) 。与 UTF-16 和 UTF-32 不同，UTF-8 编码的文件不需要指明字节序，而且 字节序标记(BOM) 在PHP中会产生预期之外的输出，阻止了应用程序设置它自己的头信息。应该使用Unix 格式的行结束符(LF)。

以下是在一些常见的文本编辑器中更改这些设置的方法。针对你的编辑器，方法也许会有所不同；请参考你的编辑器的说明。

TextMate
  1. Open the Application Preferences
  2. Click Advanced, and then the "Saving" tab
  3. In "File Encoding", select "UTF-8 (recommended)"
  4. In "Line Endings", select "LF (recommended)"
  5. Optional: Check "Use for existing files as well" if you wish to modify the line endings of files you open to your new preference.
BBEdit
  1. Open the Application Preferences
  2. Select "Text Encodings" on the left.
  3. In "Default text encoding for new documents", select "Unicode (UTF-8, no BOM)"
  4. Optional: In "If file's encoding can't be guessed, use", select "Unicode (UTF-8, no BOM)"
  5. Select "Text Files" on the left.
  6. In "Default line breaks", select "Mac OS X and Unix (LF)"

PHP 闭合标签

PHP闭合标签“?>”在PHP中对PHP的分析器是可选的。 但是，如果使用闭合标签，任何由开发者，用户，或者FTP应用程序插入闭合标签后面的空格都有可能会引起多余的输出、php错误、之后的输出无法显示、空白页。因此，所有的php文件应该省略这个php闭合标签，并插入一段注释来标明这是文件的底部并定位这个文件在这个应用的相对路径。这样有利于你确定这个文件已经结束而不是被删节的。

INCORRECT: <?php echo "Here's my code!"; ?> CORRECT: <?php echo "Here's my code!"; /* End of file myfile.php */ /* Location: ./system/modules/mymodule/myfile.php */

类和方法（函数）的命名规则

类名的首字母应该大写，构造方法的名称要与类名相同。如果名称由多个词组成，词之间要用下划线分隔，不要使用骆驼命名法。类中所有其他方法的名称应该完全小写并且名称能明确指明这个函数的用途，最好用动词开头。尽量避免过长和冗余的名称

不当的: class superclass class SuperClass 适当的: class Super_class

注意，类名和构造方法名应该使用相同的命名和大小写：

class Super_class {

 function Super_class()
 {

 }
}

不当的和适当的方法名称的示例：

不当的: function fileproperties() // not descriptive and needs underscore separator function fileProperties() // not descriptive and uses CamelCase function getfileproperties() // Better! But still missing underscore separator function getFileProperties() // uses CamelCase function get_the_file_properties_from_the_file() // wordy 适当的: function get_file_properties() // descriptive, underscore separator, and all lowercase letters

变量命名

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

不当的: $j = 'foo'; // single letter variables should only be used in for() loops $Str // contains uppercase letters $bufferedText // uses CamelCasing, and could be shortened without losing semantic meaning $groupid // multiple words, needs underscore separator $name_of_last_city_used // too long 适当的: for ($j = 0; $j < 10; $j++) $str $buffer $group_id $last_city

注释

通常，代码应该被详细地注释。这不仅仅有助于给缺乏经验的程序员描述代码的流程和意图，而且有助于给你提供丰富的内容以让你在几个月后再看自己的代码时仍能很好的理解。 注释没有强制规定的格式，但是我们建议以下的形式。

文档块(DocBlock) 式的注释要写在类和方法的声明前，这样它们就能被集成开发环境(IDE)捕获：

/** * Super Class * * @package Package Name * @subpackage Subpackage * @category Category * @author Author Name * @link http://example.com */ class Super_class { /** * Encodes string for use in XML * * @access public * @param string * @return string */ function xml_encode($str)

使用行注释时，在大的注释块和代码间留一个空行。

// break up the string by newlines
$parts = explode("\n", $str);

// A longer comment that needs to give greater detail on what is
// occurring and why can use multiple single-line comments.  Try to
// keep the width reasonable, around 70 characters is the easiest to
// read.  Don't hesitate to link to permanent external resources
// that may provide greater detail:
//
// http://example.com/information_about_something/in_particular/

$parts = $this->foo($parts);

常量

常量命名除了要全部用大写外，其他的规则都和变量相同。Always use CodeIgniter constants when appropriate, i.e. SLASH, LD, RD, PATH_CACHE, etc.

不当的: myConstant // missing underscore separator and not fully uppercase N // no single-letter constants S_C_VER // not descriptive $str = str_replace('{foo}', 'bar', $str); // should use LD and RD constants 恰当的: MY_CONSTANT NEWLINE SUPER_CLASS_VERSION $str = str_replace(LD.'foo'.RD, 'bar', $str);

TRUE, FALSE, 和 NULL

TRUE, FALSE, 和 NULL 关键字应该总是完全大写的。

不当的:
if ($foo == true)
$bar = false;
function foo($bar = null)

恰当的:
if ($foo == TRUE)
$bar = FALSE;
function foo($bar = NULL)

逻辑操作符

|| 有时让人底气不足，因为在某些输出设备上它不够清晰(可能看起来像数字11). && 要优先于 AND 不过两者都可以接受, 在 ! 的前后都要加一个空格。

不当的:
if ($foo || $bar)
if ($foo AND $bar)  // 可以，但不被常用的语法高亮程序推荐
if (!$foo)
if (! is_array($foo))

恰当的:
if ($foo OR $bar)
if ($foo && $bar) // 推荐
if ( ! $foo)
if ( ! is_array($foo))

Comparing Return Values and Typecasting

Some PHP functions return FALSE on failure, but may also have a valid return value of "" or 0, which would evaluate to FALSE in loose comparisons. Be explicit by comparing the variable type when using these return values in conditionals to ensure the return value is indeed what you expect, and not a value that has an equivalent loose-type evaluation.

Use the same stringency in returning and checking your own variables.  Use === and !== as necessary.

INCORRECT:
// If 'foo' is at the beginning of the string, strpos will return a 0,
// resulting in this conditional evaluating as TRUE
if (strpos($str, 'foo') == FALSE)

CORRECT:
if (strpos($str, 'foo') === FALSE)

INCORRECT:
function build_string($str = "")
{
 if ($str == "") // uh-oh!  What if FALSE or the integer 0 is passed as an argument?
 {

 }
}

CORRECT:
function build_string($str = "")
{
 if ($str === "")
 {

 }
}

See also information regarding typecasting, which can be quite useful. Typecasting has a slightly different effect which may be desirable. When casting a variable as a string, for instance, NULL and boolean FALSE variables become empty strings, 0 (and other numbers) become strings of digits, and boolean TRUE becomes "1":

$str = (string) $str; // cast $str as a string

Debugging Code

No debugging code can be left in place for submitted add-ons unless it is commented out, i.e. no var_dump(), print_r(), die(), and exit() calls that were used while creating the add-on, unless they are commented out.

// print_r($foo);

Whitespace in Files

No whitespace can precede the opening PHP tag or follow the closing PHP tag. Output is buffered, so whitespace in your files can cause output to begin before CodeIgniter outputs its content, leading to errors and an inability for CodeIgniter to send proper headers. In the examples below, select the text with your mouse to reveal the incorrect whitespace.

INCORRECT:

<?php // ...there is whitespace and a linebreak above the opening PHP tag // as well as whitespace after the closing PHP tag ?>

CORRECT:

<?php // this sample has no whitespace before or after the opening and closing PHP tags ?>

Compatibility

Unless specifically mentioned in your add-on's documentation, all code must be compatible with PHP version 4.3+. Additionally, do not use PHP functions that require non-default libraries to be installed unless your code contains an alternative method when the function is not available, or you implicitly document that your add-on requires said PHP libraries.

Class and File Names using Common Words

When your class or filename is a common word, or might quite likely be identically named in another PHP script, provide a unique prefix to help prevent collision. Always realize that your end users may be running other add-ons or third party PHP scripts. Choose a prefix that is unique to your identity as a developer or company.

INCORRECT: class Email pi.email.php class Xml ext.xml.php class Import mod.import.php CORRECT: class Pre_email pi.pre_email.php class Pre_xml ext.pre_xml.php class Pre_import mod.pre_import.php

Database Table Names

Any tables that your add-on might use must use the 'exp_' prefix, followed by a prefix uniquely identifying you as the developer or company, and then a short descriptive table name. You do not need to be concerned about the database prefix being used on the user's installation, as CodeIgniter's database class will automatically convert 'exp_' to what is actually being used.

INCORRECT: email_addresses // missing both prefixes pre_email_addresses // missing exp_ prefix exp_email_addresses // missing unique prefix CORRECT: exp_pre_email_addresses

NOTE: Be mindful that MySQL has a limit of 64 characters for table names. This should not be an issue as table names that would exceed this would likely have unreasonable names. For instance, the following table name exceeds this limitation by one character. Silly, no? exp_pre_email_addresses_of_registered_users_in_seattle_washington

一个文件一个类

Use separate files for each class your add-on uses, unless the classes are closely related. An example of CodeIgniter files that contains multiple classes is the Database class file, which contains both the DB class and the DB_Cache class, and the Magpie plugin, which contains both the Magpie and Snoopy classes.

Whitespace

Use tabs for whitespace in your code, not spaces. This may seem like a small thing, but using tabs instead of whitespace allows the developer looking at your code to have indentation at levels that they prefer and customize in whatever application they use. And as a side benefit, it results in (slightly) more compact files, storing one tab character versus, say, four space characters.

断行

Files must be saved with Unix line breaks. This is more of an issue for developers who work in Windows, but in any case ensure that your text editor is setup to save files with Unix line breaks.

代码缩进

使用 Allman 风格缩进。除了类声明以外，括号总是独占一行，且缩进与“属于”它的控制语句同级。

不恰当的:
function foo($bar) {
 // ...
}

foreach ($arr as $key => $val) {
 // ...
}

if ($foo == $bar) {
 // ...
} else {
 // ...
}

for ($i = 0; $i < 10; $i++)
 {
 for ($j = 0; $j < 10; $j++)
  {
  // ...
  }
 }

恰当的:
function foo($bar)
{
 // ...
}

foreach ($arr as $key => $val)
{
 // ...
}

if ($foo == $bar)
{
 // ...
}
else
{
 // ...
}

for ($i = 0; $i < 10; $i++)
{
 for ($j = 0; $j < 10; $j++)
 {
  // ...
 }
}

Bracket and Parenthetic Spacing

In general, parenthesis and brackets should not use any additional spaces. The exception is that a space should always follow PHP control structures that accept arguments with parenthesis (declare, do-while, elseif, for, foreach, if, switch, while), to help distinguish them from functions and increase readability.

INCORRECT: $arr[ $foo ] = 'foo'; CORRECT: $arr[$foo] = 'foo'; // no spaces around array keys INCORRECT: function foo ( $bar ) { } CORRECT: function foo($bar) // no spaces around parenthesis in function declarations { } INCORRECT: foreach( $query->result() as $row ) CORRECT: foreach ($query->result() as $row) // single space following PHP control structures, but not in interior parenthesis

Localized Text in Control Panel

Any text that is output in the control panel should use language variables in your module's lang file to allow localization.

INCORRECT: return "Invalid Selection"; CORRECT: return $LANG->line('invalid_selection');

Private Methods and Variables

Methods and variables that are only accessed internally by your class, such as utility and helper functions that your public methods use for code abstraction, should be prefixed with an underscore.

convert_text() // public method _convert_text() // private method

PHP Errors

Code must run error free and not rely on warnings and notices to be hidden to meet this requirement. For instance, never access a variable that you did not set yourself (such as $_POST array keys) without first checking to see that it isset().

Make sure that while developing your add-on, error reporting is enabled for ALL users, and that display_errors is enabled in the PHP environment. You can check this setting with:

if (ini_get('display_errors') == 1)
{
 exit "Enabled";
}

On some servers where display_errors is disabled, and you do not have the ability to change this in the php.ini, you can often enable it with:

ini_set('display_errors', 1);

NOTE: Setting the display_errors setting with ini_set() at runtime is not identical to having it enabled in the PHP environment. Namely, it will not have any effect if the script has fatal errors

Short Open Tags

Always use full PHP opening tags, in case a server does not have short_open_tag enabled.

INCORRECT: <? echo $foo; ?> <?=$foo?> CORRECT: <?php echo $foo; ?>

One Statement Per Line

Never combine statements on one line.

INCORRECT:
$foo = 'this'; $bar = 'that'; $bat = str_replace($foo, $bar, $bag);

CORRECT:
$foo = 'this';
$bar = 'that';
$bat = str_replace($foo, $bar, $bag);

Strings

Always use single quoted strings unless you need variables parsed, and in cases where you do need variables parsed, use braces to prevent greedy token parsing. You may also use double-quoted strings if the string contains single quotes, so you do not have to use escape characters.

INCORRECT: "My String" // no variable parsing, so no use for double quotes "My string $foo" // needs braces 'SELECT foo FROM bar WHERE baz = \'bag\'' // ugly CORRECT: 'My String' "My string {$foo}" "SELECT foo FROM bar WHERE baz = 'bag'"

SQL Queries

MySQL keywords are always capitalized: SELECT, INSERT, UPDATE, WHERE, AS, JOIN, ON, IN, etc.

Break up long queries into multiple lines for legibility, preferably breaking for each clause.

INCORRECT: // keywords are lowercase and query is too long for // a single line (... indicates continuation of line) $query = $this->db->query("select foo, bar, baz, foofoo, foobar as raboof, foobaz from exp_pre_email_addresses ...where foo != 'oof' and baz != 'zab' order by foobaz limit 5, 100"); CORRECT: $query = $this->db->query("SELECT foo, bar, baz, foofoo, foobar AS raboof, foobaz FROM exp_pre_email_addresses WHERE foo != 'oof' AND baz != 'zab' ORDER BY foobaz LIMIT 5, 100");

Default Function Arguments

Whenever appropriate, provide function argument defaults, which helps prevent PHP errors with mistaken calls and provides common fallback values which can save a few lines of code. Example:

function foo($bar = '', $baz = FALSE)

Overlapping Tag Parameters

Avoid multiple tag parameters that have effect on the same thing. For instance, instead of include= and exclude=, perhaps allow include= to handle the parameter alone, with the addition of "not", e.g. include="not bar". This will prevent problems of parameters overlapping or having to worry about which parameter has priority over another.

翻译贡献者: bnlt, Hex, ianyang, neversaylate, shallow, yinzhili
最后修改: 2009-09-12 14:03:02

上一个主题: 安全 · 页首 · 用户指南首页


URL

CodeIgniter 中国首页 › 用户指南首页 › URL
搜索用户指南
查看原文

CodeIgniter URL

默认情况下，CodeIgniter 中的 URL 被设计成对搜索引擎和人类友好。不同于使用标准“查询字符串”方法的是，CodeIgniter 使用基于段的方法：

example.com/news/article/my_article

注意：查询字符串形式的 URL 是可选的，分述如下。

URI 段

根据模型-视图-控制器模式，在此 URL 段一般以如下形式表示：

example.com/class/function/ID
  1. 第一段表示调用控制器类。
  2. 第二段表示调用类中的函数或方法。
  3. 第三及更多的段表示的是传递给控制器的参数，如 ID 或其他各种变量。

URI 类和 URL 辅助函数中的函数可以使你的 URI 更简单的工作。另外，使用 URI 路由特性可以将你的 URL 重定向，以获得更大的灵活性。

删除 index.php 文件

默认情况下，index.php 文件将被包含在你的 URL 中：

example.com/index.php/news/article/my_article

你可以很容易的通过 .htaccess 文件来设置一些简单的规则删除它。下面是一个例子，使用“negative”方法将非指定内容进行重定向：

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

如果你的项目不在根目录请把上面这一句改为：RewriteRule ^(.*)$ index.php/$1 [L]

在上面的例子中，可以实现任何非 index.php、images 和 robots.txt 的 HTTP 请求都被指向 index.php。

添加 URL 后缀

通过设置 config/config.php 文件，你可以为 CodeIgniter 生成的 URL 添加一个指定的文件后缀。举例来说，如果 URL 是这样的：

example.com/index.php/products/view/shoes

你可以随意添加一个后缀，例如 .html，使其显示为：

example.com/index.php/products/view/shoes.html

(icebird注：英文中由于参数可直接看懂其含义，并未说明应修改哪个参数，在这里应修改$config['url_suffix']这个参数。)

启用查询字符串

在一些情况下你需要在 URL 中使用查询字符串：

index.php?c=products&m=view&id=345

CodeIgniter 支持这个功能是可选的，可以在 application/config/config.php 文件中进行设置。如果你打开 config 文件可以看到如下内容：

$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';

如果你将 enable_query_strings 更改为 TRUE ，那么这个功能就被激活了。此时，你就可以通过关键字来调用需要的控制器和方法了：

index.php?c=controller&m=method

请注意：如果你使用查询字符串，那么就必须使用自己建立的 URL ，而且不能使用URL 辅助函数（或是其他生成 URL 的辅助函数，例如表单辅助函数），因为这些都是根据分段 URL 设计的。

翻译贡献者: Hex, icebird, longjianghu, zhupeng
最后修改: 2009-07-10 15:30:05

页首 · 用户指南首页 · 下一个主题: 控制器


CodeIgniter 中国首页 › 用户指南首页 › 视图

视图

简而言之，一个视图就是一个网页，或是网页的部分，如头部，底部，侧边栏等等。事实上，如果你需要这种层次类型，视图可以很灵活的嵌入到其他视图中。

视图从不直接调用，必须被一个控制器来调用。记住，在一个 MVC 框架中，控制器扮演着交通警察的角色，那么，他有责任去取回某一特定的视图。如果你还没有阅读过控制器页面的话，你应该事先阅读控制器页面。

下面使用你在控制器页面已经创建过的示例控制器,让我们来给他添加个视图。

创建视图

使用你的文本编辑器，创建一个名为 blogview.php 的文件，写入以下代码：

然后保存文件到 application/views/ 文件夹。

载入视图

你必须使用下面的函数来载入一个视图文件:

$this->load->view('name');

上面的 name 便是你的视图文件的名字。注意：.php 文件的扩展名(后缀名)没有必要专门写出，除非你使用了其他的扩展名。

现在, 打开你先前写的名为 blog.php 控制器文件,并且使用视图载入函数替换echo段代码:

如果你使用先前你用的 URL 浏览你的网站,你将会看到你的新视图. URL 与下面的类似:

example.com/index.php/blog/

载入多个视图

CodeIgniter 能智能的处理多个从控制器发起的视图载入函数调用 $this->load->view。如果有多个调用，那么他们将会被合并到一起。例如，你可能希望有一个标题视图、一个菜单视图、一个内容视图、和一个页脚视图。他们看起来应该是这样：

<?php

class Page extends Controller {

   function index()
   {
      $data['page_title'] = 'Your title';
      $this->load->view('header');
      $this->load->view('menu');
      $this->load->view('content', $data);
      $this->load->view('footer');
   }

}
?>

在上面的例子中，我们使用了“动态添加数据”，你将在下面看到。

用子文件夹存储视图

如果你想让文件更有组织性,你也可以用子文件夹来存储你的视图文件.. 当你在载入视图时,必须加上子文件夹的名字. 示例如下:

$this->load->view('folder_name/file_name');

给视图添加动态数据

数据通过控制器以一个数组或是对象的形式传入视图 , 这个数组或对象作为视图载入函数的第二个参数 .下面便是使用数组的示例:

$data = array(
'title' => 'My Title',
'heading' => 'My Heading',
'message' => 'My Message'
);

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

这里是使用对象的示例:

$data = new Someclass();
$this->load->view('blogview', $data);

当我们一次性载入多个视图的时候，你只需在第一个视图传入数据就可以了(hader视图显示title,content视图显示message)，比如：

<?php

class Page extends Controller {

   function index()
   {
      $data['title'] = 'Your title';
      $data['message'] = 'Your message';
      $this->load->view('header',$data);
      $this->load->view('content');
      $this->load->view('footer');
   }

}
?>

注意：如果你使用一个对象，那么类变量将转换为数组元素。

好了，让我们用你的控制器试试。打开控制器并添加以下代码：

现在，打开你的视图文件，将其中的文本替换成与数组对应的变量：

然后使用你先前用过的URL载入页面，你将看到变量已经被替换。

创建循环

你传入视图文件的数据，不仅仅局限于简单的变量。你可以传递多维数组。例如：你从数据库里面取出数据就是典型的多维数据。

这里是个简单的示例。添加以下代码到你的控制器：

现在打开你的视图文件，创建一个循环：

注意: 上面的例子中我们使用PHP替代语法。如果你对这种语法不熟悉，可以在这里阅读。

获取视图内容

view函数第三个可选参数可以改变函数的行为，让数据作为字符串返回而不是发送到浏览器。如果想用其它方式对数据进一步处理，这样做很有用。如果将view第三个参数设置为true（布尔）则函数返回数据。view函数缺省行为是 false,　将数据发送到浏览器。如果想返回数据，记得将它赋到一个变量中：

$string = $this->load->view('myfile', '', true);

例子：有些情况下，你并不想直接输出视图，而是仅仅想得到视图的内容以备后用。那么可以参考如下代码。

view方法中的第三个参数表示不输出视图，而只是将结果返回给一个变量。

翻译贡献者: 34333432, Hex, ianyang, irini, lishen2, longjianghu, sydcurie, thankwsx, zhupeng
最后修改: 2009-06-18 10:48:54

上一个主题: 保留字 · 页首 · 用户指南首页 · 下一个主题: 模型


CodeIgniter 中国首页 › 用户指南首页 › 数组辅助函数

数组辅助函数

数组辅助函数的文件涵盖了一些用于辅助数组操作的函数。

装载本辅助函数

本辅助函数的装载通过如下代码完成：

$this->load->helper('array');

可用的函数如下：

element()

获取数组中的元素。本函数测试数组的索引是否已设定并含有数值。如果已设有数值则返回该数值，否则返回 FALSE，或任何你设定的默认数值（函数第三个参数）。范例：

$array = array('color' => 'red', 'shape' => 'round', 'size' => '');

// 返回 "red"
echo element('color', $array);

// 返回 NULL
echo element('size', $array, NULL);

random_element()

根据提供的数组，随机返回该数组内的一个元素。使用范例：

$quotes = array(
            "I find that the harder I work, the more luck I seem to have. - Thomas Jefferson",
            "Don't stay in bed, unless you can make money in bed. - George Burns",
            "We didn't lose the game; we just ran out of time. - Vince Lombardi",
            "If everything seems under control, you're not going fast enough. - Mario Andretti",
            "Reality is merely an illusion, albeit a very persistent one. - Albert Einstein",
            "Chance favors the prepared mind - Louis Pasteur"
            );

echo random_element($quotes);

翻译贡献者: canglan, Hex
最后修改: 2008-06-28 13:04:32

上一个主题: Zip 编码类 · 页首 · 用户指南首页 · 下一个主题: 兼容性辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 兼容性辅助函数

兼容性辅助函数

兼容性辅助函数利用PHP4的代码，仿制了一些PHP5中才有的一些新的库函数和常量。这样，在一个基于PHP4的服务器上当你需要使用这些PHP5的函数时，这个辅助函数会给你带来帮助。这时，你可以通过Auto-load来实现自动的调用，而不必在每一个控制器中都分别载入这个辅助函数。

说明: 在CI的本地文件Compat.php中包含一些兼容性函数，你可以在不载入“兼容性辅助函数”的前提下使用他们。兼容性函数被分开存放在Compat.php文件和这个helper中，因此，只有那些框架中用使用到了的函数才会被默认的包含进来。 这样，你可以自由选择是否载入这个兼容性辅助函数。

载入这个辅助函数

用以下代码载入这个辅助函数：

$this->load->helper('compatibility');

可用的常量

以下常量是可用的：

PHP_EOL

当前服务器的换标志符，例如在windows系统下为"\r\n"，在类Unix系统下为，"\n"。

可用的函数

以下函数是可用的(点击链接可以查看该函数的PHP文档):

file_put_contents() - 不支持第四个参数 $context。

fputcsv()

http_build_query()

str_ireplace() - 不支持第四个参数 $count, 因为，PHP4将使他成为必须的。

stripos()

翻译贡献者: Hex, pipi95
最后修改: 2009-01-08 19:40:21

上一个主题: 数组辅助函数 · 页首 · 用户指南首页 · 下一个主题: Cookie 辅助函数


Cookie 辅助函数

CodeIgniter 中国首页 › 用户指南首页 › Cookie 辅助函数
搜索用户指南
查看原文

Cookie Helper

Cookie Helper 中包含了多个cookie辅助函数.

装载这个 helper

这个 helper 可以通过下面的方法来装载:

$this->load->helper('cookie');

下面这种方法同样可以:

set_cookie()

首先指定一个容器来存放你需要写入 cookie 的指定的值. 可以使用数组或参数的方式来将指定的值存为 cookie.

数组方式

用这种方式的话，第一个参数传递的是一个关联数组:

$cookie = array(
                   'name'   => 'The Cookie Name',
                   'value'  => 'The Value',
                   'expire' => '86500',
                   'domain' => '.some-domain.com',
                   'path'   => '/',
                   'prefix' => 'myprefix_',
               );

set_cookie($cookie);

说明:

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

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

For site-wide cookies regardless of how your site is requested, add your URL to the domain starting with a period, like this: .your-domain.com

The path is usually not needed since the function sets a root path.

The prefix is only needed if you need to avoid name collisions with other identically named cookies for your server.

Discrete Parameters

If you prefer, you can set the cookie by passing data using individual parameters:

set_cookie($name, $value, $expire, $domain, $path, $prefix);

get_cookie()

让你获取一个cookie。第一个参数包含你要查找的cookie名（包含前缀）：

get_cookie('some_cookie');

如果你试图要检索的项目不存在，本方法则返回FALSE(布尔型)。

第二个可选参数能让你使用通过XSS过滤器获得的数据。只要把第二个参数设置成布尔值的TRUE就能使用；

get_cookie('some_cookie', TRUE);

delete_cookie()

可以让你删除一个cookie,除非你设置了一个自定义的路径或者其他变量，否则只要给出cookie的名字就行了:

delete_cookie("name");

这个函数与set_cookie()函数比较像, 除了它没有值和超时参数. 你可以把一个数组作为第一个参数提交，也可以像下面这样，设置独立的参数.

delete_cookie($name, $domain, $path, $prefix)

翻译贡献者: 498621, billycui, Hex, pipi95, tonera
最后修改: 2009-09-21 14:46:27

上一个主题: 兼容性辅助函数 · 页首 · 用户指南首页 · 下一个主题: 日期辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 日期辅助函数

日期辅助函数

日期辅助函数的文件涵盖了一些用于辅助日期数组操作的函数。

装载本辅助函数

本辅助函数的装载通过如下代码完成:

$this->load->helper('date');

可用的函数如下:

now()

返回当前的 Unix 时间戳，根据你的config文件中"time reference"设定返回服务器当前时间或者GMT时间。如果你没有计划使用GMT时间(通常是你准备在站点中允许用户选择时区设置)，则此函数跟PHP中time()函数等同。

mdate()

这个函数跟PHP的内部函数date()几乎是一样的，区别在于，这个函数允许你使用在每个代码字母前带有百分号“%”的MySQL时间表达形式: %Y %m %d 等。

采用这种方式处理时间数据的优点在于，避免了你在使用date()函数时经常担心漏掉那些非时间的字符的问题。例如:

$datestring = "Year: %Y Month: %m Day: %d - %h:%i %a";
$time = time();

echo mdate($datestring, $time);

如果第二参数中不包含时间戳则使用当前时间。

standard_date()

允许你从一些标准格式生成日期字符串。例子：

$format = 'DATE_RFC822';
$time = time();

echo standard_date($format, $time);

第一个参数必须包含格式，第二个参数必须使用unix时间戳。

支持格式:

常量 | 描述 | 例子
DATE_ATOM | Atom | 2005-08-15T16:13:03+0000
DATE_COOKIE | HTTP Cookies | Sun, 14 Aug 2005 16:13:03 UTC
DATE_ISO8601 | ISO-8601 | 2005-08-14T16:13:03+0000
DATE_RFC822 | RFC 822 | Sun, 14 Aug 2005 16:13:03 UTC
DATE_RFC850 | RFC 850 | Sunday, 14-Aug-05 16:13:03 UTC
DATE_RFC1036 | RFC 1036 | Sunday, 14-Aug-05 16:13:03 UTC
DATE_RFC1123 | RFC 1123 | Sun, 14 Aug 2005 16:13:03 UTC
DATE_RFC2822 | RFC 2822 | Sun, 14 Aug 2005 16:13:03 +0000
DATE_RSS | RSS | Sun, 14 Aug 2005 16:13:03 UTC
DATE_W3C | World Wide Web Consortium | 2005-08-14T16:13:03+0000

local_to_gmt()

将unix时间戳转换为GMT。例子:

$now = time();

$gmt = local_to_gmt($now);

gmt_to_local()

输入一个GMT的unix时间戳，根据时区、夏时制转换为本地时间戳。例子：

$timestamp = '1140153693';
$timezone = 'UM8';
$daylight_saving = TRUE;

echo gmt_to_local($timestamp, $timezone, $daylight_saving);

注意：时区列表请参考本页末。

mysql_to_unix()

将MySQL时间戳转换为unix时间戳。例子：

$mysql = '20061124092345';

$unix = mysql_to_unix($mysql);

unix_to_human()

将unix时间戳转为如下人类可阅读格式：

YYYY-MM-DD HH:MM:SS AM/PM

本函数可用于需要作为表单提交的地方。

时间可以设置为含或者不含秒数，而且可以设为欧洲或美国格式。如果只有时间戳，则格式化为不含秒数的美国格式。例子：

$now = time();

echo unix_to_human($now); // U.S. time, no seconds

echo unix_to_human($now, TRUE, 'us'); // U.S. time with seconds

echo unix_to_human($now, TRUE, 'eu'); // Euro time with seconds

human_to_unix()

跟上面函数相反，这个函数将“人类”的时间表示方式（如，2008-12-31 04:38 PM）转换成unix的时间表示方式（如：1230713116）。这个函数在你接收一个从表单提交而来的“人类”的时间格式时会很有用。如果传递给这个函数的参数不是如上所说的“人类”时间格式的字符串，哪么它将返回FALSE (boolean)。例如:

$now = time();

$human = unix_to_human($now);

$unix = human_to_unix($human);

timespan()

格式化unix时间戳使其看起来像这样：

1 Year, 10 Months, 2 Weeks, 5 Days, 10 Hours, 16 Minutes

第一参数必须是unix时间戳，第二个参数是一个大于第一参数的时间戳。如果第二参数空缺，则使用当前时间。这个函数的用途通常是计算过去某一个时间点到现在的时间之间的时间差。例如:

$post_date = '1079621429';
$now = time();

echo timespan($post_date, $now);

Note:由本函数生成的文字可以在以下语言文件中找到： language/<your_lang>/date_lang.php

days_in_month()

对给出的年月值返回天数。这个函数的实现已经考虑了存在闰年和平年的情况。例如:

echo days_in_month(06, 2005);

如果省略第二参数则使用当前年。

timezones()

根据给定的时区参考(有效时区列表请参见下面的“时区参考”)返回跟UTC的相差值。

echo timezones('UM5');

本函数最有用是在使用timezone_menu()函数时.

timezone_menu()

生成一个时区下拉选单，像这样：

在你需要向你的网站会员提供他们所在时区的设置选项时这个选单会很有用的。

第一个参数让你设置选单的“已选”状态。例如，你想将美国西部标准时间设为默认时间，你可以这样做：

echo timezone_menu('UM8');

要得到这个选单的各个具体值，请看下面的时区参考表。

第二个参数让你为选单设置CSS的类名。

注意:上面选单里的每个条目可以在这个文件语言文件里找到： language/<your_lang>/date_lang.php

时区参考

下面的表说明了各个时区值以及该值对应的地点

时区 | 位置
UM12 | (UTC - 12:00) 埃尼威托克, 夸贾林环礁
UM11 | (UTC - 11:00) 诺姆, 中途岛, 萨摩亚
UM10 | (UTC - 10:00) 夏威夷
UM9 | (UTC - 9:00) 阿拉斯加
UM8 | (UTC - 8:00) 太平洋时间(美国西部标准时间)
UM7 | (UTC - 7:00) 山地时间(美国中西部时间)
UM6 | (UTC - 6:00) 美国中部时间, 墨西哥城
UM5 | (UTC - 5:00) 美国东部时间, 波哥大, 利马, 基多
UM4 | (UTC - 4:00) 大西洋时间, 加拉加斯, 拉巴斯
UM25 | (UTC - 3:30) 纽芬兰
UM3 | (UTC - 3:00) 巴西, 布宜诺斯艾利斯, 乔治城, 福克兰群岛
UM2 | (UTC - 2:00) 中部大西洋时间, 亚森欣岛, 圣赫勒拿
UM1 | (UTC - 1:00) 亚速尔群岛, 佛得角群岛
UTC | (UTC) 卡萨布兰卡, 都柏林, 爱丁堡, 伦敦, 里斯本, 蒙罗维亚
UP1 | (UTC + 1:00) 柏林, 布鲁塞尔, 哥本哈根, 马德里, 巴黎, 罗马
UP2 | (UTC + 2:00) 加里宁格勒, 南非, 华沙
UP3 | (UTC + 3:00) 巴格达, 利雅得, 莫斯科, 内罗毕
UP25 | (UTC + 3:30) 德黑兰
UP4 | (UTC + 4:00) 阿布扎比, 巴库, 马斯喀特, 第比利斯
UP35 | (UTC + 4:30) 喀布尔
UP5 | (UTC + 5:00) 伊斯兰堡, 卡拉奇, 塔什干
UP45 | (UTC + 5:30) 孟买, 加尔各答, 马德拉斯, 新德里
UP6 | (UTC + 6:00) 阿拉木图, 哥伦巴, 达卡
UP7 | (UTC + 7:00) 曼谷, 河内, 雅加达
UP8 | (UTC + 8:00) 北京, 香港, 佩斯, 新加坡, 台北
UP9 | (UTC + 9:00) 大阪, 札幌, 汉城, 东京, 雅库茨克
UP85 | (UTC + 9:30) 阿德莱德, 达尔文
UP10 | (UTC + 10:00) 墨尔本, 巴布亚新几内亚, 悉尼, 海参崴
UP11 | (UTC + 11:00) 马加丹, 新喀里多尼亚, 所罗门群岛
UP12 | (UTC + 12:00) 奥克兰, 惠灵顿, 斐济, 马绍尔群岛

翻译贡献者: Hex, mchong, pipi95, yinzhili
最后修改: 2009-06-07 10:05:23

上一个主题: Cookie 辅助函数 · 页首 · 用户指南首页 · 下一个主题: 目录辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 目录辅助函数

目录辅助函数

目录辅助函数文件包含处理目录的函数。

载入这个辅助函数

请使用如下代码载入这个辅助函数：

$this->load->helper('directory');

以下函数可以使用：

directory_map('source directory')

这个函数将读取第一个参数所给出的路径的目录，并且返回该目录所包含文件的数据。示例如下：

$map = directory_map('./mydirectory/');

注意: 路径总是相对于你的index.php文件。

如果目录含有子文件夹，也将被列出。如果你只想列出根目录，那么你就要设置第二个参数为 true (boolean).

$map = directory_map('./mydirectory/', TRUE);

默认情况下，返回的数组中不会包括那些隐藏文件。为了覆盖此行为，你可以设置第三个参数为 true (boolean):

$map = directory_map('./mydirectory/', FALSE, TRUE);

每一个文件夹的名字都将作为数组的索引，文件夹所包含的文件将以数字作为索引。下面有个典型的数组示例:

Array
(
   [libraries] => Array
   (
       [0] => benchmark.html
       [1] => config.html
       [database] => Array
       (
             [0] => active_record.html
             [1] => binds.html
             [2] => configuration.html
             [3] => connecting.html
             [4] => examples.html
             [5] => fields.html
             [6] => index.html
             [7] => queries.html
        )
       [2] => email.html
       [3] => file_uploading.html
       [4] => image_lib.html
       [5] => input.html
       [6] => language.html
       [7] => loader.html
       [8] => pagination.html
       [9] => uri.html
)

翻译贡献者: Hex, sydcurie, yinzhili
最后修改: 2009-09-13 22:38:11

上一个主题: 日期辅助函数 · 页首 · 用户指南首页 · 下一个主题: 下载辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 下载辅助函数

下载辅助函数

下载辅助函数可以下载数据到你的桌面

加载这个辅助函数

用下面的代码加载这个辅助函数

$this->load->helper('download');

下面的函数就有效:

force_download('filename', 'data')

服务器产生能下载数据到你桌面的头. 这对你下载文件有帮助. 第一个参数是下载文件的文件名, 第二个参数是文件数据. Example:

$data = 'Here is some text!';
$name = 'mytext.txt';

force_download($name, $data);

如果你想在你的服务器上下载一个存在文件，你需要将它读到一个字符串中:

$data = file_get_contents("/path/to/photo.jpg"); // 读文件内容
$name = 'myphoto.jpg';

force_download($name, $data);

翻译贡献者: Hex, moonster
最后修改: 2008-02-02 20:28:04

上一个主题: 目录辅助函数 · 页首 · 用户指南首页 · 下一个主题: Email 辅助函数


CodeIgniter 中国首页 › 用户指南首页 › Email 辅助函数

Email 辅助函数

Email 辅助函数供了一些辅助功能，用于电子邮件的相关操作。若要了解更多的电子邮件解决方案，请参阅 CodeIgniter 的 Email 类。

装载这个辅助函数

本辅助函数的装载通过如下代码完成:

$this->load->helper('email');

可用的函数如下:

valid_email('email')

检查 email 是否是一个正确的 email 地址格式。请注意，这实际上并不表示这个地址能接收邮件，只是简单地说明这是一个有效的地址格式。

这个函数返回 TRUE/FALSE

$this->load->helper('email');

if (valid_email('email@somesite.com'))
{
    echo 'email is valid';
}
else
{
    echo 'email is not valid';
}

send_email('recipient', 'subject', 'message')

使用 PHP 的本地 mail() 函数发送一封 Email。如果需要更强大的 Email 解决方案，请参考 CodeIgniter 的 Email 类。

翻译贡献者: Hex, jzfx
最后修改: 2008-08-27 22:57:49

上一个主题: 下载辅助函数 · 页首 · 用户指南首页 · 下一个主题: 文件辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 文件辅助函数

文件辅助函数

文件辅助函数文件包含若干对文件进行操作的函数。

加载

使用以下代码：

$this->load->helper('file');

加载后可用以下函数：

read_file('path')

返回路径为path的文件内容。例：

$string = read_file('./path/to/file.php');

可以是相对或者绝对的服务器的路径。如果函数执行失败则返回 FALSE(boolean类型)。

提示： 这里的路径是相对于该站点的index.php所在的路径，而不是当前所在的控制器或视图文件的路径。这是因为CodeIgniter使用的前端控制器(front controller)所以，所有的路径永远都是相对于index.php所在路径。

如果你的服务器打开了open_basedir限制，此函数能过以上代码的调用可以无法正常工作。

write_file('path', $data)

写进数据到path所指向文件。如果文件不存在则创建之。例：

$data = 'Some file data';

if ( ! write_file('./path/to/file.php', $data))
{
     echo 'Unable to write the file';
}
else
{
     echo 'File written!';
}

你可以通过可选的第三个参数来设置文件的读写属性：

write_file('./path/to/file.php', $data, 'r+');

默认读写属性是 wb。更多关于文件读写属性参数的内容请参考：PHP user guide。

注意：要使用此函数写进数据，当前用户对此文件应该是“可写”的，如果该文件不存在则该用户应该对包含该文件的目录有写权限。(即*nux系统下的666,777等)。

提示： 这里的路径是相对于该站点的index.php所在的路径，而不是当前所在的控制器或视图文件的路径。这是因为CodeIgniter使用的前端控制器(front controller)所以，所有的路径永远都是相对于index.php所在路径。

delete_files('path')

删除所有包含于path下的文件。例：

delete_files('./path/to/directory/');

如果第二个参数设为 true, 则所有在path下的文件夹也会被删除掉。例：

delete_files('./path/to/directory/', TRUE);

提示： 要被删除的文件必须是当前系统用户所有或者是当前用户对之具有写权限。

get_filenames('path/to/directory/')

获取path/to/directory目录下所有文件名组成的数组。如果需要文件名中有其完整路径则可以设置可选的第二个参数为TRUE。

get_dir_file_info('path/to/directory/')

获取path/to/directory/目录下的所有文件的文件名，文件大小，日期，文件权限等，并将这些内容保存到返回的数组当中。同时，在path/to/directory/目录下的任何子目录的相应内容也被递归的获取到。

get_file_info('path/to/file', $file_information)

通过给定的路径和文件名，获取到文件path/to/file的文件名，文件大小，文件更改日期等。第二个参数允许你说明需要返回的信息，这个参数的选项包括'name', 'server_path', 'size', 'date', 'readable', 'writable', 'executable', 'fileperms'。如果文件不存在则返回FALSE。

注意: 参数 "writable" 是使用PHP内部的 is_writable() 函数来得到文件读写权限信息的，而这个函数在IIS服务器上存在众所周知的问题。为此，可以考虑使用PHP内部的另一个函数来替换,这个函数就是fileperms()。

get_mime_by_extension('file')

将文件后缀所代表的文件类型按照config/mimes.php里所指明的对应类型进行解释。如果不能决定文件类型，或者不能打开mime配置文件则返回 FALSE。

$file = "somefile.png";
echo $file . ' is has a mime type of ' . get_mime_by_extension($file);

注意: 这并不是一个准确判断文件类型的方式，而仅仅是一种方便的判别方式。不应当在涉及安全问题时使用这种方式。

symbolic_permissions($perms)

将数字式的权限表示方式（如fileperms()函数所返回值）转换成采用标准符号的标示方式，例如："33279"转换成"-rwxrwxrwx"）。

echo symbolic_permissions(fileperms('./index.php'));

// -rw-r--r--

octal_permissions($perms)

将数字式的权限表示方式（如fileperms()函数所返回值）转换成采用三字符的八进制的标示方式，例如："33279"转换成"777"）。

echo octal_permissions(fileperms('./index.php'));

// 644

翻译贡献者: Hex, iptton, pipi95, szlinz
最后修改: 2008-12-31 16:05:48

上一个主题: 目录辅助函数 · 页首 · 用户指南首页 · 下一个主题: 表单辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 表单辅助函数

表单辅助函数

表单辅助函数文件包含那些帮助你使用表单的函数。

载入辅助函数

用下面的代码载入该辅助函数：

$this->load->helper('form');

下列函数才可用：

form_open()

创建一个开始form标签，相对于你的配置文档中的基础URL。允许你添加一些form属性和一些隐藏表单。

使用这个函数而不是直接硬编码HTML的主要的优势是使你的程序可以方便的转换，如果你的URL变化的话。

下面是一个例子：

echo form_open('email/send');

上面的例子会创建一个form提交至你的基础URL加上"email/send" URI片段，像这样：

<form method="post" action="http://example.com/index.php/email/send" />

添加一些属性

可以在第二个参数里传递一个关联数组来达到这一目的, 像这样：

$attributes = array('class' => 'email', 'id' => 'myform');

echo form_open('email/send', $attributes);

上面的例子会创建一个这样的form标签：

<form method="post" action="http://example.com/index.php/email/send"  class="email"  id="myform" />

增加隐藏域

隐藏域可以使用数组加在第三个参数上，就像这样:

$hidden = array('username' => 'Joe', 'member_id' => '234');

echo form_open('email/send', '', $hidden);

上面的例子会创建一个这样的form标签和这些隐藏域:

<form method="post" action="http://example.com/index.php/email/send">
<input type="hidden" name="username" value="Joe" />
<input type="hidden" name="member_id" value="234" />

form_open_multipart()

原文：This function is absolutely identical to the form_open() tag above except that it adds a multipart attribute, which is necessary if you would like to use the form to upload files with.

试译文：这个函数除了增加了多属性其余的和上面的form_open()标签一样，当你使用这个表单上传文件时，需要使用到它。

form_hidden()

可以使你创建一个隐藏输入栏。你可以输入name和value来创建一个：

form_hidden('username', 'johndoe');

// 将产生:

<input type="hidden" name="username" value="johndoe" />

或者你也可以使用数组来联合创建它们:

$data = array(
              'name'  => 'John Doe',
              'email' => 'john@example.com',
              'url'   => 'http://example.com'
            );

echo form_hidden($data);

// 将产生:

<input type="hidden" name="name" value="John Doe" />
<input type="hidden" name="email" value="john@example.com" />
<input type="hidden" name="url" value="http://example.com" />

form_input()

可以使你创建一个标准输入栏。你可以在第一和第二个参数里输入name和value来创建一个：

echo form_input('username', 'johndoe');

或者你也可以用关联数组来添加你想加入的内容：

$data = array(
              'name'        => 'username',
              'id'          => 'username',
              'value'       => 'johndoe',
              'maxlength'   => '100',
              'size'        => '50',
              'style'       => 'width:50%',
            );

echo form_input($data);

// 将产生:

<input type="text" name="username" id="username" value="johndoe" maxlength="100" size="50" style="width:50%" />

如果你想加入一些额外的内容，例如Javascript，你可以在第三个参数里输入字符串来创建它：

$js = 'onClick="some_function()"';

echo form_input('username', 'johndoe', $js);

form_password()

此函数除了是设置type为“password”外和上面的 form_input() 函数完全一样。

form_upload()

此函数与上面的 form_input() 函数几乎完全相同，唯一的区别是此函数所设置的 type 为 "file"，用来上传文件。

form_textarea()

此函数与上面的 form_input() 函数几乎完全相同，唯一的区别是此函数所生成的是一个"textarea"。说明：上面的范例中所指定的 "maxlength" 和 "size" 属性在这里变成了 "rows" 和 "cols"。

form_dropdown()

创建一个标准的下拉列表字段。第一个参数是字段名，第二个参数是一个包含各个选项的关联数组，第三个参数是你想要设置为默认被选中的值。第三个参数也可以是一个包含多个项目的数组，CI 将为你创建多选下拉列表。例如：

$options = array(
                  'small'  => 'Small Shirt',
                  'med'    => 'Medium Shirt',
                  'large'   => 'Large Shirt',
                  'xlarge' => 'Extra Large Shirt',
                );

$shirts_on_sale = array('small', 'large');

echo form_dropdown('shirts', $options, 'large');

// 将会生成:

<select name="shirts">
<option value="small">Small Shirt</option>
<option value="med">Medium Shirt</option>
<option value="large" selected="selected">Large Shirt</option>
<option value="xlarge">Extra Large Shirt</option>
</select>

echo form_dropdown('shirts', $options, $shirts_on_sale);

// 将会生成:

<select name="shirts" multiple="multiple">
<option value="small" selected="selected">Small Shirt</option>
<option value="med">Medium Shirt</option>
<option value="large" selected="selected">Large Shirt</option>
<option value="xlarge">Extra Large Shirt</option>
</select>

如果你希望 <select> 开始标签包含一些额外的属性，例如 id 属性以及JavaScript，你可以将一个字符串作为第四个参数传递过去:

$js = 'id="shirts" onChange="some_function();"';

echo form_dropdown('shirts', $options, 'large', $js);

如果$options参数是一个多维数组，form_dropdown() 函数将使用数组的键作为 label值生成一个 <optgroup> 标签。

form_multiselect()

Lets you create a standard multiselect field. The first parameter will contain the name of the field, the second parameter will contain an associative array of options, and the third parameter will contain the value or values you wish to be selected. The parameter usage is identical to using form_dropdown() above, except of course that the name of the field will need to use POST array syntax, e.g. foo[].

form_fieldset()

帮助你生成fieldset/legend标签。

echo form_fieldset('Address Information');
echo "<p>fieldset content here</p>\n";
echo form_fieldset_close();

// 生成
<fieldset>
<legend>Address Information</legend>
<p>form content here</p>
</fieldset>

与其它函数类似，在第二个参数你可以传递一个关联数组来添加你自己想要的自定义的属性。

$attributes = array('id' => 'address_info', 'class' => 'address_info');
echo form_fieldset('Address Information', $attributes);
echo "<p>fieldset content here</p>\n";
echo form_fieldset_close();

// 生成
<fieldset id="address_info" class="address_info">
<legend>Address Information</legend>
<p>form content here</p>
</fieldset>

form_fieldset_close()

生成一个结束的fieldset标签。唯一的优势是，使用该函数，你可以传递数据，这些数据会附加在这个标签的后面。例如：

$string = "</div></div>";

echo fieldset_close($string);

// 会生成：
</fieldset>
</div></div>

form_checkbox()

作用是生成一个复选框。简单范例如下:

echo form_checkbox('newsletter', 'accept', TRUE);

// 将会生成:

<input type="checkbox" name="newsletter" value="accept" checked="checked" />

第三个参数为 TRUE/FALSE 布尔值，决定复选框是否被默认选中。

与其它表单辅助函数相似的是，你可以把包含了属性值的数组作为参数传递给本函数:

$data = array(
    'name'        => 'newsletter',
    'id'          => 'newsletter',
    'value'       => 'accept',
    'checked'     => TRUE,
    'style'       => 'margin:10px',
    );

echo form_checkbox($data);

// 将会生成:

<input type="checkbox" name="newsletter" id="newsletter" value="accept" checked="checked" style="margin:10px" />

与其它函数相似的，如果你希望此标签包含额外的数据，例如JavaScript，你可以将一个字符串作为第四个参数传递过去:

$js = 'onClick="some_function()"';

echo form_checkbox('newsletter', 'accept', TRUE, $js)

form_radio()

此函数与上面的 form_checkbox() 函数几乎完全相同，唯一的区别是此函数生成的是 "radio" 单选框。

form_submit()

帮助你生成一个标准的submit按钮。示例如下：

echo form_submit('mysubmit', 'Submit Post!');

// 会生成：

<input type="submit" name="mysubmit" value="Submit Post!" />

与其它函数类似，第一个参数你可以传递一个关联数组来设置你所需要的属性。第三个参数允许你添加一些额外的内容到生成的HTML代码里。

form_label()

帮助你生成一个label.示例如下：

echo form_label('你的名字是？','username');

// 会生成:
<label for="username">你的名字是？</label>

与其它函数类似，你可以在第三个参数传入一个关联数组来增加一些额外的属性值。

$attributes = array(
'class' => 'mycustomclass',
'style' => 'color: #000;',
);
echo form_label('你的名字是？', 'username', $attributes);

// 会生成:
<label for="username" class="mycustomclass" style="color: #000;">你的名字是？</label>

form_reset()

作用是生成一个标准的 reset 按钮。此函数用法与 form_submit() 完全相同。

form_button()

作用是生成一个标准的按钮。你至少要给出两个参数，它们分别是按钮的名称和内容:

echo form_button('name','content');

// 将会生成
<button name="name" type="button">Content</button> 或者你也可以将一个包含有任何你想要的数据的关联数组作为参数传递过去: $data = array(
    'name' => 'button',
    'id' => 'button',
    'value' => 'true',
    'type' => 'reset',
    'content' => 'Reset'
);

echo form_button($data);

// 将会生成:
<button name="button" id="button" value="true" type="reset">Reset</button> 如果你希望表单包含一些额外的数据，例如JavaScript，你可以将一个字符串作为第三个参数传递过去: $js = 'onClick="some_function()"';

echo form_button('mybutton', 'Click Me', $js);

form_close()

作用是生成一个关闭 </form> 标签。使用此函数的唯一好处是，你可以将这个标签之后要添加的数据也传递过去。例如：

$string = "</div></div>";

echo form_close($string);

// 将会生成:

</form>
</div></div>

form_prep()

允许你放心地在表单元素中使用HTML字符(例如引号)，不必担心破坏表单。考虑一下下面这个范例:

$string = 'Here is a string containing "quoted" text.';

<input type="text" name="myform" value="<var<$string</var<" />

因为上面的字符串中包含了引号，因而导致表单被破坏。form_prep()函数会转换HTML，因此可以放心使用:

<input type="text" name="myform" value="<var<<?php echo form_prep($string); ?></var<" />

说明: 如果你使用的是表单辅助函数中的任何一个，数据都会自动的进行预处理，所以没有必要调用本函数。只有当你手动创建表单元素时，你才需要本函数。

set_value()

允许你设置 input 或者 textarea 字段的值。你必须在第一个参数中指定字段名称。第二个参数是可选的，允许你给字段设置一个默认值。例如:

<input type="text" name="quantity" value="<dfn><?php echo set_value('quantity', '0'); ?></dfn>" size="50" />

当上面的表单元素第一次加载时将会显示"0"。

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>

set_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'); ?> />

翻译贡献者: billycui, Fanbin, Hex, soyota, thankwsx, yinzhili
最后修改: 2009-09-12 14:48:43

上一个主题: 文件辅助函数 · 页首 · 用户指南首页 · 下一个主题: HTML 辅助函数


HTML 辅助函数

CodeIgniter 中国首页 › 用户指南首页 › HTML 辅助函数
搜索用户指南
查看原文

HTML辅助函数

HTML 辅助函数涵盖了一些用于 HTML 操作的函数。

  • br()
  • heading()
  • img()
  • link_tag()
  • nbs()
  • ol() 和 ul()
  • meta()
  • doctype()

装载辅助函数

本辅助函数的装载通过如下代码完成:

$this->load->helper('html');

可用的函数如下：

br()

生成指定个数的换行标签 (<br />) 。例如：

echo br(3);

如上代码将显示： <br /><br /><br />

heading()

帮助你创建 HTML <h1> 标签. 第一个字段用于标记显示内容，第二个字段用于标该标签所用字号。例如：

echo heading('Welcome!', 3);

如上代码将显示： <h3>Welcome!</h3>

img()

帮助你创建 HTML <img /> 标签。 第1个参数包含的是图片文件的路径。 例如:

echo img('images/picture.jpg');
// 生成 <img src="http://site.com/images/picture.jpg" />

第2个参数是可选的， 其值为TRUE或者FALSE， 作用是决定该函数生成的图片地址中是否包含由$config['index_page']所设置的起始页面。 一般来说， 当你使用媒体控制器时才使用这个。

echo img('images/picture.jpg', TRUE);
// 生成 <img src="http://site.com/index.php/images/picture.jpg" />

此外， 关联数组也能够被作为参数传递到 img() 函数中， 用来实现对所有属性和值的完全控制。

$image_properties = array(
          'src' => 'images/picture.jpg',
          'alt' => 'Me, demonstrating how to eat 4 slices of pizza at one time',
          'class' => 'post_images',
          'width' => '200',
          'height' => '200',
          'title' => 'That was quite a night',
          'rel' => 'lightbox',
);

echo img($image_properties);
// <img src="http://site.com/index.php/images/picture.jpg" alt="Me, demonstrating how to eat 4 slices of pizza at one time" class="post_images" width="200" height="200" title="That was quite a night" rel="lightbox" />

link_tag()

帮助你创建 HTML <link /> 标签。在链接样式表以及其他内容时非常有用。参数包括 href 以及可选的 rel, type, title, media 以及 index_page。index_page 是一个TRUE/FALSE 值，作用是决定该函数生成的 href 地址中是否包含由 $config['index_page']所设置的起始页面。 echo link_tag('css/mystyles.css');
// 生成 <link href="http://site.com/css/mystyles.css" rel="stylesheet" type="text/css" />

更多示例:

echo link_tag('favicon.ico', 'shortcut icon', 'image/ico');
// <link href="http://site.com/favicon.ico" rel="shortcut icon" type="image/ico" />

echo link_tag('feed', 'alternate', 'application/rss+xml', 'My RSS Feed');
// <link href="http://site.com/feed" rel="alternate" type="application/rss+xml" title="My RSS Feed" />

此外，关联数组也能够被作为参数传递到 link_tag() 函数中， 用来实现对所有属性和值的完全控制。

$link = array(
          'href' => 'css/printer.css',
          'rel' => 'stylesheet',
          'type' => 'text/css',
          'media' => 'print'
);

echo link_tag($link);
// <link href="http://site.com/css/printer.css" rel="stylesheet" type="text/css" media="print" />

nbs()

生成不换行的指定个数的空格标签(&nbsp;)。例如：

echo nbs(3);

如上代码将显示： &nbsp;&nbsp;&nbsp;

ol() 和 ul()

允许你通过简单或多维的数组生成有序或无序的HTML列表。例如:

$this->load->helper('html');

$list = array(
            'red',
            'blue',
            'green',
            'yellow'
            );

$attributes = array(
                    'class' => 'boldlist',
                    'id'    => 'mylist'
                    );

echo ul($list, $attributes);

如上代码将显示：

<ul class="boldlist" id="mylist">
  <li>red</li>
  <li>blue</li>
  <li>green</li>
  <li>yellow</li>
</ul>

这是一个更复杂的例子，应用了多维数组：

$this->load->helper('html');

$attributes = array(
                    'class' => 'boldlist',
                    'id'    => 'mylist'
                    );

$list = array(
            'colors' => array(
                                'red',
                                'blue',
                                'green'
                            ),
            'shapes' => array(
                                'round',
                                'square',
                                'circles' => array(
                                                    'ellipse',
                                                    'oval',
                                                    'sphere'
                                                    )
                            ),
            'moods'    => array(
                                'happy',
                                'upset' => array(
                                                    'defeated' => array(
                                                                        'dejected',
                                                                        'disheartened',
                                                                        'depressed'
                                                                        ),
                                                    'annoyed',
                                                    'cross',
                                                    'angry'
                                                )
                            )
            );

echo ul($list, $attributes);

如上代码将显示：

<ul class="boldlist" id="mylist">
  <li>colors
    <ul>
      <li>red</li>
      <li>blue</li>
      <li>green</li>
    </ul>
  </li>
  <li>shapes
    <ul>
      <li>round</li>
      <li>suare</li>
      <li>circles
        <ul>
          <li>elipse</li>
          <li>oval</li>
          <li>sphere</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>moods
    <ul>
      <li>happy</li>
      <li>upset
        <ul>
          <li>defeated
            <ul>
              <li>dejected</li>
              <li>disheartened</li>
              <li>depressed</li>
            </ul>
          </li>
          <li>annoyed</li>
          <li>cross</li>
          <li>angry</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

meta()

帮助你创建meta标签. 你可以将字符串、简单数组或者多维数组传递给函数. 例如:

echo meta('description', 'My Great site');
// 生成: <meta name="description" content="My Great Site" />

echo meta('Content-type', 'text/html; charset=utf-8', 'equiv'); // 注意第3个参数.，可以是 "equiv" 或者 "name"
// 生成: <meta http-equiv="Content-type" content="text/html; charset=gb2312" />

echo meta(array('name' => 'robots', 'content' => 'no-cache'));
// 生成: <meta name="robots" content="no-cache" />

$meta = array(
        array('name' => 'robots', 'content' => 'no-cache'),
        array('name' => 'description', 'content' => 'My Great Site'),
        array('name' => 'keywords', 'content' => 'love, passion, intrigue, deception'),
        array('name' => 'robots', 'content' => 'no-cache'),
        array('name' => 'Content-type', 'content' => 'text/html; charset=utf-8', 'type' => 'equiv')
    );

echo meta($meta);
// 生成:
// <meta name="robots" content="no-cache" />
// <meta name="description" content="My Great Site" />
// <meta name="keywords" content="love, passion, intrigue, deception" />
// <meta name="robots" content="no-cache" />
// <meta http-equiv="Content-type" content="text/html; charset=gb2312" />

doctype()

帮助你创建文档类型声明以及DTD。默认值是 XHTML 1.0 Strict ，但你也可以指定其他很多文档类型。

echo doctype();
// <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

echo doctype('html4-trans');
// <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

下面是支持的文档类型列表。它们都是可灵活配置的，可以在 application/config/doctypes.php 中配置。

文档类型 | 选项 | 结果
XHTML 1.1 | doctype('xhtml11') | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
XHTML 1.0 Strict | doctype('xhtml1-strict') | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
XHTML 1.0 Transitional | doctype('xhtml1-trans') | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
XHTML 1.0 Frameset | doctype('xhtml1-frame') | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
HTML 5 | doctype('html5') | <!DOCTYPE html>
HTML 4 Strict | doctype('html4-strict') | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
HTML 4 Transitional | doctype('html4-trans') | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
HTML 4 Frameset | doctype('html4-frame') | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">

翻译贡献者: Hex, szlinz, yinzhili
最后修改: 2009-09-12 14:56:04

上一个主题: 表单辅助函数 · 页首 · 用户指南首页 · 下一个主题: 路径辅助函数


CodeIgniter 中国首页 › 用户指南首页 › Inflector 辅助函数

Inflector 辅助函数

Inflector 辅助函数文件包含允许你把单词更改为复数、单数或骆驼拼写法等形式的函数。

装载辅助函数

使用以下代码装载辅助函数：

$this->load->helper('inflector');

以下函数可用：

singular()

把一个单词的复数形式更改为单数形式。例如：

$word = "dogs";
echo singular($word); // Returns "dog"

plural()

把一个单词的单数形式更改为复数形式。例如：

$word = "dog";
echo plural($word); // Returns "dogs"

强制单词以“es”结尾，则把第二个参数置为“true”。

$word = "pass";
echo plural($word, TRUE); // Returns "passes"

camelize()

把一个以空格或下划线分隔的单词字符串更改为骆驼拼写法。例如：

$word = "my_dog_spot";
echo camelize($word); // Returns "myDogSpot"

underscore()

把以空格分隔的多个单词更改为以下划线分隔。例如：

$word = "my dog spot";
echo underscore($word); // Returns "my_dog_spot"

humanize()

把以下划线分隔的多个单词更改为以空格分隔，并且每个单词以大写开头。例如：

$word = "my_dog_spot";
echo humanize($word); // Returns "My Dog Spot"

翻译贡献者: Hex
最后修改: 2008-06-28 13:38:13

上一个主题: HTML 辅助函数 · 页首 · 用户指南首页 · 下一个主题: 数字辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 语言辅助函数

语言辅助函数

语言辅助函数文件包含一些用于辅助处理语言文件的函数。

加载此辅助函数

此辅助函数使用如下代码加载：

$this->load->helper('language');

下面的函数就可以使用了：

lang('language line', 'element id')

此函数使用简单的语法从已加载的语言文件中返回一行文本。这种语法在视图文件中可能比调用 $this->lang->line() 更表意。可选的第二个参数还将为你输出一个表单Label。例如：

echo lang('language_key', 'form_item_id');
// 变成 <label for="form_item_id">language_key</label>

翻译贡献者: Fanbin, Hex
最后修改: 2009-02-28 14:05:48

上一个主题: 日期辅助函数 · 页首 · 用户指南首页 · 下一个主题: 下载辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 数字辅助函数

数字辅助函数

数字辅助函数可以协助您处理数字资料

载入数字辅助函数

使用如下代码来载入路径辅助函数:

$this->load->helper('number');

可用函数:

byte_format()

将文件大小以字节(bytes)格式化，并添加适合的缩写单位。例如：

echo byte_format(456); // Returns 456.0 Bytes
echo byte_format(4567); // Returns 4.5 KB
echo byte_format(45678); // Returns 44.8 KB
echo byte_format(456789); // Returns 447.8 KB
echo byte_format(3456789); // Returns 3.3 MB
echo byte_format(12345678912345); // Returns 1.8 GB
echo byte_format(123456789123456789); // Returns 11,228.3 TB

提示: 这个函数生成的文本（译注：文本单位）可以在下面的语言文件里找到: language/<your_lang>/number_lang.php

翻译贡献者: Hex, sankai, tonera
最后修改: 2009-09-21 14:54:32

上一个主题: Inflector 辅助函数 · 页首 · 用户指南首页 · 下一个主题: 路径辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 路径辅助函数

路径辅助函数

路径辅助函可以让您使用服务器端的文件路径来工作。

载入辅助函数

使用如下代码来载入路径辅助函数:

$this->load->helper('path');

可用函数:

set_realpath()

检查路径是否有效。此函数会返回一个没有符号连接的服务器路径或相对目录结构，函数中的第二个参数为TRUE时，如果程序无法确定指定的路径，则会触发一个错误。

$directory = '/etc/passwd';
echo set_realpath($directory);
// returns "/etc/passwd"

$non_existent_directory = '/path/to/nowhere';
echo set_realpath($non_existent_directory, TRUE);
// returns an error, as the path could not be resolved

echo set_realpath($non_existent_directory, FALSE);
// returns "/path/to/nowhere"

翻译贡献者: Hex, shishirui
最后修改: 2009-02-21 18:26:01

上一个主题: 数字辅助函数 · 页首 · 用户指南首页 · 下一个主题: 安全辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 安全辅助函数

安全辅助函数

这个安全辅助函数文件包含一系列和安全相关的函数。

加载这个辅助函数

辅助函数可以使用如下代码进行加载:

$this->load->helper('security');

可以使用下面的函数:

xss_clean()

这个函数提供了 XSS 过滤，其实它是输入类的一个别名，关于更多的信息可以到那里去查看。

dohash()

允许你创建SHA1或者MD5加密. 可以参考如下例子:

$str = dohash($str); // SHA1

$str = dohash($str, 'md5'); // MD5

strip_image_tags()

这个函数可以删除图片的一些不必要字符，目的是让图片的url以文本的形式存在,提高了安全性.

$string = strip_image_tags($string);

encode_php_tags()

这个函数可以把PHP脚本标签强制转成实体对象. Note: 如果你使用了XSS过滤函数的话，会自动转换.

$string = encode_php_tags($string);

翻译贡献者: Hex, zhupeng
最后修改: 2008-03-31 13:38:02

上一个主题: 路径辅助函数 · 页首 · 用户指南首页 · 下一个主题: 表情辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 表情辅助函数

表情辅助函数

这个表情文件包含一系列管理表情的函数.

加载表情辅助函数

可以使用下面的代码加载此辅助函数:

$this->load->helper('smiley');

总体来看

这些笑脸表情是用普通的文本来描述的,像 :-) 然后再将他们转换成真正的表情 smile!

这里显示了许多表情图片，当你点击图片的时候，它们就会被插入到一个表单区域中.比如，你有一个允许用户评论并且可以插入表情的的博客，你的访问用户可以点击满意的表情图片，然后在javascript脚本的帮助下插入到相应的表单区域.

可点击的表情

这里有个案例将教给你如何在表单的旁边创建可以点击的各种表情.首先你需要下载并安装表情包,然后再建一个控制器和相应的视图作为描述文件.

重点提示:开始之前,请下载download the smiley images然后把它们放在可以公开访问的服务器上.这个辅助函数采用数组的形式替换各种表情,在目录 application/config/smileys.php中可以查看

控制器

在你的application/controllers/目录中创建一个文件命名为smileys.php 然后加入下面的代码.

重点提示:修改你的表情url在函数get_clickable_smileys()的参数中，url指向你的smiley路径.

可以看到添加表情的时候我们使用的是Table Class.

在你的application/views/文件夹下,创建一个名字为smiley_view.php的文件，然后加入下面的代码:

当你创建完控制器和视图之后，就可以显示你的表情了 http://www.example.com/index.php/smileys/

Field Aliases

When making changes to a view it can be inconvenient to have the field id in the controller. To work around this, you can give your smiley links a generic name that will be tied to a specific id in your view.

$image_array = get_smiley_links("http://example.com/images/smileys/", "comment_textarea_alias");

To map the alias to the field id, pass them both into the smiley_js function:

$image_array = smiley_js("comment_textarea_alias", "comments");

函数参考

get_clickable_smileys()

返回一个已经绑定了可点击表情的数组。你必须提供表情文件夹的 URL，还有表单域的 ID 或者表单域的别名。

$image_array = get_smiley_links("http://example.com/images/smileys/", "comment");

Note: Usage of this function without the second parameter, in combination with js_insert_smiley has been deprecated.

smiley_js()

生成的 JavaScript 可以让图片点击后插入到表单域中。If you supplied an alias instead of an id when generating your smiley links, you need to pass the alias and corresponding form id into the function. This function is designed to be placed into the <head> area of your web page.

<?php echo smiley_js(); ?>

Note: This function replaces js_insert_smiley, which has been deprecated.

parse_smileys()

输入一个文本字符串，用来替换任何已经被包含的空白文本表情，而两者是等效的.第一个参数必须包含你的字符串,第二个参数是你的表情的存放目录:

$str = 'Here are some simileys: :-) ;-)';

$str = parse_smileys($str, "http://example.com/images/smileys/");

echo $str;

翻译贡献者: Hex, icebird, zhupeng
最后修改: 2009-09-12 15:14:10

上一个主题: 安全辅助函数 · 页首 · 用户指南首页 · 下一个主题: 字符串辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 字符串辅助函数

字符串辅助函数

该字符串辅助函数为你提供对字符串类型的各种函数。

装载字符串辅助函数

采用如下方式装载该辅助函数：

$this->load->helper('string');

可用函数如下：

random_string()

根据你所指定的类型和长度产生一个随机字符串。可用于生成密码串或随机字串。

第一个参数指定字符串类型，第二个参数指定其长度。以下为可选字符串类型：

  • alnum: 含有大小写字母以及数字。
  • numeric: 数字字符串。
  • nozero: 不含零的数字字符串。
  • unique: 用 MD5 and uniqid()加密的字符串。注意：第二个长度参数在这种类型无效。均返回一个32位长度的字符串。

范例：

echo random_string('alnum', 16);

alternator()

当执行一个循环时，让两个或两个以上的条目轮换使用。范例：

for ($i = 0; $i < 10; $i++)
{
    echo alternator('string one', 'string two');
}

你可以任意添加条目的数量，每一次循环后下一个条目将成为返回值。

for ($i = 0; $i < 10; $i++)
{
    echo alternator('one', 'two', 'three', 'four', 'five');
}

注意：为了让多次调用该函数简单方便，调用该函数时请不要带上实参进行重预置。

repeater()

重复生成你所提交的数据。范例：

$string = "\n";
echo repeater($string, 30);

上面的例子将会产生30个空行。

reduce_double_slashes()

将字符串中的双斜线(//)转换为单斜线(/)，但不转换形如(http://)的双斜线。范例：

$string = "http://example.com//index.php";
echo reduce_double_slashes($string); // results in "http://example.com/index.php"

trim_slashes()

去掉任何出现在字符串开头或结尾的斜线。范例：

$string = "/this/that/theother/";
echo trim_slashes($string); // results in this/that/theother

reduce_multiples()

去掉多余的一个紧接着一个重复出现的特殊字符。范例：

$string="Fred, Bill,, Joe, Jimmy";
$string=reduce_multiples($string,","); //results in "Fred, Bill, Joe, Jimmy"

该函数可以接受如下的形参: reduce_multiples(string: text to search in, string: character to reduce, boolean: whether to remove the character from the front and end of the string) 第一个形参用于传送你所要去掉重复的字符串。第二个形参用于传送你所要去掉的字符。第三个形参默认为 False。如果为True将会去掉出现在字符串开头或结尾的字符(即使字符不重复也去掉)。范例： $string=",Fred, Bill,, Joe, Jimmy,";
$string=reduce_multiples($string, ", ", TRUE); //results in "Fred, Bill, Joe, Jimmy"

quotes_to_entities()

将字符串中的单引号和双引号转换为相应的 HTML 字符表示。范例：

$string="Joe's \"dinner\"";
$string=quotes_to_entities($string); //results in "Joe&#39;s &quot;dinner&quot;"

strip_quotes()

去掉字符串中的单引号和双引号。范例：

$string="Joe's \"dinner\"";
$string=strip_quotes($string); //results in "Joes dinner"

翻译贡献者: Hex, kkorange
最后修改: 2008-06-28 13:46:03

上一个主题: 表情辅助函数 · 页首 · 用户指南首页 · 下一个主题: 文本辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 文本辅助函数

文本辅助函数

文本辅助函数所包含的函数只能对文本进行处理。

装载文本辅助函数

采用如下方式装载该辅助函数：

$this->load->helper('text');

可用函数如下：

word_limiter()

根据指定的词语(由于是英语，对中文应该是以空格为判断标准，译者注)数目对一段字符串进行截取。范例：

$string = "Here is a nice text string consisting of eleven words.";

$string = word_limiter($string, 4);

// Returns: Here is a nice…

第三个参数是一个可选的符号后缀，默认在截取段后加上省略号(…)。

character_limiter()

根据指定的字符数目对一段字符串进行截取。它将会保证单词的完整性(对英语单词而言，译者注)，因此可能会造成截取后的字符数目与指定的有一点出入。范例：

$string = "Here is a nice text string consisting of eleven words.";

$string = character_limiter($string, 20);

// Returns: Here is a nice text string…

第三个参数是一个可选的符号后缀，默认在截取段后加上省略号(…)。

ascii_to_entities()

将ASCII码转换为字符实体，包括那些在网页中使用时可能导致问题的高位ASCII码和微软Word字符，因此它们能够被正确地显示出来，不受浏览器设置或者数据库可靠存储的影响。本函数部分依赖于你的服务器对字符集的支持，因此并不是在任何情况下都100%的可靠，但在大多数情况下都可以正确地识别正常范围以外的字符(比如重音符号)。例如：

$string = ascii_to_entities($string);

entities_to_ascii()

这个函数与ascii_to_entities()功能相反; 它将字符转变为ASC码.

word_censor()

让你可以对文本中的文字进行审核替换。第一个形参用于获取原始字符串。第二个形参用于存放你不允许的文字的数组。第三个形参(可选)用于存放一个替换不允许文字的字段。如果不指定则被替换为“磅”的表示符号：####。范例：

$disallowed = array('darn', 'shucks', 'golly', 'phooey');

$string = word_censor($string, $disallowed, 'Beep!');

highlight_code()

对一段代码(PHP,HTML等)进行着色。例如：

$string = highlight_code($string);

本函数使用PHP的 highlight_string() 函数，因此所使用的颜色是你在 php.ini 文件中指定的那些。

highlight_phrase()

对字符串内的一个短语进行突出显示。第一个参数是原始字符串，第二个参数是你想要突出显示的短语。如果要用HTML标签对短语进行标记，那么第三个和第四个参数分别是你想要对短语使用的HTML打开和关闭标签。例如:

$string = "Here is a nice text string about nothing in particular.";

$string = highlight_phrase($string, "nice text", '<span style="color:#990000">', '</span>');

以上内容将返回:

Here is a nice text string about nothing in particular.

word_wrap()

根据指定的字符数目对文本进行换行操作，并且保持词语的完整性(对英语单词而言，笔者注)。范例：

$string = "Here is a simple string of text that will help us demonstrate this function.";

echo word_wrap($string, 25);

// Would produce:

Here is a simple string
of text that will help
us demonstrate this
function

翻译贡献者: Hex, kkorange, kntism, yinzhili
最后修改: 2009-08-26 08:49:34

上一个主题: 字符串辅助函数 · 页首 · 用户指南首页 · 下一个主题: 排版辅助函数


CodeIgniter 中国首页 › 用户指南首页 › 排版辅助函数

排版辅助函数

这个排版辅助函数文件里的函数能够让你按照相关词性对文本的格局进行排版。

载入这个辅助函数

请使用如下代码载入这个辅助函数：

$this->load->helper('typography');

以下函数可以使用：

auto_typography()

Formats text so that it is semantically and typographically correct HTML. Please see the Typography Class for more info.

例子:

$string = auto_typography($string);

注意: 排版格式可能会增加处理器的负荷，特别是当你有大量的内容需要被处理时。 如果选择使用这个函数的话，你可能需要考虑缓存你的页面。

nl2br_except_pre()

如果换行不在标记符 <pre> 里的话，都会被转换成 <br /> 标记符。这个函数除了会忽略标记符<pre> 以外，和PHP自带函数nl2br()是相等的。

例子:

$string = nl2br_except_pre($string);

翻译贡献者: aykirk, Hex
最后修改: 2009-02-22 01:13:44

上一个主题: 文本辅助函数 · 页首 · 用户指南首页 · 下一个主题: URL 辅助函数


CodeIgniter 中国首页 › 用户指南首页 › URL 辅助函数

URL 辅助函数

URL 辅助函数文件包含一些在处理 URL 中很有用的函数

加载辅助函数

本辅助函数通过如下代码加载:

$this->load->helper('url');

可用函数如下:

site_url()

以一个字符串的形式返回在 config.php 中指定的 base_url 和 index.php (或者在 config.php 中设定的 index_page) 还有传递给函数的的 URI 段参数.

在生成 URL 的任何时候鼓都励您使用该函数, 即便以后 base_url 和 index_page 改动也会不会出问题.

做为参数传递给该函数的 URI 段可以是一个字符串，也可以是一个数组. 下面是一个字符串的例子:

echo site_url("news/local/123");

上面的例子将返回: http://example.com/index.php/news/local/123

这是一个以数组形式传递 URI 段的例子:

$segments = array('news', 'local', '123');

echo site_url($segments);

base_url()

返回在 config.php 中设定的 base_url. 例:

echo base_url();

current_url()

返回当前正在查看的页面的完整URL(包括段)。

uri_string()

返回任何包含了此函数的页面的URI段。比如说，要是你的URL是这样的:

http://some-site.com/blog/comments/123

此函数将会返回:

/blog/comments/123

index_page()

返回在 config.php 中设定的 index_page. 例:

echo index_page();

anchor()

创建基于你的本地站点URL(如 www.your-site.com )的标准锚链接:

Click Here

它有三个可选参数:

anchor(uri segments, text, attributes)

第一个参数包含你想附加到URL的任何段.像上面的site_url() 函数一样,段可以是字符串或数组.

注意: 如果你创建在应用程序内部的链接没有包含基本URL(http://...),这个参数会从你配置文件信息中自动加载.包括只是你希望附加到URL的URI段.

第二个参数是你想给链接的名字.如果让它为空,将会由URL(替代).

第三个参数包含一组你想附加给链接的属性.这些属性可以是简单的字符串或相关的数组.

这里有一些例子:

echo anchor('news/local/123', 'title="My News"');

输出(链接名字'My News'): My News

echo anchor('news/local/123', 'My News', array('title' => 'The best news!'));

输出(鼠标放在上面会有'The best news!'提示): My News

anchor_popup()

几乎和anchor() 函数相同,区别是它会在新窗口打开链接. 你可以在第三个参数中指定JavaScript窗口属性来控制窗口的打开方式. 如果第三个参数没有设置,它会直接根据你的浏览器设置打开新窗口.这是一个属性设置的例子:

$atts = array(
              'width'      => '800',
              'height'     => '600',
              'scrollbars' => 'yes',
              'status'     => 'yes',
              'resizable'  => 'yes',
              'screenx'    => '0',
              'screeny'    => '0'
            );

echo anchor_popup('news/local/123', 'Click Me!', $atts);

注意: 以上是函数默认设置,你只要根据自己需要设置不同.如果你想函数使用默认设置,直接传一个空数组给第三个参数就行了:

echo anchor_popup('news/local/123', 'Click Me!', array());

mailto()

创建标准HTML电子邮件链接.习惯用例:

echo mailto('me@my-site.com', 'Click Here to Contact Me');

像上面的anchor() 一样, 你可以用第三个参数设置属性.

safe_mailto()

用法和上面的函数相同,区别是它用JavaScript写了基于顺序号码的不易识别的mailto版本标签,可以阻止email地址被垃圾邮件截获.

auto_link()

自动把包含URL和email地址的字串转换成链接. 例如:

$string = auto_link($string);

第二个参数决定URL和email是否都转换或其中一个转换.如果参数没有指定默认是两个都转换.Email links are encoded as safe_mailto() as shown above.

只转换URL:

$string = auto_link($string, 'url');

只转换Email地址:

$string = auto_link($string, 'email');

第三个参数决定链接是否都在新窗口打开.参数值可以是TRUE 或 FALSE(boolean):

$string = auto_link($string, 'both', TRUE);

url_title()

输入一个字符串并且创建用户友好的URL字串.举个例子,你有一个blog,而且你想在URL中使用条目的标题,这个函数就有用了.例如:

$title = "What's wrong with CSS?";

$url_title = url_title($title);

// 输出: Whats-wrong-with-CSS

第二个参数指定单词之间的分隔符. 默认使用破折号'-'. 选项有: 破折号'-', 或者 下划线'_':

$title = "What's wrong with CSS?";

$url_title = url_title($title, 'underscore');

// 输出: Whats_wrong_with_CSS

第3个参数决定了是否强制转换为小写.默认情况下不会.参数类型为布尔值 TRUE/FALSE:

$title = "What's wrong with CSS?";

$url_title = url_title($title, 'underscore', TRUE);

// Produces: whats_wrong_with_css

prep_url()

在URL中没有http://的情况下,这个函数可以附加上.像这样把URL字串传递给函数:

$url = "example.com";

$url = prep_url($url);

redirect()

执行一个指定的利用header头文件实现跳转本地网址URL的操作。和该类辅助函数的其他函数一样，它用于重定向到你网站的一个网址URL。你不能指定一个全局网址URL，而只能指向你所需的一个控制器(controller)。该函数将自动根据你的设置文件(config file)来帮你构建全局网址URL。

你可以设定第二个参数为 location 操作(默认)或者 refresh 操作。定位操作比刷新操作执行速度快，但是在Windows服务器上它将有时被认为是一个错误操作。可选的第3个参数允许你发送一个特定的HTTP请求返回码 - 举例来说这可以用来创建303请求重定向来服务于搜索引擎. 默认的请求返回码是302. 第3个参数只使用与'location'重定向, 而不是用于'refresh'. 范例:

if ($logged_in == FALSE)
{
     redirect('/login/form/', 'refresh');
}

// with 301 redirect
redirect('/article/13', 'location', 301);

注意：由于此函数需要处理header头文件，因此它的使用必须在任何输出给浏览器的内容前。
注意: For very fine grained control over headers, you should use the Output Library's set_header() function.

翻译贡献者: Hex, kkorange, mynameisjian, nardo, yeto, yinzhili
最后修改: 2009-09-12 15:18:04

上一个主题: 排版辅助函数 · 页首 · 用户指南首页 · 下一个主题: XML 辅助函数


CodeIgniter 中国首页 › 用户指南首页 › XML 辅助函数

XML 辅助函数

xml助手函数文件包含了一些辅助处理xml数据的函数

加载该辅助函数

本辅助函数通过如下代码加载:

$this->load->helper('xml');

可用函数如下:

xml_convert('string')

以一个字符串(string)作为输入并且转换下列xml保留字符成为实体(entities):

Ampersands: &
Less then and greater than characters: < >
Single and double quotes: ' "
Dashes: -

该函数将忽略 & 如果他们是存在的字符实体的一部分。例如:

$string = xml_convert($string);

翻译贡献者: fdasf, Hex, weide, zhupeng
最后修改: 2009-02-21 23:03:45

上一个主题: URL 辅助函数 · 页首 · 用户指南首页


CodeIgniter 中国首页 › 用户指南首页 › 基准测试类

基准测试类

CodeIgniter 有一个总是有效的基准测试类,能够用来计算两个标记点的时间差.

注意:这个类会被系统自动初始化,因此不需要手动初始化.

另外,基准测试类在框架被调用的时候开始,在最终视图被output类送给浏览器之前结束,可以显示整个系统执行的精确定时.

目录

  • 使用测试基准类
  • 自定义你的测试基准类
  • 显示总的执行时间
  • 显示内存消耗

使用基准测试类

测试基准类可以在 控制器, 视图,或者 模型.中使用,用法如下:

  1. 标记一个开始点
  2. 标记一个结束点
  3. 运行elapsed_time函数显示结果

下面是一个代码示例:

$this->benchmark->mark('code_start');

// Some code happens here

$this->benchmark->mark('code_end');

echo $this->benchmark->elapsed_time('code_start', 'code_end');

注意：单词“code_start”和“code_end”是任意的，他们是简单的单词用来做为两个标记。你可以使用你想用的任意单词，并且你可以设置多个标记，参考下面的这些代码：

$this->benchmark->mark('dog');

// Some code happens here

$this->benchmark->mark('cat');

// More code happens here

$this->benchmark->mark('bird');

echo $this->benchmark->elapsed_time('dog', 'cat');
echo $this->benchmark->elapsed_time('cat', 'bird');
echo $this->benchmark->elapsed_time('dog', 'bird');

自定义你的基准测试类

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

$this->benchmark->mark('my_mark_start');

// Some code happens here...

$this->benchmark->mark('my_mark_end');

$this->benchmark->mark('another_mark_start');

// Some more code happens here...

$this->benchmark->mark('another_mark_end');

更多信息请参考 Profiler page .

显示总的执行时间

如果你想显示从CodeIgniter启动到浏览器最终输出的时间消耗,简单把这段代码放到你的一个视图模板中:

<?php echo $this->benchmark->elapsed_time();?>

你会注意到这个函数和上面例子中计算两个标记点时间差的函数是同一个, 不同的是这里你没有使用参数.当参数为空的时候,CodeIgniter一直会到最终页面被送往浏览器之前才停止benchmark .它不管你是在哪里调用的,计时器会持续到最终结束.

如果不喜欢使用纯PHP,另外一种备用的来显示时间消耗的方式是在视图文件中使用这个伪变量:

{elapsed_time}

注意:如果你想在你的控制器函数中benchmark(基准测试)一些东西, 你必须设置你自己的开始/结束点.

显示内存消耗

如果你的PHP在安装的时候被配置成--enable-memory-limit,你可以将下面的代码包含到视图文件中显示整个系统的内存使用量:

<?php echo $this->benchmark->memory_usage();?>

注意:这个函数只能在视图文件中使用.这个消耗量就是应用程序的全部内存消耗.

如果不喜欢使用纯PHP,另外一种备用的来显示内存使用量的方式是在视图文件中使用这个伪变量:

{memory_usage}

翻译贡献者: Hex, Roger_masslong
最后修改: 2008-06-29 02:14:21

上一个主题: 安全 · 页首 · 用户指南首页 · 下一个主题: 日历类


CodeIgniter 中国首页 › 用户指南首页 › 日历类

日历类

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

初始化类

和大多数其他CI中的类一样,在控制器中初始化日历类用$this->load->library函数:

$this->load->library('calendar');

导入之后,日历类可以这样使用: $this->calendar

显示一个日历

这是一个简单的例子告诉你如何去显示一个日历:

$this->load->library('calendar');

echo $this->calendar->generate();

上面的代码将根据你服务器时间创建一个当前月/年的日历. 要显示一个指定月和年的日历，你要传递这些信息到日历生成函数:

$this->load->library('calendar');

echo $this->calendar->generate(2006, 6);

上面的代码将创建一个显示2006年6月的日历.第一个参数指定了年，第二个参数指定了月.

传数据到单元格

增加数据到日历的单元格就要创建一个关联数组,在这个数组中索引是你想链接的天数value值包含你要传入的值.数组通过日历创建函数的第三个参数被传入. 参考下面这个例子:

$this->load->library('calendar');

$data = array(
               3  => 'http://example.com/news/article/2006/03/',
               7  => 'http://example.com/news/article/2006/07/',
               13 => 'http://example.com/news/article/2006/13/',
               26 => 'http://example.com/news/article/2006/26/'
             );

echo $this->calendar->generate(2006, 6, $data);

使用上面的例子，天数3,7,13和26将变成链接指向你提供的URLs.

注意: 默认情况,系统假定你的数组中已经包含了链接. 在下面解释日历模板部分你会看到你可以自定义数据如何被传入日历单元格以便你可以传不同类型的信息.

设置偏好

有 7 种偏好可以让你设置日历的各个方面. 偏好被设置成数组通过导入函数的第二个参数被导入. 下面是一个例子:

$prefs = array (
               'start_day'    => 'saturday',
               'month_type'   => 'long',
               'day_type'     => 'short'
             );

$this->load->library('calendar', $prefs);

echo $this->calendar->generate();

上面的代码将从礼拜六开始,用"长"月标题和"短"天数格式.更多关于偏好的信息请看下面.

Preference | Default Value | Options | Description
template | None | None | 模板字符串. See the template section below.
local_time | time() | None | A Unix timestamp corresponding to the current time.
start_day | sunday | 一周内的任一天（sunday,monday,ect.） | 指定每周的第一天
month_type | long | long, short | 月份的显示样式.long = January, short = Jan.
day_type | abr | long, short, abr | 星期的显示样式long = Sunday, short = Sun, abr = Su.
show_next_prev | FALSE | TRUE/FALSE (boolean) | 是否显示“上个月”和“下个月”链接.
next_prev_url | None | A URL | “上个月”和“下个月”链接地址.

显示下一月/上一月链接

要让你的日历通过下一月/上一月链接动态的减少/增加,可以仿照下面的例子建立你的日历:

$prefs = array (
               'show_next_prev'  => TRUE,
               'next_prev_url'   => 'http://example.com/index.php/calendar/show/'
             );

$this->load->library('calendar', $prefs);

echo $this->calendar->generate($this->uri->segment(3), $this->uri->segment(4));

在上面的例子中，你会注意到这几点:

  • 你必须把"show_next_prev"设置成TRUE.
  • 你必须在"next_prev_url"偏好中向日历提供 URL.
  • 你必须向日历创建函数提供"年"和"月"通过他们应该出现的URI段 (注意: 日历类自动添加年/月到你提供的base URL上.).

创建一个日历模板

通过创建一个日历模板你能够100%的控制界面设计. 日历的每一部分都要被放在一对伪变量中,像下面这样:

$prefs['template'] = '

   {table_open}<table border="0" cellpadding="0" cellspacing="0">{/table_open}

   {heading_row_start}<tr>{/heading_row_start}

   {heading_previous_cell}<th><a href="{previous_url}">&lt;&lt;</a></th>{/heading_previous_cell}
   {heading_title_cell}<th colspan="{colspan}">{heading}</th>{/heading_title_cell}
   {heading_next_cell}<th><a href="{next_url}">&gt;&gt;</a></th>{/heading_next_cell}

   {heading_row_end}</tr>{/heading_row_end}

   {week_row_start}<tr>{/week_row_start}
   {week_day_cell}<td>{week_day}</td>{/week_day_cell}
   {week_row_end}</tr>{/week_row_end}

   {cal_row_start}<tr>{/cal_row_start}
   {cal_cell_start}<td>{/cal_cell_start}

   {cal_cell_content}<a href="{content}">{day}</a>{/cal_cell_content}
   {cal_cell_content_today}<div class="highlight"><a href="{content}">{day}</a></div>{/cal_cell_content_today}

   {cal_cell_no_content}{day}{/cal_cell_no_content}
   {cal_cell_no_content_today}<div class="highlight">{day}</div>{/cal_cell_no_content_today}

   {cal_cell_blank}&nbsp;{/cal_cell_blank}

   {cal_cell_end}</td>{/cal_cell_end}
   {cal_row_end}</tr>{/cal_row_end}

   {table_close}</table>{/table_close}
';

$this->load->library('calendar', $prefs);

echo $this->calendar->generate();

翻译贡献者: airwin, Hex, huanxiangwu, kissmumu, Roger_masslong
最后修改: 2009-09-12 15:25:03

上一个主题: 基准测试类 · 页首 · 用户指南首页 · 下一个主题: 购物车类


CodeIgniter 中国首页 › 用户指南首页 › 购物车类

购物车类

购物车类允许项目被添加到session中，session在用户浏览你的网站期间都保持有效状态。这些项目能够以标准的 "购物车" 格式被检索和显示，并允许用户更新数量或者从购物车中移除项目。

请注意购物车类只提供核心的"购物车"功能。它不提供配送、信用卡授权或者其它处理组件。

初始化购物车类

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

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

$this->load->library('cart');

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

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

将一个项目添加到购物车

要添加项目到购物车，只需将一个包含了商品信息的数组传递给 $this->cart->insert() 函数即可，就像下面这样：

$data = array(
               'id'      => 'sku_123ABC',
               'qty'     => 1,
               'price'   => 39.95,
               'name'    => 'T-Shirt',
               'options' => array('Size' => 'L', 'Color' => 'Red')
            );

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

重要说明: 上面的前四个数组索引 (id, qty, price 和name) 是 必需的。 如果缺少其中的任何一个，数据将不会被保存到购物车中。第5个索引 (options) 是可选的。当你的商品包含一些相关的选项信息时，你就可以使用它。正如上面所显示的那样，请使用一个数组来保存选项信息。

五个保留的索引分别是:

  • id - 你的商店里的每件商品都必须有一个唯一的标识符(identifier)。典型的标识符是 "sku"(译者注：库存量单位) 或者其它类似的标识符。
  • qty - 购买的数量(quantity)。
  • price - 商品的价格(price)。
  • name - 商品的名称(name)。
  • options - 标识商品的任何附加属性。必须通过数组来传递。

除以上五个索引外，还有两个保留字：rowid 和 subtotal。它们是购物车类内部使用的，因此，往购物车中插入数据时，请不要使用这些词作为索引。

你的数组可能包含附加的数据。你的数组中包含的所有数据都会被存储到session中。然而，最好的方式是标准化你所有商品的数据，这样更方便你在表格中显示它们。

将多个项目添加到购物车

通过下面这种多维数组的方式，可以一次性添加多个产品到购物车中。当你希望允许用户选择同一页面中的多个项目时，这就非常有用了。

$data = array(
               array(
                       'id'      => 'sku_123ABC',
                       'qty'     => 1,
                       'price'   => 39.95,
                       'name'    => 'T-Shirt',
                       'options' => array('Size' => 'L', 'Color' => 'Red')
                    ),
               array(
                       'id'      => 'sku_567ZYX',
                       'qty'     => 1,
                       'price'   => 9.95,
                       'name'    => 'Coffee Mug'
                    ),
               array(
                       'id'      => 'sku_965QRS',
                       'qty'     => 1,
                       'price'   => 29.95,
                       'name'    => 'Shot Glass'
                    )
            );

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

显示购物车

为了显示购物车的数据，你得创建一个 视图文件，它的代码类似于下面这个。

请注意这个范例使用了表单辅助函数.

更新购物车

为了更新购物车中的信息，你必须将一个包含了 Row ID 和数量(quantity)的数组传递给 $this->cart->update() 函数:

说明: 如果数量被设置为 0 ，那么购物车中对应的项目会被移除。

$data = array(
               'rowid' => 'b99ccdf16028f015540f341130b6d8ec',
               'qty'   => 3
            );

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

// 或者是一个多维数组

$data = array(
               array(
                       'rowid'   => 'b99ccdf16028f015540f341130b6d8ec',
                       'qty'     => 3
                    ),
               array(
                       'rowid'   => 'xw82g9q3r495893iajdh473990rikw23',
                       'qty'     => 4
                    ),
               array(
                       'rowid'   => 'fh4kdkkkaoe30njgoe92rkdkkobec333',
                       'qty'     => 2
                    )
            );

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

什么是 Row ID? 当一个项目被添加到购物车时，程序所生成的那个唯一的标识符就是row ID。创建唯一ID的理由是，当购物车中相同的商品有不同的选项时，购物车就能够对它们进行管理。

比如说，有人购买了两件相同的T-shirt (相同的商品ID)，但是尺寸不同。商品ID(以及其它属性)都会完全一样，因为它们是相同的T-shirt。它们唯一的差别就是尺寸不同。因此购物车必须想办法来区分它们，这样才能独立地管理这两件尺寸不同的T-shirt。而基于商品ID和其它相关选项信息来创建一个唯一的 "row ID" 就能解决这个问题。

在几乎所有情况下，更新购物车都将是用户通过 "查看购物车" 页面来实现的，因此对开发者来说，不必太担心"row ID"，只要保证你的 "查看购物车" 页面中的一个隐藏表单字段包含了这个信息，并且确保它能被传递给表单提交时所调用的更新函数就行了。请仔细分析上面的 "查看购物车" 页面的结构以获取更多信息。

函数参考

$this->cart->insert();

允许你将项目添加到购物车中，就像上面所描述的那样。

$this->cart->update();

允许你更新购物车中的项目，就像上面所描述的那样。

$this->cart->total();

显示购物车中的总计金额。

$this->cart->total_items();

显示购物车中总共的项目数量。

$this->cart->contents();

返回一个包含了购物车中所有信息的数组。

$this->cart->has_options(rowid);

如果购物车中特定的列包含选项信息，本函数会返回 TRUE(布尔值)。本函数被设计为与 $this->cart->contents() 一起在循环中使用，因此就像上面的 显示购物车 范例所显示的那样，你必须把 rowid 传递给这个函数。

$this->cart->options(rowid);

以数组的形式返回特定商品的选项信息。本函数被设计为与 $this->cart->contents() 一起在循环中使用，因此就像上面的 显示购物车 范例所显示的那样，你必须把 rowid 传递给这个函数。

$this->cart->destroy();

允许你销毁购物车。这个函数一般是在你处理完用户订单后调用。

翻译贡献者: Hex, yinzhili
最后修改: 2009-09-13 12:56:42

上一个主题: 日历类 · 页首 · 用户指南首页 · 下一个主题: 配置类


CodeIgniter 中国首页 › 用户指南首页 › 配置类

配置类

该配置类提供一种方法来进行偏好设置。该偏好来源于默认的配置文件(application/config/config.php) 或您自己定制的配置文件。

注意：该类已经自动加载而无需手动启用。

分析配置文件

默认情况下，CodeIgniter已经有一个主要的配置文件，位于application/config/config.php。如果你用文本编辑器打开你会看到配置项目被存储在一个叫$config的数组里。

您可以添加您自己的配置项目到这个文件里，或者您更愿意让您自己的配置项目与原配置项目分开（assuming you even need config items），简单的创建一个文件并保存到config这个文件夹里就行了。

提示: 如果你想建立一个和主要配置文件一样格式的配置文件，把你的配置项目建立在一个名为$config的数组中,即使配置文件中有相同的数组名，CodeIgniter也能智能的管理这些文件而不会发生冲突.

加载配置文件

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

有两种方法来加载配置文件:

  1. 手动加载

    为了加载一个你自定义的配置文件，你需要在 controller 中这样做:

    $this->config->load('filename');

    这里的 filename 是你自定义的配置文件的文件名，这个文件名没有 .php 的扩展名.

    如果你需要加载多个自定义配置文件，一般情况下它们会被合并成一个数组。然而，如果在不同的配置文件中存在同名的索引，那么会发生冲突。为了避免这个问题，你可以把第二个参数设置为 TRUE ，这可以使每个配置文件的内容存储在一个单独的数组中，数组的索引就是配置文件的文件名。请看下面的例子:

    // 用这样的方式保存为一个数组: $this->config['blog_settings'] = $config
    $this->config->load('blog_settings', TRUE);

    请阅读下面名为 获取配置元素 的部分以了解在这样的方式下如何取得配置信息

    第三个参数允许屏蔽当配置文件不存在时产生的错误信息:

    $this->config->load('blog_settings', FALSE, TRUE);
  2. 自动加载

    如果你需要一个特定配置文件在全局范围内都能使用，你可以使系统自动加载它。要自动加载配置，请打开文件 autoload.php，它在 application/config/autoload.php，然后按照文件中的提示增加你想要自动加载的配置文件。

获取配置元素

从配置文件中检索元素，使用下面的函数:

$this->config->item('item name');

其中 item name 是 $config 数组中你期望检索的索引. 例如，要获得您选择的语言，你可以这样做:

$lang = $this->config->item('language');

当试图获取的元素不存在时，此函数返回 FALSE (boolean) 。

如果你为了用具体的索引来声明配置数组(避免上述索引重名问题)而在函数 $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'];

设置一项元素

如果你想动态设置/改变一个现有的配置元素，你可以使用:

$this->config->set_item('item_name', 'item_value');

其中 item_name 是你希望改变的 $config 数组的索引, item_value 是改变后的值.

辅助函数

config 类有以下辅助函数:

$this->config->site_url();

该函数得到你网站的 URL，其中包含了你在 config 文件中设置的 "index" 的值。

$this->config->system_url();

该函数得到 system folder 的URL .

翻译贡献者: airwin, aykirk, borisauschina, Hex, skey, szlinz, tanqimin, zhupeng
最后修改: 2009-09-20 00:56:54

上一个主题: 日历类 · 页首 · 用户指南首页 · 下一个主题: 数据库类


CodeIgniter 中国首页 › 用户指南首页 › Email 类

Email 类

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

  • Multiple Protocols: Mail, Sendmail, and SMTP(支持多种协议)
  • Multiple recipients(多个邮件接收人)
  • CC and BCCs
  • HTML or Plaintext email(HTML邮件和Plaintext明码文本 明码文本也叫做明码报文，是普通的，未被加密成密文或经过解密所得的且直接可读的文本。)
  • Attachments(支持发送附件)
  • Word wrapping
  • Priorities(支持邮件优先级)
  • BCC Batch Mode, enabling large email lists to be broken into small BCC batches.
  • Email Debugging tools

发送邮件

发送邮件不仅简单，而且可以发送时进行配置或者将参数放到配置文件中。

这里是一个发送邮件的标准示例。注意：该示例是假定使用一个控制器来发送邮件。

$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();

设置 Email 参数

有17个不同的有效参数来提供给你如何定制你发送的电子邮件。您可以在此手动设置，或自动通过你储存在的配置文件中的来设置，描述如下：

参数设定通过一系列的参数值去完成电子邮件的initialize功能。这里有一个例子，说明怎样设置一些参数设定：

$config['protocol'] = 'sendmail';
$config['mailpath'] = '/usr/sbin/sendmail';
$config['charset'] = 'iso-8859-1';
$config['wordwrap'] = TRUE;

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

说明: 大多数参数都有默认值，如果你没有配置这些参数，它们的默认值就会被使用。

在配置文件中设置 Email 参数

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

Email 参数

下面是发送电子邮件时可以设置的属性的列表。

参数 | 默认值 | 选项 | 描述
useragent | CodeIgniter | 无 | 用户代理 "user agent"。
protocol | mail | mail, sendmail, or smtp | 邮件发送协议。
mailpath | /usr/sbin/sendmail | 无 | 服务器上 Sendmail 的实际路径。
smtp_host | 无默认值 | 无 | SMTP 服务器地址。
smtp_user | 无默认值 | 无 | SMTP 用户账号。
smtp_pass | 无默认值 | 无 | SMTP 密码。
smtp_port | 25 | 无 | SMTP 端口。
smtp_timeout | 5 | 无 | SMTP 超时设置(单位：秒)。
wordwrap | TRUE | TRUE 或 FALSE (布尔值) | 开启自动换行。
wrapchars | 76 |  | 自动换行时每行的最大字符数。
mailtype | text | text 或 html | 邮件类型。发送 HTML 邮件比如是完整的网页。请确认网页中是否有相对路径的链接和图片地址，它们在邮件中不能正确显示。
charset | utf-8 |  | 字符集(utf-8, iso-8859-1 等)。
validate | FALSE | TRUE 或 FALSE (布尔值) | 是否验证邮件地址。
priority | 3 | 1, 2, 3, 4, 5 | Email 优先级. 1 = 最高. 5 = 最低. 3 = 正常.
crlf | \n | "\r\n" or "\n" or "\r" | 换行符. (使用 "\r\n" to 以遵守RFC 822).
newline | \n | "\r\n" or "\n" or "\r" | 换行符. (使用 "\r\n" to 以遵守RFC 822).
bcc_batch_mode | FALSE | TRUE or FALSE (boolean) | 启用批量暗送模式.
bcc_batch_size | 200 | None | 批量暗送的邮件数.

Email 函数参考

$this->email->from()

设置发件人email地址和名称:

$this->email->from('you@example.com', 'Your Name');

$this->email->reply_to()

设置邮件回复地址. 如果没有提供这个信息，将会使用"from()"函数中的值. 例如:

$this->email->reply_to('you@example.com', 'Your Name');

$this->email->to()

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

$this->email->to('someone@example.com'); $this->email->to('one@example.com, two@example.com, three@example.com'); $list = array('one@example.com', 'two@example.com', 'three@example.com');

$this->email->to($list);

$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->set_alt_message()

设置可选的邮件EMAIL正文部分:

$this->email->set_alt_message('This is the alternative message');

这是EMAIL可选的一部分，如果你发送带HTML的邮件，这可以用到。它用于当接收邮件都不支持HTML格式时显示给用户的内容。如果你没有设置这部分，CodeIginiter会自动从邮件正文中提取去掉TAGS的部分。

$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。就可以将它用于判断语句:

if ( ! $this->email->send())
{
    // Generate error
}

$this->email->attach()

添加附件。第一个参数是文件路径/文件名. 注意: 用路径而不是URL。多次使用该函数可以添加多个附件:

$this->email->attach('/path/to/photo1.jpg');
$this->email->attach('/path/to/photo2.jpg');
$this->email->attach('/path/to/photo3.jpg');

$this->email->send();

$this->email->print_debugger()

返回包含邮件内容的字符串，包括EMAIL头和EMAIL正文。用于调试。

取消自动换行

如果你启用自动换行(建议遵循 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}中间

翻译贡献者: 498621, Hex, imjie, kele_87, larryli, roln, xjflyttp, xluohome, yinzhili, yygcom
最后修改: 2009-07-12 10:10:08

上一个主题: 数据库类 · 页首 · 用户指南首页 · 下一个主题: 加密类


CodeIgniter 中国首页 › 用户指南首页 › 加密类

加密类

这个加密类提供了两种数据加密的方法。首先它使用一些随机的无顺序的逐位异或（XOR）直接交换数值的编码方案预先编译一些信息，然后再将它们放在隐蔽的类似 Mcrypt 的地方。如果这个 Mcrypt 不可用，会给您的服务器编码消息“轻巧”的加密，将会提供合理安全程度。如果这个 Mcrypt 是可以使用的，最终你可以获得一个被双重加密的字符串，这样加密的话，会使你的信息非常安全。

设置你的密钥

密钥实际上是一些会控制密码加密过程并且允许被加密的字串被解码的信息片段。实际上，你选择的密钥会提供一个唯一的方法来解密一些被加密的数据，所以你需要非常谨慎的设置你的密钥，如果你想给一些固定的数据加密的话，你最好不要更改这个密钥。

很自然，你需要非常小心的保守你的密钥。如果某人对您的密钥能够存取，那么数据将会很容易地被解码。如果您的服务器不完全在的您的控制之下而想保证数据安全是不可能的，因此您可以在使用它之前仔细地想一下要求高安全存放信用卡数字对象的方法。

为了发挥加密算法的最大优势，你的解密密钥需要被设置为 32 个字符长度（128 位）。你可以设置一个编造的随机字符串作为你的密钥，最好包括数字、大写字母、小写字母。你的密钥不能设置为一个简单的文本字符串。为了被安全可靠的加密，它也有一个随机的可能性。

你的密钥可以放在 application/config/config.php 文件中，你也可以自己设置一个存储机制用于数据的加密和解密。

为了在 application/config/config.php 文件中保存你的密钥，打开文件设置一下：

$config['encryption_key'] = "YOUR KEY";

消息长度

知道加密信息的长度会是原来函数长度的 2.6 倍是很重要的。如果你加密这个字符串“my super secret data”，它的长度是 21 个字符，所以你加密后的字符串的长度大概是 55 个字符（我们说它是粗糙的，因为编码的字符串长度增量 64 位并非是线性增长的），当你选择你的数据存储机制的时候一定要记住这一点。例如，Cookie 可以占用 4k 的数据空间。

初始化类

在 Codeigniter 中，像大多数其他的类一样，加密类也需要在你的控制器函数中用 $this->load->library 函数加载：

$this->load->library('encrypt');

一旦被加载，加密类库就可以这样使用：$this->encrypt

$this->encrypt->encode()

执行数据加密并返回一个字符串。例如：

$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);

$this->encrypt->decode()

解密一个已加密的字符串。例如：

$encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';

$plaintext_string = $this->encrypt->decode($encrypted_string);

$this->encrypt->set_cipher();

允许你设置一个 Mcrypt 算法。默认使用 MCRYPT_RIJNDAEL_256。例如：

$this->encrypt->set_cipher(MCRYPT_BLOWFISH);

请访问 php.net 看一下可用的算法。

如果你想手动测试一下你的服务器是否支持 Mcrypt，你可以使用：

echo ( ! function_exists('mcrypt_encrypt')) ? 'Nope' : 'Yup';

$this->encrypt->set_mode();

允许你设置一个 Mcrypt 模式。默认使用 MCRYPT_MODE_ECB。例如：

$this->encrypt->set_mode(MCRYPT_MODE_CFB);

请访问 php.net 看一下可用的模式。

$this->encrypt->sha1();

SHA1 编码函数。提供一个字符串，然后它返回一个 160 位的 Hash 信息。说明：SHA1，就像 MD5 一样不可解密。例如：

$hash = $this->encrypt->sha1('Some string');

许多 PHP 安装程序默认都支持 SHA1，所以你可以很简单的使用它的原始函数进行加密：

$hash = sha1('Some string');

如果你的服务器不支持 SHA1，你可以使用别人提供的函数。

翻译贡献者: Hex, zhupeng
最后修改: 2008-06-29 03:00:10

上一个主题: Email 类 · 页首 · 用户指南首页 · 下一个主题: 文件上传类


CodeIgniter 中国首页 › 用户指南首页 › 文件上传类

文件上传类

CodeIgniter 的文件上传类允许文件被上传。您可以设置指定上传某类型的文件及指定大小的文件。

处理过程

上传文件普遍的过程：

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

这里有一个简短的教程来显示这个过程。此后你将会找到相关的参考信息。

创建上传表单

运用文本编辑器创建一个名为upload_form.php的文件，复制以下代码并保存在applications/views/目录里：

你会看到这里运用到了一个表单辅助函数来创建表单的开始标签，文件上传需要一个 multipart form，因为这个表单辅助函数为你创建了一个合适的语句。你还会看到我们运用了一个$error变量，当用户提交该表单出现错误时会显示相关的出错信息。

上传成功的页面

运用文本编辑器创建一个名为upload_success.php的文件。复制以下代码保存到applications/views/目录里：

控制器

运用文本编辑器，创建一个名为upload.php的控制器.复制以下代码并保存到applications/controllers/目录里：

上传文件目录

你还需要一个目标文件夹来存储上传的图片。在根目录上创建一个名为uploads的文件并设置该文件的属性为 777。（即可读写）

提交表单

要提交你的表单，输入类似如下的URL：

example.com/index.php/upload/

你将看到一个上传表单，任选一张(jpg, gif,或者png)图片进行提交. 如果你在控制器里设置的路径是正确的，它将开始工作。

参考指南

初始化文件上传类

与CodeIgniter的其它一些类相似，文件上传类用$this->load->library函数在控制器里进行初始化:

$this->load->library('upload');

一旦文件上传类被加载，对象将通过如下方法来引用：$this->upload

偏好设置

与其它库类似，你将根据你的偏好设置来控制要被上传的文件，在控制器里，你建立了如下的偏好设置：

$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '100';
$config['max_width'] = '1024';
$config['max_height'] = '768';

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

// Alternately you can set preferences by calling the initialize function. Useful if you auto-load the class:
$this->upload->initialize($config);

以上偏好设置将被完全执行。以下是所有偏好设置参数的描述。

偏好设置参数

以下偏好设置参数是可用的。当你没有特别指定偏好设置参数时，默认值如下：

偏好设置 | 默认值 | 选项 | 描述
upload_path | None | None | 文件上传路径。该路径必须是可写的，相对路径和绝对路径均可以。
allowed_types | None | None | 允许上传文件的MIME类型；通常文件扩展名可以做为MIME类型. 允许多个类型用竖线‘|’分开
file_name | None | 想要使用的文件名 | 如果设置了这个参数，CodeIgniter 将根据这里设置的文件名来对上传的文件进行重命名。 说明: 这里所设置的文件名当中不要包含扩展名。
overwrite | FALSE | TRUE/FALSE (boolean) | 是否覆盖。该参数为TRUE时，如果上传文件时碰到重名文件，将会把原文件覆盖；如果该参数为FALSE，CI将会在新文件的文件名后面加一个数字。If set to true, if a file with the same name as the one you are uploading exists, it will be overwritten. If set to false, a number will be appended to the filename if another with the same name exists.
max_size | 0 | None | 允许上传文件大小的最大值（以K为单位）。该参数为0则不限制。注意：通常PHP也有这项限制，可以在php.ini文件中指定。通常默认为2MB。
max_width | 0 | None | 上传文件的宽度最大值（像素为单位）。0为不限制。
max_height | 0 | None | 上传文件的高度最大值（像素为单位）。0为不限制。
max_filename | 0 | None | 文件名的最大长度。0为不限制。
encrypt_name | FALSE | TRUE/FALSE (boolean) | 是否重命名文件。如果该参数为TRUE，上传的文件将被重命名为随机的加密字符串。当你想让文件上传者也不能区分自己上传的文件的文件名时，是非常有用的。当 overwrite 为 FALSE 时，此选项才起作用。
remove_spaces | TRUE | TRUE/FALSE (boolean) | 参数为TRUE时，文件名中的空格将被替换为下划线。推荐使用。

在配置文件里设置偏好设置参数

如果你不愿意应用如上方法进行偏好设置，你可能用一个配置文件来取代它。简单创建一个名为upload.php的文件,添加 $config数组到该文件里，然后保存文件到：config/upload.php，它将被自动加载。当你把配置参数保存到该文件里，你不需要用$this->upload->initialize函数进行手动加载。

运用到的函数

以下函数被运用

$this->upload->do_upload()

根据你的偏好配置参数执行操作。注意：默认情况下上传的文件来自于提交表单里名为userfile的文件域,并且该表单必须是 "multipart"类型：

<form method="post" action="some_action" enctype="multipart/form-data" />

如果你想在执行do_upload函数之前自定义自己的文件域名称，可通过以下方法实现：

$field_name = "some_field_name";
$this->upload->do_upload($field_name)

$this->upload->display_errors()

如果do_upload()返回失败，显示错误信息。此函数不会自动输出，而是返回数据，所以你可以按你的要求安排。

格式化错误

上面的函数默认使用<p>标记错误信息。你可以像这样设置自己的分隔符。

$this->upload->display_errors('<p>', '</p>');

$this->upload->data()

这是一个辅助函数，它返回你上传文件的所有相关信息的数组。

Array
(
    [file_name]    => mypic.jpg
    [file_type]    => image/jpeg
    [file_path]    => /path/to/your/upload/
    [full_path]    => /path/to/your/upload/jpg.jpg
    [raw_name]     => mypic
    [orig_name]    => mypic.jpg
    [file_ext]     => .jpg
    [file_size]    => 22.2
    [is_image]     => 1
    [image_width]  => 800
    [image_height] => 600
    [image_type]   => jpeg
    [image_size_str] => width="800" height="200"
)

解释

这里是对上面数组项的解释。

Item | Description
file_name | 已上传的文件名（包括扩展名）
file_type | 文件的Mime类型
file_path | 不包括文件名的文件绝对路径
full_path | 包括文件名在内的文件绝对路径
raw_name | 不包括扩展名在内的文件名部分
orig_name | 上传的文件最初的文件名。这只有在设置上传文件重命名时才有效。
file_ext | 文件扩展名（包括‘.’）
file_size | 图像大小，单位是kb
is_image | 是否是图像。 1 =是图像。 0 = 不是图像。
image_width | 图像宽度.
image_heigth | 图像高度
image_type | 文件类型，即文件扩展名（不包括‘.’）
image_size_str | 一个包含width和height的字符串。用于放在一个img标签里。

翻译贡献者: helingjun2008, Hex, lishen2, roln, szlinz, thankwsx, wangyueqiang, yinzhili
最后修改: 2009-09-13 13:58:52

上一个主题: 加密类 · 页首 · 用户指南首页 · 下一个主题: 表单验证类


CodeIgniter 中国首页 › 用户指南首页 › 表单验证

表单验证

CodeIgniter 提供了一个全面的表单验证和数据预处理类以帮助缩减你所写的代码。

注意: CodeIgniter 1.7.0 开始，表单验证类取代了旧的不再建议使用的验证类。我们在类库中留下了旧的类以确保当前的应用不会出现问题，但我们推荐你迁移到新的版本。

  • 概述
  • 表单验证指南
    • 表单
    • 成功页面
    • 控制器
    • 设置验证规则
    • 使用一个数组设置验证规则
    • 级联规则（Cascading Rules）
    • 预处理数据（Prepping Data）
    • 重新填充表单（Re-populating the Form）
    • 回调
    • 设置错误信息
    • 更改错误定界符
    • 翻译表单域名字
    • 独立显示错误
    • 将一系列验证规则保存到一个配置文件
    • 使用数组作为表单域名字
  • 规则参考
  • 预处理参考
  • 函数参考
  • 辅助函数参考

概述

在解释 CodeIgniter 的数据验证处理之前，让我们先描述一下一般的情况：

  1. 一个表单显示了。
  2. 你填写并提交了它。
  3. 如果你提交了一些无效的信息，或者可能漏掉了一个必填项，表单将会连同你的数据和错误问题的描述信息重新显示。
  4. 这个过程将继续，只到你提交了一个有效的表单。

在接收端，脚本必须：

  1. 检查必须的数据。
  2. 验证数据是否为正确的类型，合适的标准。例如，如果一个用户名被提交，它必须被验证是否只包含了允许的字符。它必须有一个最小长度，不能超过最大长度。用户名不能是已存在的他人用户名，或者甚至是一个保留字等。
  3. 清理数据使其安全。
  4. 如果需要，预格式化数据（数据需要清楚空白吗？经过 HTML 编码？等。）
  5. 准备数据，插入数据库。

尽管上面的过程并不是很复杂，但是通常需要编写很多代码，而且为了显示错误信息，在网页中经常要使用多种不同的控制结构。创建表单验证虽简单，实施起来却也枯燥无味。

表单验证指南

下面是如何实施CodeIgniter表单验证的一个简易教程

为了进行表单验证，你需要这三样东西：

  1. 一个包含表单的 视图 文件。
  2. 一个包含“成功”信息的视图文件，在成功提交后将被显示。
  3. 一个接收并处理所提交数据的 控制器 函数。

让我们以一个会员注册表单为例来创建这三个玩意。

表单

使用一个文本编辑器，创建一个名叫 myform.php 的表单。在它里面放上这些代码并把它保存到你的 applications/views/ 文件夹中:

成功页面

使用一个文本编辑器，创建一个名叫 formsuccess.php 的表单。在它里面放上这些代码并保存到你的 applications/views/ 文件夹:

控制器

使用一个文本编辑器，创建一个名叫 form.php 的控制器。在它里面，放上这些代码并保存到你的 applications/controllers/ 文件夹:

Try it!

要测试你的表单，请使用类似这样的URL访问你的网站：

example.com/index.php/form/

如果你提交表单你只会看到表单重新加载了。这是因为你还没有设置验证规则。

由于你还没有告诉表单验证类验证什么东西。它只是默认的返回了 FALSE (boolean false) 。 run() 方法只在全部成功匹配了你的规则才会返回 TRUE 。

解析

你会注意到在此页上面的几点：

表单 (myform.php) 是一个标准的Web表单，除了一下两点：

  1. 它使用一个 表单辅助函数 创建表单开始。 技术上，这并非必要。你可以使用标准的HTMl来创建，然而，使用辅助函数的好处是它为你生成了基于你配置文件中的URL的 action URL。这是的你的应用在更改URL时更具移植性。
  2. 在表单的顶端你将注意到如下函数调用： <?php echo validation_errors(); ?>

    这个函数将会返回验证器送回的所有错误信息。如果没有错误信息，它将返回空字符串。

控制器 (form.php) 有一个方法: index()。这个方法初始化验证类并加载你试图中用到的 表单辅助函数 和URL 辅助函数 它也会 运行 验证程序。基于验证是否成功，它会重现表单或显示成功页面。

设置验证规则

CodeIgniter允许你为单个表单域创建多个验证规则，按顺序层叠在一起，你甚至可以同时预先处理表单域数据。要设置验证规则请使用set_rules() 函数:

$this->form_validation->set_rules();

上面的函数使用 三个 参数作为输入:

  1. 表单域的名字 - 就是你给表单域取的那个名字。
  2. 一个此表单域的 "人性化" 名字，它将被插入到错误信息中。例如，如果你有一个表单域叫做“user”你可能给它一个人性化名字叫做“用户名”。 注意: 如果你想让表单域的名字保存在一个语言文件里，请参考 翻译表单域名字.
  3. 为此表单域设置的验证规则。

这儿有一个示例。在你的 控制器 (form.php) 中紧接着验证初始化函数之后，添加这段代码：

$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');

你的控制器现在看起来像这样：

现在留空表单域提交表单你会看到错误信息。 如果你填充所有的表单域提交表单你会看到成功页。

注意: 出现错误时表单域并没有被使用数据重新填充。稍后我们去搞这个。

使用一个数组设置验证规则

继续之前请注意，如果你更喜欢通过一个操作设置所有规则的话，向规则设定函数传递的可以是一个数组。 如果你想用这个方式，你必须这样命名你的数组键:

$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);

级联规则（Cascading Rules）

CodeIgniter 允许你将多个规则连接在一起。让我们试一试。修改规则设置函数中的第三个参数，像这样：

$this->form_validation->set_rules('username', 'Username', 'required|min_length[5]|max_length[12]');
$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');

上面的代码设置了一下规则:

  1. 用户名表单域长度不得小于5个字符以及大于12个字符。
  2. 密码表单域必须跟密码确认表单域的数据一致。
  3. 电子邮件表单域必须是一个有效邮件地址。

马上试试看！提交不合法的数据后你会看到新的错误信息跟你设置的新规则相符。在验证参考页中你可以阅读到更多规则。

预处理数据

作为上面使用的验证函数的附加，你也可以以多种方式预处理你的数据。 例如，你可以设置像这样的规则：

$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');

在上面的例子里，我们“修整（trimming，去掉字符串两端空白）”了数据，转换密码为MD5，将用户名通过“xss_clean”函数处理去掉了有害数据。

任何PHP自身接收一个参数的函数都可以被用作一个规则，比如 htmlspecialchars, trim, MD5, 等。

注意: 你一般会在验证规则之后使用这些预处理功能，这样如果发生错误，原数据将会被显示在表单。

重新填充表单（Re-populating the form）

目前为止我们只处理了错误。是使用提交的数据重填表单的时候了。CodeIgniter 为此提供了几个辅助函数。你最常用到的一个是：

set_value('field name')

打开 myform.php 视图文件并使用 set_value() 函数更新每个表单域的 值 ：

不要忘记在set_value()函数中包含每个表单域的名字！

现在刷新你的页面并提交表单产生一个错误。你的表单域应该被重新填写了。

注意: 下面的 函数参考 节包含了可以让你重填下拉菜单，单选框和复选框的函数

重要提示: 如果你使用一个数组作为一个表单域的名字，你必须为函数提供给它一个数组。例如：

<input type="text" name="colors[]" value="<?php echo set_value('colors[]'); ?>" size="50" />

更多信息请参考下面的 使用数组作为表单域名字 一节。

回调: 你自己的验证函数

验证系统提供了向你自己验证函数的回调。这是你可以扩展验证类以适应你的需求。例如，如果你需要执行一个数据库查询来检查用户是否选择了一个唯一的用户名，你可以创建一个回调函数做这个。咱们建个例子。

在你的控制器中，修改“username”为：

$this->form_validation->set_rules('username', 'Username', 'callback_username_check');

然后在你的控制器中添加一个新的函数名叫 username_check 。你的控制器现在看起来是这样：

重新载入表单并以“test”作为用户名提交数据，你会看到表单域数据传递到回调函数中供你处理。

要调用一个回调函数只需把函数名加一个"callback_"前缀并放在验证规则里。

你也可以处理并返回传递给你的回调函数中的表单数据。如果你的回调函数返回了除布尔型的TRUE/FALSE外的任何值，它将被假定数据是你新处理过的表单数据。

设置错误信息

所有自身的错误信息位于下面的语言文件中：language/english/form_validation_lang.php

要设置你的自定义信息你可以编辑那个文件，或使用下面的函数：

$this->form_validation->set_message('rule', 'Error Message');

Where rule corresponds to the name of a particular rule, and Error Message is the text you would like displayed.

If you include %s in your error string, it will be replaced with the "human" name you used for your field when you set your rules.

In the "callback" example above, the error message was set by passing the name of the function:

$this->form_validation->set_message('username_check')

You can also override any error message found in the language file. For example, to change the message for the "required" rule you will do this:

$this->form_validation->set_message('required', 'Your custom message here');

Translating Field Names

If you would like to store the "human" name you passed to the set_rules() function in a language file, and therefore make the name able to be translated, here's how:

First, prefix your "human" name with lang:, as in this example:

$this->form_validation->set_rules('first_name', 'lang:first_name', 'required');

Then, store the name in one of your language file arrays (without the prefix):

$lang['first_name'] = 'First Name';

Note: If you store your array item in a language file that is not loaded automatically by CI, you'll need to remember to load it in your controller using:

$this->lang->load('file_name');

See the Language Class page for more info regarding language files.

Changing the Error Delimiters

By default, the Form Validation class adds a paragraph tag (<p>) around each error message shown. You can either change these delimiters globally or individually.

  1. Changing delimiters Globally

    To globally change the error delimiters, in your controller function, just after loading the Form Validation class, add this:

    $this->form_validation->set_error_delimiters('<div class="error">', '</div>');

    In this example, we've switched to using div tags.

  2. Changing delimiters Individually

    Each of the two error generating functions shown in this tutorial can be supplied their own delimiters as follows:

    <?php echo form_error('field name', '<div class="error">', '</div>'); ?>

    Or:

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

独立显示错误

如果你喜欢紧挨着每个表单域显示错误信息而不是显示为一个列表，你可以使用 form_error() 函数。

Try it! Change your form so that it looks like this:

If there are no errors, nothing will be shown. If there is an error, the message will appear.

Important Note: If you use an array as the name of a form field, you must supply it as an array to the function. Example:

<?php echo form_error('options[size]'); ?>
<input type="text" name="options[size]" value="<?php echo set_value("options[size]"); ?>" size="50" />

For more info please see the Using Arrays as Field Names section below.

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

表单验证类的一个超拽的特性是它允许你将整个应用的所有验证规则存储到一个配置文件中。你可以组织这些规则到“组”里。这些组既可以在符合controller/function的调用时自动加载，也可以在用到时你手动调用。

怎样保存你的规则

To store your validation rules, simply create a file named form_validation.php in your application/config/ folder. In that file you will place an array named $config with your rules. As shown earlier, the validation array will have this prototype:

$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'
                  )
            );

Your validation rule file will be loaded automatically and used when you call the run() function.

Please note that you MUST name your array $config.

Creating Sets of Rules

In order to organize your rules into "sets" requires that you place them into "sub arrays". Consider the following example, showing two sets of rules. We've arbitrarily called these two rules "signup" and "email". You can name your rules anything you want:

$config = array(
                 'signup' => array(
                                    array(
                                            'field' => 'username',
                                            'label' => 'Username',
                                            'rules' => 'required'
                                         ),
                                    array(
                                            'field' => 'password',
                                            'label' => 'Password',
                                            'rules' => 'required'
                                         ),
                                    array(
                                            'field' => 'passconf',
                                            'label' => 'PasswordConfirmation',
                                            'rules' => 'required'
                                         ),
                                    array(
                                            'field' => 'email',
                                            'label' => 'Email',
                                            'rules' => 'required'
                                         )
                                    ),
                 'email' => array(
                                    array(
                                            'field' => 'emailaddress',
                                            'label' => 'EmailAddress',
                                            'rules' => 'required|valid_email'
                                         ),
                                    array(
                                            'field' => 'name',
                                            'label' => 'Name',
                                            'rules' => 'required|alpha'
                                         ),
                                    array(
                                            'field' => 'title',
                                            'label' => 'Title',
                                            'rules' => 'required'
                                         ),
                                    array(
                                            'field' => 'message',
                                            'label' => 'MessageBody',
                                            'rules' => 'required'
                                         )
                                    )
               );

Calling a Specific Rule Group

In order to call a specific group you will pass its name to the run() function. For example, to call the signup rule you will do this:

if ($this->form_validation->run('signup') == FALSE)
{
   $this->load->view('myform');
}
else
{
   $this->load->view('formsuccess');
}

Associating a Controller Function with a Rule Group

An alternate (and more automatic) method of calling a rule group is to name it according to the controller class/function you intend to use it with. For example, let's say you have a controller named Member and a function named signup. Here's what your class might look like:

<?php

class Member extends Controller {

   function signup()
   {
      $this->load->library('form_validation');

      if ($this->form_validation->run() == FALSE)
      {
         $this->load->view('myform');
      }
      else
      {
         $this->load->view('formsuccess');
      }
   }
}
?>

In your validation config file, you will name your rule group member/signup:

$config = array(
           'member/signup' => array(
                                    array(
                                            'field' => 'username',
                                            'label' => 'Username',
                                            'rules' => 'required'
                                         ),
                                    array(
                                            'field' => 'password',
                                            'label' => 'Password',
                                            'rules' => 'required'
                                         ),
                                    array(
                                            'field' => 'passconf',
                                            'label' => 'PasswordConfirmation',
                                            'rules' => 'required'
                                         ),
                                    array(
                                            'field' => 'email',
                                            'label' => 'Email',
                                            'rules' => 'required'
                                         )
                                    )
               );

When a rule group is named identically to a controller class/function it will be used automatically when the run() function is invoked from that class/function.

Using Arrays as Field Names

The Form Validation class supports the use of arrays as field names. Consider this example:

<input type="text" name="options[]" value="" size="50" />

If you do use an array as a field name, you must use the EXACT array name in the Helper Functions that require the field name, and as your Validation Rule field name.

For example, to set a rule for the above field you would use:

$this->form_validation->set_rules('options[]', 'Options', 'required');

Or, to show an error for the above field you would use:

<?php echo form_error('options[]'); ?>

Or to re-populate the field you would use:

<input type="text" name="options[]" value="<?php echo set_value('options[]'); ?>" size="50" />

You can use multidimensional arrays as field names as well. For example:

<input type="text" name="options[size]" value="" size="50" />

Or even:

<input type="text" name="sports[nba][basketball]" value="" size="50" />

As with our first example, you must use the exact array name in the helper functions:

<?php echo form_error('sports[nba][basketball]'); ?>

If you are using checkboxes (or other fields) that have multiple options, don't forget to leave an empty bracket after each option, so that all selections will be added to the POST array:

<input type="checkbox" name="options[]" value="red" />
<input type="checkbox" name="options[]" value="blue" />
<input type="checkbox" name="options[]" value="green" />

Or if you use a multidimensional array:

<input type="checkbox" name="options[color][]" value="red" />
<input type="checkbox" name="options[color][]" value="blue" />
<input type="checkbox" name="options[color][]" value="green" />

When you use a helper function you'll include the bracket as well:

<?php echo form_error('options[color][]'); ?>

规则参数列表

The following is a list of all the native rules that are available to use:

以下列表将列出可被使用的原生规则

规则 | 参数 | 描述 | 举例
required | No | 如果元素为空，返回FALSE Returns FALSE if the form element is empty. |
matches | Yes | 如果表单元素不匹配参数定义，返回FALSE Returns FALSE if the form element does not match the one in the parameter. | matches[form_item]
min_length | Yes | 如果表单元素少于参数定义，返回FALSE Returns FALSE if the form element is shorter then the parameter value. | min_length[6]
max_length | Yes | 如果表单元素大于参数定义，返回FALSE Returns FALSE if the form element is longer then the parameter value. | max_length[12]
exact_length | Yes | 如果表单元素不是正确的参数值，返回FALSE Returns FALSE if the form element is not exactly the parameter value. | exact_length[8]
alpha | No | 如果表单元素包含任何其他字母形式以外字符，返回FALSE Returns FALSE if the form element contains anything other than alphabetical characters. |
alpha_numeric | No | 如果表单元素包含任何其他文字数字式以外字符，返回FALSE Returns FALSE if the form element contains anything other than alpha-numeric characters. |
alpha_dash | No | 如果表单元素包含任何其他文字数字式字符、下划线、破折号以外字符，返回FALSE Returns FALSE if the form element contains anything other than alpha-numeric characters, underscores or dashes. |
numeric | No | 如果表单元素包含任何其他数字式以外字符，返回 FALSE Returns FALSE if the form element contains anything other than numeric characters. |
integer | No | Returns FALSE if the form element contains anything other than an integer. |
is_natural | No | Returns FALSE if the form element contains anything other than a natural number: 0, 1, 2, 3, etc. |
is_natural_no_zero | No | Returns FALSE if the form element contains anything other than a natural number, but not zero: 1, 2, 3, etc. |
valid_email | No | Returns FALSE if the form element does not contain a valid email address. |
valid_emails | No | Returns FALSE if any value provided in a comma separated list is not a valid email. |
valid_ip | No | Returns FALSE if the supplied IP is not valid. |
valid_base64 | No | Returns FALSE if the supplied string contains anything other than valid Base64 characters. |

Note: These rules can also be called as discrete functions. For example:

$this->form_validation->required($string);

Note: You can also use any native PHP functions that permit one parameter.

Prepping Reference

The following is a list of all the prepping functions that are available to use:

Name | Parameter | Description
xss_clean | No | Runs the data through the XSS filtering function, described in the Input Class page.
prep_for_form | No | Converts special characters so that HTML data can be shown in a form field without breaking it.
prep_url | No | Adds "http://" to URLs if missing.
strip_image_tags | No | Strips the HTML from image tags leaving the raw URL.
encode_php_tags | No | Converts PHP tags to entities.

Note: You can also use any native PHP functions that permit one parameter, like trim, htmlspecialchars, urldecode, etc.

Function Reference

The following functions are intended for use in your controller functions.

$this->form_validation->set_rules();

Permits you to set validation rules, as described in the tutorial sections above:

  • Setting Validation Rules
  • Saving Groups of Validation Rules to a Config File

$this->form_validation->run();

Runs the validation routines. Returns boolean TRUE on success and FALSE on failure. You can optionally pass the name of the validation group via the function, as described in: Saving Groups of Validation Rules to a Config File.

$this->form_validation->set_message();

Permits you to set custom error messages. See Setting Error Messages above.

Helper Reference

The following helper functions are available for use in the view files containing your forms. Note that these are procedural functions, so they do not require you to prepend them with $this->form_validation.

form_error()

Shows an individual error message associated with the field name supplied to the function. Example:

<?php echo form_error('username'); ?>

The error delimiters can be optionally specified. See the Changing the Error Delimiters section above.

validation_errors()

Shows all error messages as a string: Example:

<?php echo validation_errors(); ?>

The error delimiters can be optionally specified. See the Changing the Error Delimiters section above.

set_value()

Permits you to set the value of an input form or textarea. You must supply the field name via the first parameter of the function. The second (optional) parameter allows you to set a default value for the form. Example:

<input type="text" name="quantity" value="<dfn><?php echo set_value('quantity', '0'); ?></dfn>" size="50" />

The above form will show "0" when loaded for the first time.

set_select()

If you use a <select> menu, this function permits you to display the menu item that was selected. The first parameter must contain the name of the select menu, the second parameter must contain the value of each item, and the third (optional) parameter lets you set an item as the default (use boolean TRUE/FALSE).

Example:

<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>

set_checkbox()

Permits you to display a checkbox in the state it was submitted. The first parameter must contain the name of the checkbox, the second parameter must contain its value, and the third (optional) parameter lets you set an item as the default (use boolean TRUE/FALSE). Example:

<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()

Permits you to display radio buttons in the state they were submitted. This function is identical to the set_checkbox() function above.

<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'); ?> />

翻译贡献者: dimitry, Fanbin, Hex, soyota, xgdd1987, yuwen002
最后修改: 2009-09-21 09:36:15

上一个主题: 文件上传类 · 页首 · 用户指南首页 · 下一个主题: FTP 类


CodeIgniter 中国首页 › 用户指南首页 › FTP 类

FTP 类

CodeIgniter的FTP类允许你将本地文件传输到远程服务器上，同时可以移动、重命名和删除远程服务器上的文件。这个FTP类所包含的一个"mirroring"函数允许你通过FTP在远程服务器上创建一个本地文件夹的镜像。

注意: 不支持 SFTP 和 SSL FTP 协议, 仅支持标准 FTP 协议.

初始化类

像大多数其他CodeIgniter 类一样，FTP 类在控制器里使用$this->load->library 函数来初始化:

$this->load->library('ftp');

一旦加载， FTP对象就可以使用： $this->ftp

使用例子

在这个例子中，首先建立一个到FTP服务器的连接，接着读取一个本地文件然后以ASCII模式上传。文件的权限被设置为755。注意：设置权限需要PHP 5。

$this->load->library('ftp');

$config['hostname'] = 'ftp.example.com';
$config['username'] = 'your-username';
$config['password'] = 'your-password';
$config['debug'] = TRUE;

$this->ftp->connect($config);

$this->ftp->upload('/local/path/to/myfile.html', '/public_html/myfile.html', 'ascii', 0775);

$this->ftp->close();

下面的例子从FTP服务器上获得了文件列表

$this->load->library('ftp');

$config['hostname'] = 'ftp.example.com';
$config['username'] = 'your-username';
$config['password'] = 'your-password';
$config['debug'] = TRUE;

$this->ftp->connect($config);

$list = $this->ftp->list_files('/public_html/');

print_r($list);

$this->ftp->close();

下面的例子在FTP服务器上创建了一个本地文件夹的镜像。

$this->load->library('ftp');

$config['hostname'] = 'ftp.example.com';
$config['username'] = 'your-username';
$config['password'] = 'your-password';
$config['debug'] = TRUE;

$this->ftp->connect($config);

$this->ftp->mirror('/path/to/myfolder/', '/public_html/myfolder/');

$this->ftp->close();

函数参考

$this->ftp->connect()

连接并登录到FTP服务器，通过向函数传递一个数组来设置连接参数，或者你可以把这些参数保存在一个配置文件中。

下面例子演示了如何手动设置参数:

$this->load->library('ftp');

$config['hostname'] = 'ftp.example.com';
$config['username'] = 'your-username';
$config['password'] = 'your-password';
$config['port']     = 21;
$config['passive']  = FALSE;
$config['debug']    = TRUE;

$this->ftp->connect($config);

在配置文件中设置参数

如果你更倾向把FTP参数设置保存在一个配置文件中，只需创建一个名为ftp.php的文件, 把 $config 数组添加到该文件中，然后保存成config/ftp.php 它就会自动被读取。

可用连接选项:

  • hostname - FTP主机名。 通常看起来是这样的: ftp.example.com
  • username - FTP用户名。
  • password - FTP密码。
  • port - 端口号。 默认设置为21
  • debug - TRUE/FALSE (布尔值). 是否开启调试显示错误信息。
  • passive - TRUE/FALSE (布尔值). 是否使用被动模式，默认设置为被动模式。

$this->ftp->upload()

将一个文件上传到你的服务器上。本地路径和远程路径这两个参数是必需的，而传输模式和权限设置这两个参数则是可选的。例如:

$this->ftp->upload('/local/path/to/myfile.html', '/public_html/myfile.html', 'ascii', 0775);

传输模式包括: ascii, binary, 以及 auto (默认值)。如果使用了auto模式，将根据源文件的扩展名来自动选择传输模式。

权限设置仅在PHP5下有效，你可以将一个octal (八进制)的权限值通过第四个参数传递过去。

$this->ftp->rename()

作用是给一个文件重命名。请给出原文件名/路径和新的文件名/路径。

// 将文件 green.html 重命名为 blue.html
$this->ftp->rename('/public_html/foo/green.html', '/public_html/foo/blue.html');

$this->ftp->move()

作用是移动一个文件。请给出源路径和目标路径:

// 将文件 blog.html 从 "joe" 移动到 "fred"
$this->ftp->move('/public_html/joe/blog.html', '/public_html/fred/blog.html');

说明: 如果源文件名与目标文件名不同，文件将会被重命名。

$this->ftp->delete_file()

作用是删除一个文件。请给出源文件名和所在路径。

$this->ftp->delete_file('/public_html/joe/blog.html');

$this->ftp->delete_dir()

作用是删除一个目录以及此目录下的全部内容。请给出原目录的路径，并以斜线结束。

重要提示 请 非常谨慎 地使用这个函数。它将删除你给出的目录下的 所有内容，也就是说此目录下的所有子目录以及所有文件都会被删除。请确保你给出的路径是绝对正确的。可以先试着使用 list_files() 函数来验证你的路径是否正确。

$this->ftp->delete_dir('/public_html/path/to/folder/');

$this->ftp->list_files()

允许你检索你服务器上所有文件的列表，以数组的形式返回检索结果。你必须给出要检索的路径。

$list = $this->ftp->list_files('/public_html/');

print_r($list);

$this->ftp->mirror()

检索一个本地目录下的所有内容(包括子目录和所有文件)，并通过FTP为这个目录创建一份镜像。源路径下的任何结构都会被创建到服务器上。你必须给出源路径和目标路径:

$this->ftp->mirror('/path/to/myfolder/', '/public_html/myfolder/');

$this->ftp->mkdir()

允许你在服务器上创建一个目录。请给出你想要创建的目录的完整路径，截止到你要创建的目录名，并在末尾添加斜线结束。如果你在使用PHP5，你还可以在第二个参数中传递一个八进制的权限值。

// 创建一个名为"bar"的目录
$this->ftp->mkdir('/public_html/foo/bar/', DIR_WRITE_MODE);

$this->ftp->chmod()

允许你设置文件权限。请给出你要设置的文件或者目录所在的路径:

// 将 "bar" 的权限设置为 777
$this->ftp->chmod('/public_html/foo/bar/', DIR_WRITE_MODE);

$this->ftp->close();

关闭到服务器的连接。当你上传完毕时，建议使用这个函数关闭连接。

翻译贡献者: dimitry, Hex, tg8866, yinzhili, yygcom
最后修改: 2009-07-12 10:49:11

上一个主题: 表单验证类 · 页首 · 用户指南首页 · 下一个主题: HTML 表格类


CodeIgniter 中国首页 › 用户指南首页 › 图像处理类

图像处理类

CodeIgniter 的图像处理类可以使你完成以下的操作：

  • 调整图像大小
  • 创建缩略图
  • 图像裁剪
  • 图像旋转
  • 添加图像水印

可以很好的支持三个主流的图像库：GD/GD2, NetPBM, and ImageMagick。

注意: 添加水印操作仅仅在使用GD/GD2时可用。另外，即使支持其他的图像处理库，但是为了计算图像的属性，GD是必需的。然而，将使用你制定的库来进行图像处理操作。

初始化类

像 CodeIgniter 的大多数类一样，图像处理类在你的控制器里使用 $this->load->library 方法来初始化：

$this->load->library('image_lib');

在图像处理库被载入后就已经做好被使用的准备了。你将用来调用所有图像处理方法的图像处理库对象是：$this->image_libO

处理一个图像

不管你想进行何种图像处理操作（调整大小，图像裁剪，图像旋转，添加水印），通常过程都是一样的。你先设置一些你想进行的图像操作的参数，然后调用四个可用方法中的一个。例如，创建一个图像缩略图：

$config['image_library'] = 'gd2';
$config['source_image'] = '/path/to/image/mypic.jpg';
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['width'] = 75;
$config['height'] = 50;

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

$this->image_lib->resize();

以上代码告诉image_resize函数去查找位于source_image目录且名为mypic.jpg的图片，然后运用GD2图像库创建75 X 50像素的缩略图。 当 maintain_ratio 选项设为可用时，生成的缩略图将在保持纵横比例的同时，尽可能的在宽度和高度上接近所设定的width和height。缩略图将被命名为类似 mypic_thumb.jpg的形式

注意: 为了让图像类能进行所有操作，包含图片的文件夹必须开启可写权限。

处理函数

有五个处理函数可以调用:

  • $this->image_lib->resize()
  • $this->image_lib->crop()
  • $this->image_lib->rotate()
  • $this->image_lib->watermark()
  • $this->image_lib->clear()

当调用成功时，这些函数会返回 TRUE, 否则会返回 FALSE. 如果调用失败时，用以下函数可以获取错误信息:

echo $this->image_lib->display_errors();

像下面这样当调用失败时显示错误，是一个好的例子来有条件的使用处理函数:

if ( ! $this->image_lib->resize())
{
    echo $this->image_lib->display_errors();
}

注意: 你可以随意的给错误使用HTML的格式。像下面这样，添加打开/关闭标记符:

$this->image_lib->display_errors('<p>', '</p>');

参数

你可以用下面的参数来对图像处理进行调配，既而满足你的要求。

注意，不是所有的参数都可以应用到任何得函数中。例如，x/y 轴参数只能被图像裁剪使用。但是，宽度和高度参数对裁剪函数是无效的。 "可用性" 列指明了哪些函数是可以使用对应的参数的。

可用性图列:

  • R - 调整图像大小
  • C - 图像裁剪
  • X - 图像旋转
  • W - 添加图像水纹
参数 | 默认值 | 选项 | 描述 | 可用性
image_library | GD2 | GD, GD2, ImageMagick, NetPBM | 设置图像库 | R, C, X, W
library_path | 无 | 无 | 设置 ImageMagick 或 NetPBM 库在服务器上的路径。要使用其中任何一个，你都需要设置它们的路径 | R, C, X
source_image | 无 | 无 | 设置原始图像的名字/路径。 对路径而言，只能是相对或绝对的服务器路径，不能使用URL。 | R, C, S, W
dynamic_output | FALSE | TRUE/FALSE (布尔值) | 决定新图像的生成是要写入硬盘还是动态的存在。注意，如果是动态生成的话，图像生成后是不能在页面中定位的。它简单地以header定义为image的动态图像形式显示在你的浏览器中。 | R, C, X, W
quality | 90% | 1 - 100% | 设置图像的品质。品质越高，图像文件越大 | R, C, X, W
new_image | None | None | 设置图像的目标名/路径。 当复制图像时，你会用到这个参数的。这个路径必须是相对或绝对的服务器路径，不能是URL | R, C, X, W
width | None | None | 设置你想要得图像宽度。 | R, C
height | None | None | 设置你想要得图像高度 | R, C
create_thumb | FALSE | TRUE/FALSE (boolean) | 让图像处理函数产生一个预览图像 | R
thumb_marker | _thumb | 无 | 指定预览图像的标示。它将在被插入文件扩展名之前。例如，mypic.jpg 将会变成 mypic_thumb.jpg | R
maintain_ratio | TRUE | TRUE/FALSE (boolean) | 指定是否在缩放或使用硬值的时候使图像保持原始的纵横比例。 | R, C
master_dim | auto | auto, width, height | 指定一个选项作为缩放和创建缩略图时的主轴。例如，你想要将一张图片缩放到100×75像素。如果原来的图像的大小不能完美的缩放到这个尺寸，那么由这个参数决定把哪个轴作为硬值。"auto" 依据图片到底是过高还是过长自动设定轴。 | R
rotation_angle | None | 90, 180, 270, vrt, hor | 指定图片旋转的角度。PHP的旋转是逆时针的，如果想向右转90度就得把这个参数定义为270。 | X
x_axis | None | None | 为图像的裁剪设定X轴上的长度。例如，设为30就是将图片左边的30像素裁去。 | C
y_axis | None | None | 为图像的裁剪设定Y轴上的长度。例如，设为30就是将图片顶端的30像素裁去。 | C

在配置文件中设置参数

如果你不喜欢用以上的方式设置参数，你还能通过配置文件来设置它们。只要创建一个名为image_lib.php的文件, 在该文件中加入一个 $config 数组。 然后将这个文件保存到: config/image_lib.php ，它将会被自动调用。 如果你将参数保存在配置文件里，你就不需要再使用 $this->image_lib->initialize 函数。

$this->image_lib->resize()

这个图像大小调整函数让你能调整原始图像的大小，创建一个备份（调整过的和未调整过的），或者创建一个缩略图。

创建一个备份和创建一个缩略图之间没有实际上的区别，除了缩略图的文件名会有一个预定义的后缀(如, mypic_thumb.jpg)。

所有列在上面表中的参数对这个函数可用，除了这三个：rotation_angle, x_axis, and y_axis。

创建一个缩略图

resize函数能用俩创建缩略图(并保留原图) 只要你把这个参数设为TRUE:

$config['create_thumb'] = TRUE;

这一个参数决定是否创建一个缩略图。

创建一个备份

resize函数能创建一个图像的备份(并保留原图) 只要你通过以下参数设置一个新的路径或者文件名：

$config['new_image'] = '/path/to/new_image.jpg';

注意以下规则:

  • 如果只指定新图像的名字，那么它会被放在原图像所在的文件夹下。
  • 如果只指定路径，新图像会被放在指定的文件夹下，并且名字和原图像相同。
  • 如果同时定义了路径和新图像的名字，那么新图像会以指定的名字放在指定的文件夹下。

调整原图像的大小

如果上述两个参数(create_thumb, and new_image)均未被指定，resize函数的处理结果将直接作用于原图像。

$this->image_lib->crop()

crop函数的用法与resize函数十分接近，除了它需要你设置用于裁剪的X和Y值（单位是像素），如下:

$config['x_axis'] = '100';
$config['y_axis'] = '40';

前面那张表中所列的所有参数都可以用于这个函数，除了这些：rotation_angle, width, height, create_thumb, new_image.

这是一个如何裁剪一张图片的示例：

$config['image_library'] = 'imagemagick';
$config['library_path'] = '/usr/X11R6/bin/';
$config['source_image'] = '/path/to/image/mypic.jpg';
$config['x_axis'] = '100';
$config['y_axis'] = '60';

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

if ( ! $this->image_lib->crop())
{
    echo $this->image_lib->display_errors();
}

注意：如果没有一个可视化的界面，是很难裁剪一张图片的。因此，除非你打算制作这么一个界面，否则这个函数并不是很有用。事实上我们(译注：指Ellislab公司，CodeIgniter的发行者)在自己开发的CMS系统ExpressionEngine的相册模块中添加的一个基于JavaScript的用户界面来选择裁剪的区域。

$this->image_lib->rotate()

rotate()函数需要通过参数设置旋转的角度：

$config['rotation_angle'] = '90';

以下是5个可选项:

  1. 90 - 逆时针旋转90度。
  2. 180 - 逆时针旋转180度。
  3. 270 - 逆时针旋转270度。
  4. hor - 水平翻转。
  5. vrt - 垂直翻转。

下面是旋转图片的一个例子：

$config['image_library'] = 'netpbm';
$config['library_path'] = '/usr/bin/';
$config['source_image'] = '/path/to/image/mypic.jpg';
$config['rotation_angle'] = 'hor';

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

if ( ! $this->image_lib->rotate())
{
    echo $this->image_lib->display_errors();
}

$this->image_lib->clear()

clear函数重置所有之前用于处理图片的值。当你用循环来处理一批图片时，你可能会想使用它。

$this->image_lib->clear();

图像水印处理

水印处理功能需要 GD/GD2 库的支持.

水印处理的两种类型

你可以使用以下两种图像水印处理方式:

  • Text: 水印信息将以文字方式生成，要么使用你所指定的TrueType字体，要么使用GD库所支持的内部字体。如果你要使用TrueType版本，那么你安装的GD库必须是以支持TrueType的形式编译的（大多数时候是，不是所有）。
  • Overlay: 水印信息将以图像方式生成，新生成的水印图像(通常是透明的 PNG 或者 GIF)将覆盖在原图像上.

水印处理一个图像

类似使用其他类型图像函数(resizing, cropping, and rotating)， 你也要对水印处理函数进行参数设置来生成你要得结果. 例子如下:

$config['source_image'] = '/path/to/image/mypic.jpg';
$config['wm_text'] = 'Copyright 2006 - John Doe';
$config['wm_type'] = 'text';
$config['wm_font_path'] = './system/fonts/texb.ttf';
$config['wm_font_size'] = '16';
$config['wm_font_color'] = 'ffffff';
$config['wm_vrt_alignment'] = 'bottom';
$config['wm_hor_alignment'] = 'center';
$config['wm_padding'] = '20';

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

$this->image_lib->watermark();

上面的例子是使用16像素 True Type 字体来生成文本水印"Copyright 2006 - John Doe" 该水印将出现在离图像底部20像素的中底部位置，

注意: 当调用图像类处理图像时，任何目标图片文件必须有 "写入"的权限， 例如：777.

水印处理参数

这个表里列举了两种水印处理 (text or overlay) 的可设置的参数

参数 | 默认值 | 选项 | 描述
wm_type | text | text, overlay | 设置想要使用的水印处理类型.
source_image | 无 | 无 | 设置原图像的名字和路径. 路径必须是相对或绝对路径，但不能是URL.
dynamic_output | FALSE | TRUE/FALSE (布尔值) | 决定新的图片文件应该被写入磁盘还是动态生成。说明: 如果你选择动态生成, 那么每次就只能显示一张图片, 而且它还不能被定位在页面上, 仅仅是把原始图片动态输出到浏览器中，并且带上image header.
quality | 90% | 1 - 100% | 设置图片的质量。质量越高, 文件就越大。
padding | 无 | 一个数字 | 填充量, 以像素为单位, 在实际应用中将被设置为水印与图片边缘的距离。
wm_vrt_alignment | bottom | top, middle, bottom | 设置水印图像的垂直对齐方式。
wm_hor_alignment | center | left, center, right | 设置水印图像的水平对齐方式。
wm_hor_offset | 无 | 无 | 你可以指定一个水平偏移量(以像素为单位)用于设置水印的位置。偏移量通常是向右移动水印, 除非你把水平对齐方式设置为"right", 那么你的偏移量将会向左移动水印。
wm_vrt_offset | 无 | 无 | 你可以指定一个垂直偏移量(以像素为单位)用于设置水印的位置。偏移量通常是向下移动水印, 除非你把垂直对齐方式设置为"bottom", 那么你的偏移量将会向上移动水印。

Text参数

这个表格显示了Text类型水印的可用参数。

参数 | 默认值 | 选项 | 描述
wm_text | 无 | 无 | 你想作为水印显示的文本。通常是一份版权声明。
wm_font_path | 无 | 无 | 你想使用的TTF字体在服务器上的路径。如果你没有使用这个选项，系统将使用原生的GD字体。
wm_font_size | 16 | 无 | 文字的大小。 说明: 如果你没有使用上面的TTF字体选项，那么这个数值必须是 1-5 之间的一个数字。否则, 你可以使用任意一个用于你的字体的有效像素大小。
wm_font_color | ffffff | 无 | 字体颜色，以十六进制给出。注意, 你必须给出完整的6位数的十六进制值(例如993300), 而不是3位数的简化值(例如fff)。
wm_shadow_color | 无 | 无 | 阴影的颜色, 以十六进制给出。如果此项为空，那么阴影将不会被使用。注意, 你必须给出完整的6位数的十六进制值(例如993300), 而不是3位数的简化值(例如fff)。
wm_shadow_distance | 3 | 无 | 阴影与文字之间的距离(以像素为单位)。

Overlay 参数

这个表格显示了Overlay类型水印的可用参数。

参数 | 默认值 | 选项 | 描述
wm_overlay_path | 无 | 无 | 你想要用作水印的图片在你服务器上的路径。只在你使用了overlay方法时需要。
wm_opacity | 50 | 1 - 100 | 图像不透明度(opacity)。你可以指定你的水印图片的不透明度(例如transparency)。这将使水印模糊化，从而不会掩盖住底层原始图片的细节。通常设置为50%。
wm_x_transp | 4 | 一个数字 | 如果你的水印图片是一个PNG或GIF图片, 你可以指定一种颜色用来使图片变得"透明"。这项设置(以及下面那项)将允许你指定这种颜色。它的原理是, 通过指定"X"和"Y"坐标值(从左上方开始测量)来确定图片上对应位置的某个像素, 这个像素所代表的颜色就是你要设置为透明的颜色。
wm_y_transp | 4 | 一个数字 | 与前一个选项一起, 允许你指定某个像素的坐标值, 这个像素所代表的颜色就是你要设置为透明的颜色。

翻译贡献者: aykirk, bnlt, Hex, sydcurie, szlinz, yinzhili
最后修改: 2009-09-21 11:13:15

上一个主题: HTML 表格类 · 页首 · 用户指南首页 · 下一个主题: 输入类


输入和安全类

CodeIgniter 中国首页 › 用户指南首页 › 输入和安全类
搜索用户指南
查看原文

输入类

输入类有两个目的：

  1. 为了安全，预处理输入数据。
  2. 提供helper的一些方法，取得输入数据，并预处理输入数据。

说明: 系统自动加载此类，不用手动加载。

安全过滤（Security Filtering）

当触发一个控制器的时候，安全过滤（Security Filtering）功能自动启动。做以下事情：

  • 摧毁全局GET数组。CodeIgniter不用GET数组，就没有必要允许它。
  • 当 register_globals 被设置为 on 的时候，销毁所有的全局变量。
  • 过滤 POST/COOKIE 数组键，只允许字母-数字(以及一些其它的)字符。
  • 可以过滤跨站脚本攻击 (Cross-site Scripting Hacks) 此功能可全局打开（enabled globally），或者按要求打开。
  • 换行符统一换为 \n

跨站脚本过滤（XSS Filtering）

CodeIgniter可以自动过滤POST和COOKIE中的跨站脚本攻击，或者可以在每次处理POST和COOKIE的时候单独使用。缺省情况下，CodeIgniter没有开启自动过滤。因为这样的处理需要一定的cpu资源（a bit of processing overhead）。并且，用户也不一定完全需要。

XSS过滤器会查找常用的那些触发JavaScript的技术，或者是其它类型的企图劫持Cookie或进行其它恶意行为的代码。一旦遇到不允许的内容，它将把数据转换为字符实体，以保证安全。

说明: 此功能只应该处理提交的数据。而不应该用于其它情况，因为它要消耗很大的cpu资源。

要想过滤数据中的跨站脚本，使用如下方法：

$this->input->xss_clean()

例子如下：

$data = $this->input->xss_clean($data);

如果你想让codeigniter自动处理POST 或者 COOKIE 数据。你可以在application/config/config.php文件中设定：

$config['global_xss_filtering'] = TRUE;

注意：表单验证类也提供了 XSS 过滤选项。

对于文件上传的安全，此函数的第二个可选参数 is_image，允许此函数检测图像潜在的XSS攻击。当此第二个参数被设置为 TRUE 的时候，如果图像是安全的，它将会返回TRUE，而不是被修改后的字符串。如果图像含有浏览器将会执行的潜在恶意信息，函数将会返回FALSE。

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

使用 POST, COOKIE, 或 SERVER 数据

CodeIgniter 有3个 helper方法可以让用户取得POST, COOKIE 或 SERVER 的内容。用这些方法比直接使用php方法($_POST['something'])的好处是不用先检查此项目是不是存在。 直接使用php方法，必须先做如下检验：

if ( ! isset($_POST['something']))
{
    $something = FALSE;
}
else
{
    $something = $_POST['something'];
}

用CodeIgniter内建的方法，你可以这样：

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

这3个方法是：

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

$this->input->post()

第一个参数是所要取得的post中的数据：

$this->input->post('some_data');

如果数据不存在，方法将返回 FALSE (布尔值)。

第二个参数是可选的，如果想让取得的数据经过跨站脚本过滤（XSS Filtering），把第二个参数设为TRUE。

$this->input->post('some_data', TRUE);

$this->input->get()

This function is identical to the post function, only it fetches get data:

此方法类似post方法，用来取得get数据：

$this->input->get('some_data', TRUE);

$this->input->get_post()

This function will search through both the post and get streams for data, looking first in post, and then in get:

这个方法将会搜索POST和GET方式的数据流，首先以POST方式搜索参数1中的值，否则以GET方式搜索:

$this->input->get_post('some_data', TRUE);

$this->input->cookie()

此方法类似post方法，用来取得cookie数据：

$this->input->cookie('some_data', TRUE);

$this->input->server()

此方法类似上面两个方法，用来取得server数据：

$this->input->server('some_data');

$this->input->ip_address()

返回当前用户的IP。如果IP地址无效，返回0.0.0.0的IP：

echo $this->input->ip_address();

$this->input->valid_ip($ip)

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

if ( ! $this->input->valid_ip($ip))
{
     echo 'Not Valid';
}
else
{
     echo 'Valid';
}

$this->input->user_agent()

返回当前用户正在使用的浏览器的user agent信息。 如果不能得到数据，返回FALSE。

echo $this->input->user_agent();

翻译贡献者: architectcom, Hex, soyota, xjflyttp, yinzhili
最后修改: 2009-09-18 10:11:48

上一个主题: 图像处理类 · 页首 · 用户指南首页 · 下一个主题: 装载器类


CodeIgniter 中国首页 › 用户指南首页 › 语言类

语言类

语言类提供方法去“解开（retrieve）”语言文件或者文本行（lines of text）以实现国际化(internationalization).

CodeIgniter的系统(system)目录下的language目录中有一系列的语言文件。 当你需要显示另外一种语言的错误信息或者其它的一些信息时，可以创建自己的语言文件。

语言文件一般存放在 system/language目录下。或者你可以在application目录下创建一个language目录，并把语言文件存放在这里。CodeIgniter会首先查找system/application/language目录。如果上述目录不存在，或者所要搜索的语言文件不存在，CodeIgniter会搜索全局的 system/language目录。

注意: 每一个语言都要有一个独立的目录，比如，英语的一系列文件都在以下目录中: system/language/english

创建语言文件

语言文件的后缀必须为_lang.php。比如，你想创建一个包含错误信息的文件，你可以这样命名： error_lang.php

在此文件中，你可以在每行把一个字符串赋值给名为$lang的数组，例如：

$lang['language_key'] = "The actual message to be shown";

注意： 为了不和其它文件中的变量重名，最好把一个文件的所有的键值前都加上相同的前缀。比如，可以把每个错误信息都加上error_

$lang['error_email_missing'] = "You must submit an email address";
$lang['error_url_missing'] = "You must submit a URL";
$lang['error_username_missing'] = "You must submit a username";

加载一个语言文件

使用语言文件前，先要加载它，加载方法如下：

$this->lang->load('filename', 'language');

filename是你要加载的语言文件名 (不要带扩展名), language 是那个文件中包含的语言 （比如，英语）。如果没有第二个参数，将会使用 application/config/config.php的缺省语言。

获取一行文本

一旦需要的语言文件被加载，你可以以下的方法取得其中任何一个值：

$this->lang->line('language_key');

language_key 你要显示的字符串所在的数组的键值。

注意：这个方法只是简单的返回值，它并不显示值。（It does not echo it for you）

使用语言行作为表单的Label

这一特性已经被语言类废弃，并转移到语言辅助函数中的 lang() 函数。

自动加载语言

如果需要在整个程序加载一个特定的语言文件，你可以让CodeIgniter在系统初始化的时候自动加载语言文件。可以在 application/config/autoload.php 文件中把语言放在自动加载数组中。

翻译贡献者: architectcom, Fanbin, Hex, lishen2, yinzhili
最后修改: 2009-09-18 09:46:31

上一个主题: 装载器类 · 页首 · 用户指南首页 · 下一个主题: 输出类


装载器类

CodeIgniter 中国首页 › 用户指南首页 › 装载器类
搜索用户指南
查看原文

装载类

装载，顾名思义，是用来装载元素。这些元素可以是库 (类) 视图文件， 助手文件， 插件， 或者是你自己的文件。

提示： 这个类是由系统初始化的，所以，没有必要自己手动初始化。

以下为这个类里面的函数：

$this->load->library('class_name', $config, 'object name')

这个函数是用来加载核心类。class_name 是你要加载的类的名称。 提示： “类”和“库”是可替换使用的。

比如，你想用 CodeIgniter 来发送邮件，第一步就是在你的控制器里加载 email 类。

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

一旦被加载，就可以使用该类了， 使用 $this->email->some_function()。

类库文件可以被保存到主libraries目录的子目录下面，或者保存到个人的application/libraries 目录下。 要载入子目录下的文件，只需将路径包含进来就可以了，注意这里说的路径是指相对于libraries目录的路径。 例如，当你有一个文件保存在下面这个位置:

libraries/flavors/chocolate.php

你应该使用下面的方式来载入它:

$this->load->library('flavors/chocolate');

你可以随心所欲地将文件保存到多层的子目录下。

设置选项

第二个参数是可选的，作用是允许你有选择性地传递配置参数。一般来说你可以将参数以数组的形式传递过去:

$config = array (
                  'mailtype' => 'html',
                  'charset'  => 'utf-8,
                  'priority' => '1'
               );

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

配置参数通常也可以保存在一个配置文件中。每个类库在其各自的页面中都有详细的说明，所以在使用类库之前，你必须认真阅读它们的说明。

给类库分配不同的对象名

第三个参数也是可选的，如果为空，类库通常就会被赋值给一个与类库同名的对象。例如，如果类库名为 Session, 它将会被赋值给一个名为 $this->session 的变量。

如果你希望使用你的自定义名称，你可以通过第三个参数把它传递过去:

$this->load->library('session', '', 'my_session');

// Session 类现在可以通过下面的方式访问:

$this->my_session

$this->load->view('file_name', $data, true/false)

这个函数是用来加载你的视图文件。 如果你尚未阅读本手册视图 章节的话，建议你先去阅读那里的内容，会有更详细的函数使用说明.

第一个参数是必须的. 指定你要载入的视图文件的名称. 注意: 无需加上 .php 扩展名，除非你使用了其他的扩展名。

第二个参数 optional 允许你传入数组或对象, 传入的数组或对象将使用 php extract 函数导出，你可以在视图中任意使用这些导出的变量. 此外，请阅读 视图 章节了解该功能的更多用法.

第三个参数是可选的，作用是改变函数的运行方式，将数据以字符串的形式返回，而不是发送给浏览器。当你希望用不同的方式处理数据时，这个参数就非常有用。如果你将这个参数设置为 true (布尔型)，函数就会返回数据。这个参数的默认值是 false, 也就是数据将会被发送给浏览器。如果你希望数据被返回，记得要将它赋值给一个变量:

$string = $this->load->view('myfile', '', true);

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

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

如果你的模型位于models目录的子目录下，那么，相对路径也必须被包含进来。例如，如果你有一个模型位于 application/models/blog/queries.php ，你应该使用下面的语句来载入它:

$this->load->model('blog/queries');

如果你希望给模型赋予一个你自定义的对象名，请在函数的第二个参数中给出你自定义的名称:

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

$this->fubar->function();

$this->load->database('options', true/false)

这个函数的作用是载入数据库类。这两个参数都是可选的。请查看 数据库 段落以获取更多信息。

$this->load->scaffolding('table_name')

这个函数的作用是启用脚手架。请查看 脚手架 段落以获取更多信息。

$this->load->vars($array)

这个函数以一个关联数组作为输入参数,将这个数组用PHP的extract函数, 转化成与这个数组对应的变量.这个函数如果用第二个参数,将产生和上面的$this->load->view()相同的结果 .你之所以要单独用这个函数也许是因为,你想在控制器的构造函数中设置一些全局变量,以使这些变量在任意函数调用的视图(view)里能够用上.你能多次调用这个函数.数组数据被缓存并被并入一个数组,用来转化成变量.

$this->load->helper('file_name')

这个函数的作用是载入辅助函数， file_name 是辅助函数对应的文件名，不包括 _helper.php 扩展名。

$this->load->plugin('file_name')

这个函数的作用是载入插件，file_name 是插件对应的文件名，不包括 _plugin.php 扩展名。

$this->load->file('filepath/filename', true/false)

这是一个通用的文件载入函数。在第一个参数中给出文件所在的路径和文件名，对应的文件将会被打开。默认情况下，数据会被发送给浏览器，就如同视图文件一样，但如果你将第二个参数设置为 true (布尔型) 那么数据就会以字符串的形式被返回，而不是发送给浏览器。

$this->load->lang('file_name')

这个函数是 语言加载函数: $this->lang->load() 的一个别名。

$this->load->config('file_name')

这个函数是 配置文件加载函数: $this->config->load() 的一个别名。

翻译贡献者: cookieu, Hex, tg8866, weelia, yinzhili
最后修改: 2009-07-12 10:04:24

上一个主题: 输入类 · 页首 · 用户指南首页 · 下一个主题: 语言类


CodeIgniter 中国首页 › 用户指南首页 › 输出类

输出类

输出类是只有一个主要功能的简单的类: 发送最终的Web页面到所请求的浏览器。如果您开启缓存功能，他还负责缓存您的网页文件。

输出类虽然很简单，但是它实现的功能却很重要咯: 输出最后的执行结果给发送请示的浏览器. 如果你选择了使用缓存 ，这块也归它管.

注意：输出类的初始化操作是由系统自动完成的，基本上不用你操心.

在一般的情况下你是感觉到不到它的存在的（也用不着去关心），对于你来说它就是透明的，不用去干预，它就能正常的工作. 比如说, 你使用装载器类加载了一个视图文件, 这个视图文件的内容会自动传递给输出类对象, 然后呢，在方法执行完毕后会自动调用输出类对象将执行的结果输出. 但是呢，实际开发的过程当中会遇见一些特殊的情况需要我们干预输出，接管输出的控制权(像是客户要求将数据导出成Excel，提供下载)，这种时候，下面的这些个方法就用啦:

$this->output->set_output();

告诉CodeIgniter方法执行完毕后，用给定的数据做为输出。例如：

$this->output->set_output($data);

重要：使用这个方法有一点很重要，就要将它放在最后一句，千万要注意啊，到时候出了错，不要怪我没提醒你.

$this->output->get_output();

使用这个方法，你可以得到将要输出的数据，并把它保存起来，留着它用（我们做新闻类型网站的时候，常常需要生成静态的HTML文件）. 例如：

$string = $this->output->get_output();

注意，如果先前的数据已经被一个类似 $this->load->view() 的 CodeIgniter 函数送到了输出类，那么只能取得那个函数之后的输出。

$this->output->set_header();

使用此方法，允许你设置将会被发送到浏览器的HTTP协议的标头，作用相当于php的标准函数: header()。例如：

$this->output->set_header("HTTP/1.0 200 OK");
$this->output->set_header("HTTP/1.1 200 OK");
$this->output->set_header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_update).' GMT');
$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate");
$this->output->set_header("Cache-Control: post-check=0, pre-check=0");
$this->output->set_header("Pragma: no-cache");

$this->output->set_status_header(code, 'text');

允许你手动设置服务器状态头(header)。例如::

$this->output->set_status_header('401');
// 将header设置为: Unauthorized

单击这里 查看全部的header列表。

$this->output->enable_profiler();

允许你开启或禁用评测器，评测器将在页的底部显示测试基准点或调试、优化需要的其他数据。

在控制器函数的任何位置放置以下函数，可以开启控制器：

$this->output->enable_profiler(TRUE);

当开启评测器功能，会在您的页面底部生成一个报告。

你可以用以下语句禁用评测器：

$this->output->enable_profiler(FALSE);

$this->output->cache();

CodeIgniter的输出类同样也控制缓存。要获取更多信息，请阅读 缓存文档.

翻译贡献者: billycui, Glen, Hex, lishen2, yinzhili
最后修改: 2009-09-18 09:40:51

上一个主题: 语言类 · 页首 · 用户指南首页 · 下一个主题: 分页类


CodeIgniter 中国首页 › 用户指南首页 › 分页类

分页类

CodeIgniter 的分页类是一个非常简单，并且 100% 用户自定义的类。

分页类允许你通过提交链接从一个页面导航至另一个页面，如下：

« First  < 1 2 3 4 5 >  Last »

例子

这里有一个例子展示了如何在你的控制器里创建一个分页：

$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();

提示：

$config 数组包含了你的配置参数。这些参数被 $this->pagination->initialize 方法传递，如上面的例子所展示。以下是对这些项目的描述：

  • base_url 这是一个完整的 URL 路径通向包含你的分页控制器类/方法。在上面的这个例子里，它指向了一个叫“Test”的控制器和它的一个方法叫“Page”。 记住，你可以重新路由你的 URI，如果你需要一个不同的结构。
  • total_rows 这个数字展示了你需要做分页的数据总行数。这个数值是你查询数据库得到的数据总量。
  • per_page 这个数字计划了你每个页面中希望展示的项目数量，在上面的那个例子中，你可以得到每页显示 20 个项目。

当你没有分页需要显示时，create_links() 方法会返回一个空的字符串。

在配置文件中设置参数

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

自定义分页

下面是一个参数列表，你可以通过初始化方法来定制你喜欢的显示效果。

$config['uri_segment'] = 3;

分页方法自动测定你 URI 的哪个部分包含页数。如果你需要一些不一样的，你可以明确指定它。

$config['num_links'] = 2;

放在你当前页码的前面和后面的“数字”链接的数量。比方说值为 2 就会在每一边放置 2 个数字链接，就像此页顶端的示例链接那样。

$config['page_query_string'] = TRUE

默认情况下，分页类库假设你使用 URI 段，并像这样构造你的链接：

http://example.com/index.php/test/page/20

如果你把 $config['enable_query_strings'] 设置为 TRUE，你的链接将自动地被用查询字符串重写。这个选项也可以被明确地设置。把 $config['page_query_string'] 设置为 TRUE，分页链接将变成：

http://example.com/index.php?c=test&m=page&per_page=20

请注意，“per_page”是默认传递的查询字符串，但也可以使用 $config['query_string_segment'] = '你的字符串' 来配置。

添加封装标签

如果你希望在整个分页周围围绕一些标签，你可以通过下面的两种方法：

$config['full_tag_open'] = '<p>';

把打开的标签放在所有结果的左侧。

$config['full_tag_close'] = '</p>';

把关闭的标签放在所有结果的右侧。

自定义起始链接

$config['first_link'] = 'First';

你希望在分页的左边显示“第一页”链接的名字。

$config['first_tag_open'] = '<div>';

“第一页”链接的打开标签。

$config['first_tag_close'] = '</div>';

“第一页”链接的关闭标签。

自定义结束链接

$config['last_link'] = 'Last';

你希望在分页的右边显示“最后一页”链接的名字。

$config['last_tag_open'] = '<div>';

“最后一页”链接的打开标签。

$config['last_tag_close'] = '</div>';

“最后一页”链接的关闭标签。

自定义“下一页”链接

$config['next_link'] = '&gt;';

你希望在分页中显示“下一页”链接的名字。

$config['next_tag_open'] = '<div>';

“下一页”链接的打开标签。

$config['next_tag_close'] = '</div>';

“下一页”链接的关闭标签。

自定义“上一页”链接

$config['prev_link'] = '&lt;';

你希望在分页中显示“上一页”链接的名字。

$config['prev_tag_open'] = '<div>';

“上一页”链接的打开标签。

$config['prev_tag_close'] = '</div>';

“上一页”链接的关闭标签。

自定义“当前页”链接

$config['cur_tag_open'] = '<b>';

“当前页”链接的打开标签。

$config['cur_tag_close'] = '</b>';

“当前页”链接的关闭标签。

自定义“数字”链接

$config['num_tag_open'] = '<div>';

“数字”链接的打开标签。

$config['num_tag_close'] = '</div>';

“数字”链接的关闭标签。

翻译贡献者: Fanbin, Hex, roln, sankai
最后修改: 2009-02-27 21:33:06

上一个主题: 输出类 · 页首 · 用户指南首页 · 下一个主题: Session 类


CodeIgniter 中国首页 › 用户指南首页 › 模板解析器类

模板解析器类

模板解析器类可以解析你的视图文件中的伪变量。它可以解析简单的变量或者以变量作为标签的结构。如果你以前没有用过模板引擎，那么伪变量如下所示：

<html>
<head>
<title>{blog_title}</title>
</head>
<body>

<h3>{blog_heading}</h3>

{blog_entries}
<h5>{title}</h5>
<p>{body}</p>
{/blog_entries}
</body>
</html>

这些变量不是标准的PHP变量，但是这样的以文本形式展现可以让你很容易地区分出它与PHP变量的不同之处。

注意：因为在视图文件中使用纯PHP要快一些，所以CodeIgniter不 要求你一定要用这个类。然而，有一些开发者和对使用PHP有困难的设计师一同工作时，更愿意使用模板引擎。

Also Note: 模板解析类不是一个完善的模板解析方案。为了保持最高性能，我们的模板解析类非常精简。

类的初始化

如同CI中的其他类, 使用$this->load->library 函数在控制器中初始化模板解析类：

$this->load->library('parser');

一旦加载，模板解析类可以这样使用: $this->parser

下面的函数在库中可用：

$this->parser->parse()

这个方法接收一个模板名和数据数组作为输入，生成一个解析过的版本。例如：

$this->load->library('parser');

$data = array(
            'blog_title' => 'My Blog Title',
            'blog_heading' => 'My Blog Heading'
            );

$this->parser->parse('blog_template', $data);

第一个参数包含视图文件的文件名(在这个例子中是blog_template.php), 第二个参数包含一个用于模板替换的相关数组。 在上面的例子中，这个模板包含两个变量：{blog_title} 和 {blog_heading}

不用“echo”或处理$this->parser->parse()返回的数据。他会自动传送数据到output类最终输出到浏览器。然而，如果你想返回数据而不是发送到output类，你可以使用TRUE(布尔值)作为第三个参数。

$string = $this->parser->parse('blog_template', $data, TRUE);

变量对

上面的示例代码中演示简单变量的替换。如果你想要替换整个块的变量，这个块的每行都包含新值？想象一下在页面最顶端我们展示的例子：

<html>
<head>
<title>{blog_title}</title>
</head>
<body>

<h3>{blog_heading}</h3>

{blog_entries}
<h5>{title}</h5>
<p>{body}</p>
{/blog_entries}
</body>
</html>

在上面的代码中你会注意到一对变量： {blog_entries} 数据…… {/blog_entries}。 像这样，在这对变量中间的数据将会被多次替换，替换的次数取决于结果集的行数。

除了要根据你的数据提供一个多维数组以外，变量对的解析代码和单个变量的解析代码相同。参考下面的例子：

$this->load->library('parser');

$data = array(
              'blog_title'   => 'My Blog Title',
              'blog_heading' => 'My Blog Heading',
              'blog_entries' => array(
                                      array('title' => 'Title 1', 'body' => 'Body 1'),
                                      array('title' => 'Title 2', 'body' => 'Body 2'),
                                      array('title' => 'Title 3', 'body' => 'Body 3'),
                                      array('title' => 'Title 4', 'body' => 'Body 4'),
                                      array('title' => 'Title 5', 'body' => 'Body 5')
                                      )
            );

$this->parser->parse('blog_template', $data);

如果你的“数据对”来自数据库的查询，那么它已经是一个二维数组，你可以轻松的使用数据库 result_array() 函数：

$query = $this->db->query("SELECT * FROM blog");

$this->load->library('parser');

$data = array(
              'blog_title'   => 'My Blog Title',
              'blog_heading' => 'My Blog Heading',
              'blog_entries' => $query->result_array()
            );

$this->parser->parse('blog_template', $data);

翻译贡献者: buttonfly, Hex, lishen2, lomatus
最后修改: 2009-02-21 23:50:54

上一个主题: Trackback 类 · 页首 · 用户指南首页 · 下一个主题: 排版类


CodeIgniter 中国首页 › 用户指南首页 › Session 类

Session 类

Session类可以使用户在浏览您的网站时，维持他们的状态并跟踪他们的行为。 Session类将每个用户的session信息序列化（serialize）后存储到到cookie中（并同时进行加密）。 您还可以将session数据存储到数据库中来增强安全性，但是这时要求存储在用户cookie中的session ID值能与数据库中存储的用户session ID值相匹配。程序默认只在cookie中存储session。如果您在要在数据库中存储session的话，需要按照下面指示的方法，在您的数据库中创建需要的数据表。

注意： Session类并不使用PHP本身的session，而是使用类自己的session，这样做，可以给开发者提供更大的弹性。

初始化 Session

Sessions会在每个页面载入后开始运行，所以session类必须首先被初始化。您可以在控制器中初始化，也可以在系统中自动加载（译者注：在autoload.php设定）。session类的绝大部分都会在后台运行，所以初始化session时，它session数据会被自动读取、创建和更新。

要在您的控制器构造函数中初始化session类，您可以使用 $this->load->library 函数:

$this->load->library('session');

一旦被载入, session就可以这样使用： $this->session

Sessions 是怎样工作的？

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

对于您来说，需要知道的非常重要的一点就是，session类一旦被初始化，它就会自动运行。对于后面的事情，您可以完全不作理会。正如您将会在下面看到的一样，您可以正常使用session来工作，甚至还可以添加自己的session数据，而在这一切的过程中，读、写和更新的操作都是自动完成的。

Session 数据是什么？

一个 session 是由一个包括下列信息的数组组成的：

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

以上数据将会用以下数组格式序列化并存到cookie里：

[array]
(
     'session_id'    => random hash,
     'ip_address'    => 'string - user IP address',
     'user_agent'    => 'string - user agent data',
     'last_activity' => timestamp
)

如果你将加密设置开启，serialized 的数组会被先被加密，然后存入cookie中。这会让数据不容易被看到和修改，从而提高安全性。从这里可以找到更多关于加密的信息。Session类会自动负责初始化和数据加密。

注意: 默认情况下, Session Cookie 每隔 5 分钟才会更新一次,这样会减少对处理器的负荷。如果你重复的装载页面， 你会发现"上次活动"的时间在五分钟，或多余五分钟的时候才会变化，也就是 cookie 上次被写入的时间。 这个时间可以通过设置 system/config/config.php 文件里的 $config['time_to_update'] 行来改变。

取得 Session 数据

可以通过如下的函数来得到 session 数组的任何信息:

$this->session->userdata('item');

item 是数组里的相对应数据的索引。例如，想要获得 session ID， 你要使用如下的代码:

$session_id = $this->session->userdata('session_id');

注意: 如果你的目标数据不存在的话，这个函数会返回 FALSE (布尔值boolean)。

添加自定义的 Session 数据

session 数组的一个非常有用的用途是你可以它里面添加你自己的数据，这些数据会被保存在用户的 cookie 中。这样做的原因是什么呢？看看这个例子:

假设，有个特定用户登陆到你的网站， 当他通过检测后 你可以添加他的用户名和电子邮件到 session cookie 中，这些信息可以在不去访问数据库的情况下，当成全局量来使用。

通过以下函数，你可以传递一个新的用户数组到 session 数组中:

$this->session->set_userdata($array);

$array 是一个结合数组，用来存储你的新数据。例如 :

$newdata = array(
                   'username'  => 'johndoe',
                   'email'     => 'johndoe@some-site.com',
                   'logged_in' => TRUE
               );

$this->session->set_userdata($newdata);

如果使用下面 set_userdata()函数的写法,可以每次只添加一个用户数据。

$this->session->set_userdata('some_name', 'some_value');

注意: Cookies 只能存储 4KB 的数据, 使用时要小心超出它的容量。特别指出的是，加密会产生比原数据更长的数据字符串，所以一定要当心你要存放数据的大小。

删除 Session 数据

正如使用 set_userdata() 是用来添加信息到 session 中，而通过向 unset_userdata() 函数中传递 session key 可以用来删除这些信息。例如, 你想要从 session 信息里去掉 'some_name':

$this->session->unset_userdata('some_name');

<!-- 以下由Fanbin 翻译-->

也可以给这个函数传一个要删除项的关联数组。

$array_items = array('username' => '', 'email' => '');

$this->session->unset_userdata($array_items);

闪出数据

CodeIgniter 支持 "闪出数据", 或者说Session数据只对下次服务器请求可用, 然后会自动清除。这应该会非常有用，往往应用在信息或状态提示中（例如：“记录2已删除”）。

注意: 闪出数据变量名以“flash_”开头，所以在你自己的变量名中要避免使用这个前缀。

要添加闪出数据：

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

你也可以使用和 set_flashdata() 同样的方式向 set_flashdata() 传递一个数组。

要读取一个闪出数据变量：

$this->session->flashdata('item');

如果你发现你需要在一个附加的请求中保留一个闪出数据，你可以使用 keep_flashdata() 这个函数。

$this->session->keep_flashdata('item');

将 Session 数据存入数据库

由于Session数据数组是附带一个Session ID保存在用户cookie里的，你无法验证它，除非你把session数据存储在数据库中。在一些不需要或很少需要安全保护的应用中，session ID 或许并不需要。但如果你的应用需要安全保护，验证是必须滴。

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

为了存储session，你必须先创建一个数据表。这是 session 类所需的基本结构（用于MySQL的）：

注意: 默认情况下这个表叫做 ci_sessions, 但是你可以给它指定任意名字，只要你更新了 application/config/config.php 文件以确保它包含了你所起的名字。 一旦你创建了数据表，你就可以像下面这样在config.php文件中启用数据库选项：

$config['sess_use_database'] = TRUE;

一旦启用了，Session类就会在数据库中存储session数据。

同时确保你已经在配置文件中指定了数据表名：

$config['sess_table_name'] = 'ci_sessions";

注意: Session类已经内置了清除过期session的垃圾回收机制，因此你不需要编写你自己的事务来做这个。

销毁 Session

要清除当前 session:

$this->session->sess_destroy();

注意: 此函数应该是最后被调用的。即使闪出变量已不再有效。如果你只想让某几项而不是所有项被销毁，请使用 unset_userdata().

<!-- Fanbin 翻译部分结束 -->

Session 的参数

你可以在application/config/config.php 文件中找到以下的 Session 相关的参数:

参数 | 默认 | 选项 | 描述
sess_cookie_name | ci_session | 无 | 你想要保存 Session Cookie 的名字。
sess_expiration | 7200 | 无 | session 持续的秒数。默认是2个小时(7200秒)。如果将这个数值设为: 0，就可以得到 永久 session。
sess_encrypt_cookie | FALSE | TRUE/FALSE (布尔值boolean) | 是否对 session 数据加密.
sess_use_database | FALSE | TRUE/FALSE (布尔值boolean) | 是否将 session 数据存放入数据库中。在开启这个选项前，你要先创建一个数据库表。
sess_table_name | ci_sessions | 任何有效的 SQL 表名 | session 数据库表的名字。
sess_time_to_update | 300 | 时间以秒计算 | 这个选项控制 session 类多久会产生一个新的session 和 session id。
sess_match_ip | FALSE | TRUE/FALSE (布尔值boolean) | 是否通过用户的IP地址来读取 session 的数据。 注意 ，有些网络运行商 ISPs 会动态的改变IP, 所以将这个选项设为 FALSE， 才有可能得到永久的 session。
sess_match_useragent | TRUE | TRUE/FALSE (布尔值boolean) | 是否要按照对应的 User Agent 来读取 session 数据。

翻译贡献者: aykirk, Fanbin, guns1985, Hex, shishirui
最后修改: 2009-03-02 21:04:19

上一个主题: 分页类 · 页首 · 用户指南首页 · 下一个主题: Trackback 类


CodeIgniter 中国首页 › 用户指南首页 › HTML 表格类

HTML 表格类

表格类提供允许你从数组或数据库查询结果集中自动生成HTML表格

初始化类

像CodeIgniter的其它类一样, 表格类在控制器中使用$this->load->library 函数进行初始化:

$this->load->library('table');

一旦被加载,可以这样建立一个表格库对象的实例: $this->table

例子

此例演示如何通过一个多维数组（multi-dimensional array）自动生成表格。 注意:数组的第一个索引将成为表头(或者你可以通过 set_heading() function 函数自定义表头)。

$this->load->library('table');

$data = array(
             array('Name', 'Color', 'Size'),
             array('Fred', 'Blue', 'Small'),
             array('Mary', 'Red', 'Large'),
             array('John', 'Green', 'Medium')
             );

echo $this->table->generate($data);

这里是一个由数据库查询结构创建而成的表格例子。表格类会基于表格的名字自动地生成表格标题(参考下面记述的函数，你可以使用set_heading()函数设置你自己的标题)。

$this->load->library('table');

$query = $this->db->query("SELECT * FROM my_table");

echo $this->table->generate($query);

此例演示了如何使用连续的参数创建一个表格：

$this->load->library('table');

$this->table->set_heading('Name', 'Color', 'Size');

$this->table->add_row('Fred', 'Blue', 'Small');
$this->table->add_row('Mary', 'Red', 'Large');
$this->table->add_row('John', 'Green', 'Medium');

echo $this->table->generate();

这个简单的例子，除了更换个别的参数外，还使用了数组：

$this->load->library('table');

$this->table->set_heading(array('Name', 'Color', 'Size'));

$this->table->add_row(array('Fred', 'Blue', 'Small'));
$this->table->add_row(array('Mary', 'Red', 'Large'));
$this->table->add_row(array('John', 'Green', 'Medium'));

echo $this->table->generate();

改变表格的样子

表格类允许你以你指定的设计编排，去设置表格模板。这里是模板的原型：

$tmpl = array (
                    'table_open'          => '<table border="0" cellpadding="4" cellspacing="0">',

                    'heading_row_start'   => '<tr>',
                    'heading_row_end'     => '</tr>',
                    'heading_cell_start'  => '<th>',
                    'heading_cell_end'    => '</th>',

                    'row_start'           => '<tr>',
                    'row_end'             => '</tr>',
                    'cell_start'          => '<td>',
                    'cell_end'            => '</td>',

                    'row_alt_start'       => '<tr>',
                    'row_alt_end'         => '</tr>',
                    'cell_alt_start'      => '<td>',
                    'cell_alt_end'        => '</td>',

                    'table_close'         => '</table>'
              );

$this->table->set_template($tmpl);

注意： 在这个模板，你会发现这里有两个"row"块设置项。 这是允许你创建隔行颜色，或者设计每行数据的重复间隔元素。

你不必提交全部的模板。如果你只想改变编排的一部分，你可以简单地提交那部分的元素。在这个例子里，只有表格的开始标签被更改：

$tmpl = array ( 'table_open'  => '<table border="1" cellpadding="2" cellspacing="1" class="mytable">' );

$this->table->set_template($tmpl);

Function Reference

$this->table->generate()

返回一个包含生成的表格的字符串。 接受一个可选的参数，该参数可以是一个数组或是从数据库获取的对象。

$this->table->set_caption()

允许你给表格添加一个标题

$this->table->set_caption('Colors');

$this->table->set_heading()

允许你设置表格的表头。你可以提交一个数组或分开的参数:

$this->table->set_heading('Name', 'Color', 'Size'); $this->table->set_heading(array('Name', 'Color', 'Size'));

$this->table->add_row()

允许你在你的表格中添加一行。你可以提交一个数组或分开的参数:

$this->table->add_row('Blue', 'Red', 'Green'); $this->table->add_row(array('Blue', 'Red', 'Green'));

$this->table->make_columns()

这个函数以一个一维数组为输入，创建一个二维数组，它的深度和列数一样。这个函数可以把一个带有多个元素的单一数组根据表格的列数进行整理并显示。参考下面的例子:

$list = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve');

$new_list = $this->table->make_columns($list, 3);

$this->table->generate($new_list);

// Generates a table with this prototype

<table border="0" cellpadding="4" cellspacing="0">
<tr>
<td>one</td><td>two</td><td>three</td>
</tr><tr>
<td>four</td><td>five</td><td>six</td>
</tr><tr>
<td>seven</td><td>eight</td><td>nine</td>
</tr><tr>
<td>ten</td><td>eleven</td><td>twelve</td></tr>
</table>

$this->table->set_template()

允许你设置你的模板。你可以提交整个模板或局部模板。

$tmpl = array ( 'table_open'  => '<table border="1" cellpadding="2" cellspacing="1" class="mytable">' );

$this->table->set_template($tmpl);

$this->table->set_empty()

使你能设置一个默认值，用来显示在表格中内容为空的单元格。 例如，你可以设置一个non-breaking space(用来防止表格边框破损的空格):

$this->table->set_empty("&nbsp;");

$this->table->clear()

使你能清除表格的表头和行中的数据。如果你需要显示多个有不同数据的表格，那么你需要在每个表格生成之后调用这个函数来清除之前表格的信息。例如：

$this->load->library('table');

$this->table->set_heading('Name', 'Color', 'Size');
$this->table->add_row('Fred', 'Blue', 'Small');
$this->table->add_row('Mary', 'Red', 'Large');
$this->table->add_row('John', 'Green', 'Medium');

echo $this->table->generate();

$this->table->clear();

$this->table->set_heading('Name', 'Day', 'Delivery');
$this->table->add_row('Fred', 'Wednesday', 'Express');
$this->table->add_row('Mary', 'Monday', 'Air');
$this->table->add_row('John', 'Saturday', 'Overnight');

echo $this->table->generate();

翻译贡献者: architectcom, bnlt, Hex, KilluaVX, tanqimin
最后修改: 2009-08-11 19:34:35

上一个主题: FTP 类 · 页首 · 用户指南首页 · 下一个主题: 图像处理类


CodeIgniter 中国首页 › 用户指南首页 › 引用通告类

引用通告类

这个类提供了一组函数使你能够发送和接收引用通告的数据.

如果你对引用通告不太熟悉的话可以在这里查看更多的信息.

初始化类

和其它大多数类一样,Trackback 类 也是使用$this->load->library function:

$this->load->library('trackback')加载;

加载完毕后,Trackback 对象就能够用: $this->trackback方式使用.

发送引用通告(Trackbacks)

引用通告可以从任何控制器函数中使用与示例相似的代码来发送:

$this->load->library('trackback');

$tb_data = array(
                'ping_url'  => 'http://example.com/trackback/456',
                'url'       => 'http://www.my-example.com/blog/entry/123',
                'title'     => 'The Title of My Entry',
                'excerpt'   => 'The entry content.',
                'blog_name' => 'My Blog Name',
                'charset'   => 'utf-8'
                );

if ( ! $this->trackback->send($tb_data))
{
     echo $this->trackback->display_errors();
}
else
{
     echo 'Trackback was sent!';
}

数组数据说明:

  • ping_url - 你想要发送引用通告的站点的URL。要把引用通告发送至多个URL，请将这些URL用逗号分隔开来。
  • url - 能够浏览到你站点上的博客日志的URL。
  • title - 你的博客日志的标题。
  • excerpt - 你的博客日志的内容。说明：引用通告类只会自动地发送日志内容的前500个字符。它还会去除所有的HTML。
  • blog_name - 你的博客的名称。
  • charset - 你的博客所使用的字符编码。如果省略，将会默认使用UTF-8。

根据发送的成功与否，引用通告发送函数将分别返回 TRUE/FALSE(布尔值)。如果发送失败，你可以通过下面的方式获取到错误信息:

$this->trackback->display_errors();

接收引用通告

在接收引用通告之前你必须得创建一个博客。如果你连博客都没有，那就没有必要继续下去了。

接收引用通告要比发送复杂一点，这仅仅是因为你将需要一个数据表来存储它们，而且你还得验证发送过来的引用通告数据。我们鼓励你去实现一个完整的验证过程，目的是防范垃圾信息和重复数据。你也许还想限制某个给定的时间范围内某个特定IP所能发送给你的引用通告数量，这样可以防范今后的垃圾邮件。接收引用通告的处理过程是很简单的；只不过验证过程占用了大部分的工作量。

你的 Ping URL

为了接受引用通告，你必须在每个博客日志旁边显示一个引用通告URL。这就是人们向你发送引用通告时用到的URL(我们把这个称为你的"Ping URL")。

你的Ping URL必须指向一个包含了引用通告接收代码的控制器，而且URL也必须包含每个特定的日志条目的ID，因此当你接收到引用通告的时候，你就能够将它与某篇日志关联起来。

例如，如果你的控制器类叫做 Trackback，接收函数叫做 receive，那么你的Ping URL看起来应该是这样的:

http://example.com/index.php/trackback/receive/entry_id

其中 entry_id 代表了你的每篇日志单独的ID号。

创建一个引用通告表

在接收引用通告之前你必须创建一个表来存储它们。 下面是表的基础原型:

引用通告规范只需要发送四部分信息(url,title,excerpt,blog_name)到引用通告，但是为了使数据更有用，我们在上面的数据表架构中添加了一些字段(日期、IP地址等等)。

处理一个引用通告

这里有一个关于如何接收和处理引用通告的范例。下面这些代码应该被用在你要接收引用通告的控制器函数里面。

$this->load->library('trackback');
$this->load->database();

if ($this->uri->segment(3) == FALSE)
{
    $this->trackback->send_error("Unable to determine the entry ID");
}

if ( ! $this->trackback->receive())
{
    $this->trackback->send_error("The Trackback did not contain valid data");
}

$data = array(
                'tb_id'      => '',
                'entry_id'   => $this->uri->segment(3),
                'url'        => $this->trackback->data('url'),
                'title'      => $this->trackback->data('title'),
                'excerpt'    => $this->trackback->data('excerpt'),
                'blog_name'  => $this->trackback->data('blog_name'),
                'tb_date'    => time(),
                'ip_address' => $this->input->ip_address()
                );

$sql = $this->db->insert_string('trackbacks', $data);
$this->db->query($sql);

$this->trackback->send_success();

说明:

条目ID号应该出现在你的URL的第三段中。这个的依据是我们之前给出的URI范例:

http://example.com/index.php/trackback/receive/entry_id

注意 entry_id 位于URI的第三段，这样你就可以通过下面这种方式获取到它:

$this->uri->segment(3);

在上面的引用通告接收代码中，如果缺少第三段，我们将发出错误警告。缺少有效的条目ID，也就没有理由继续下去了。

$this->trackback->receive() 函数只是一个简单的验证函数，作用是检查输入的数据以确保其中包含了必需的四部分数据(url, title, excerpt, blog_name)。如果成功则返回 TRUE，失败则返回 FALSE。如果失败，你将看到一条错误信息。

可以使用下面的函数获取输入的引用通告数据:

$this->trackback->data('item')

其中 item 代表这四部分信息中的一部分: url, title, excerpt, 或者 blog_name。

如果引用通告数据被成功地接收，你将可以使用下面的方式获取到一条成功信息:

$this->trackback->send_success();

注意: 上面的代码不包含数据验证，那正是我们鼓励你去添加的。

翻译贡献者: Hex, shnwqshnwq, yinzhili
最后修改: 2009-09-16 12:48:19

上一个主题: Session 类 · 页首 · 用户指南首页 · 下一个主题: 模板解析器类


CodeIgniter 中国首页 › 用户指南首页 › 排版类

排版类

排版类提供帮助你格式化文本的函数。

初始化排版类

和CI中的其他类一样, 排版类也需要在控制器中这样用 $this->load->library 方法初始化:

$this->load->library('typography');

一旦被加载, 排版类的对象就可以这样使用: $this->typography

auto_typography()

格式化文本以便纠正语义和印刷的错误HTML代码。输入一个字符串输出如下的格式化文本：

  • 用一对P标签包住段落（看起来像是用两条线把段落分隔开似的）。
  • 除了出现 <pre> 标签外，所有的单个线的分割被转换为 <br />。
  • 块级别的元素，如<div>标签，没有被段落包装，但是如果他们包含段落的话就会包含文本。
  • 除了出现在标签中的引号外，引号会被转换成正确的实体。
  • 撇号“'”被转换为相应的实体。
  • 双破折号 (像 -- 或--) 被转换成 em—破折号.
  • 三个连续的点也会被转换为省略号…
  • 句子后连续的多个空格将被转换为&nbsp;以便在网页中显示。

Usage example:

$string = $this->typography->auto_typography($string);

参数

有一个可选参数：布尔值 TRUE 或 FALSE决定是否对超过两个的换行进行压缩，减少到两行。

默认不压缩. 也就是说, 如果这个参数不设置, 它将如下工作:

$string = $this->typography->auto_typography($string, FALSE);

提示: 排版格式化可以处理密集数据, 特别是你有很多内容需要格式化处理。如果你选择这个函数处理，你可以考虑缓存你的网页。

format_characters()

This function is similar to the auto_typography function above, except that it only does character conversion:

  • Quotes are converted to correctly facing curly quote entities, except those that appear within tags.
  • Apostrophes are converted to curly apostrophe entities.
  • Double dashes (either like -- this or like--this) are converted to em—dashes.
  • Three consecutive periods either preceding or following a word are converted to ellipsis…
  • Double spaces following sentences are converted to non-breaking spaces to mimic double spacing.

Usage example:

$string = $this->typography->format_characters($string);

nl2br_except_pre()

Converts newlines to <br /> tags unless they appear within <pre> tags. This function is identical to the native PHP nl2br() function, except that it ignores <pre> tags.

Usage example:

$string = $this->typography->nl2br_except_pre($string);

protect_braced_quotes

When using the Typography library in conjunction with the Template Parser library it can often be desirable to protect single and double quotes within curly braces. To enable this, set the protect_braced_quotes class property to TRUE.

Usage example:

$this->load->library('typography');
$this->typography->protect_braced_quotes = TRUE;

翻译贡献者: Hex, icebird, neversaylate, tonera
最后修改: 2009-09-19 18:11:39

上一个主题: 模板解析器 · 页首 · 用户指南首页 · 下一个主题: 单元测试类


CodeIgniter 中国首页 › 用户指南首页 › 单元测试类

单元测试类

单元测试是一种用于测试应用程序中每个函数的软件开发方法。如果你对此概念不熟悉，或许需要google一下相关概念。

CodeIgniter的单元测试类非常简单，由一个评估函数和两个结果函数组成。它没打算成为一个十全的测试集，只提供一个简单的能够评测你的代码是否可以产生正确的数据类型及结果的解决方案。

初始化单元类

和大多数其它的类一样，在CodeIgniter中，单元测试类一样要在控制器中用函数$this->load->library 来初始化:

$this->load->library('unit_test');

测试类一旦加载，单元测试对象可以这样使用：$this->unit

运行测试：

运行一个测试应提供一个测试及期望的结果给以下函数：

$this->unit->run( test, expected result, 'test name' );

此处 test 是你所想测试的代码的执行结果， expected result 则是你所期望的数据类型，而 test name 是一个可选的该测试的名称。例：

$test = 1 + 1;

$expected_result = 2;

$test_name = 'Adds one plus one';

$this->unit->run($test, $expected_result, $test_name);

你所给出的期望结果($expected_result)可以是字面上匹配(literal match)的也可以是数据类型上匹配的。下例为字面匹配(literal match)：

$this->unit->run('Foo', 'Foo');

下例为类型匹配(data type match)：

$this->unit->run('Foo', 'is_string');

注意第二个参数"is_string"的使用，它告诉函数测试你的测试用例把产生的将是一个字符串。下面是合法的类型列表：

  • is_string
  • is_bool
  • is_true
  • is_false
  • is_int
  • is_numeric
  • is_float
  • is_double
  • is_array
  • is_null

生成报告

你可以在每个测试后立刻显示结果，也可以运行若干测试后再产生报告。直接显示一个报告，可以用echo或者返回run函数(的执行结果)：

echo $this->unit->run($test, $expected_result);

显示所有测试的完整的报告，可以这样：

echo $this->unit->report();

报告会以格式化了的HTML表格的形式呈现。如果你更喜欢看原始的数据，可以用下面代码获取一个数组：

echo $this->unit->result();

严格模式

默认情况下，单元测试类评测字面匹配(literal match)时比较宽松，考虑以下例子：

$this->unit->run(1, TRUE);

此测试评测的是一个整数，但是期望结果却是布尔值。不过，由于PHP是弱类型语言，使用正常的相等测试，以上代码返回的将是TRUE：

if (1 == TRUE) echo 'This evaluates as true';

喜欢的话，你可以让单元测试类在严格模式下执行，这样它会同时比较两数据的类型及值：

if (1 === TRUE) echo 'This evaluates as FALSE';

启用严格模式：

$this->unit->use_strict(TRUE);

启用/禁用单元测试

如果你想放一些测试在代码中，而又希望让它只在需要的时候运行，你可以禁用单元测试：

$this->unit->active(FALSE)

创建报告模板

如果你希望测试结果以自定义的格式显示，这里提供一个简单的模板示例。注意必需的伪变量(seudo-variables)：

$str = '
<table border="0" cellpadding="4" cellspacing="1">
    {rows}
        <tr>
        <td>{item}</td>
        <td>{result}</td>
        </tr>
    {/rows}
</table>';

$this->unit->set_template($str);

注意： 你的模板必须在单元测试运行之前声明。

翻译贡献者: Hex, iptton
最后修改: 2009-02-21 23:53:20

上一个主题: 排版类 · 页首 · 用户指南首页 · 下一个主题: URI 类


CodeIgniter 中国首页 › 用户指南首页 › URI 类

URI 类

URI类提供了帮助你分割URI字符串的函数集合。如果你使用URI路由功能，那么你就可以通过分段来重新分发地址栏信息。

注意: URI类会被系统自动初始化，不必手动启用该功能。

$this->uri->segment(n)

它允许你重新分割一个详细的URI分段。 n 为你想要得到的段数。 分割数按照从左至右的顺序编排。 例如，如果你完整的URL的地址如下：

http://example.com/index.php/news/local/metro/crime_is_up

每个URI分段的数字编号为:

  1. news
  2. local
  3. metro
  4. crime_is_up

默认情况下URI没有分段那么该函数返回 FALSE(布尔值)。如果分段信息丢失，Segment函数还有第二个参数用来设置你的默认值。 例如，这样设置后，当发生错误时，函数就会返回数字“0”。

$product_id = $this->uri->segment(3, 0);

如果没有该参数你的代码必须得像下面这样写:

if ($this->uri->segment(3) === FALSE)
{
    $product_id = 0;
}
else
{
    $product_id = $this->uri->segment(3);
}

$this->uri->rsegment(n)

这个函数和上面的函数基本功能一样，不同点在于它允许你在开启CodeIgniter的URI路由功能时进行详细分割并重新分发URI信息

$this->uri->slash_segment(n)

这个函数几乎和$this->uri->segment()一模一样，不过它可以通过第二个参数（" ","leading","both"）给返回的URI参数加上“/”线， 如果不使用该参数，就会在后面增加斜画线。例如：

$this->uri->slash_segment(3);
$this->uri->slash_segment(3, 'leading');
$this->uri->slash_segment(3, 'both');

返回:

  1. segment/
  2. /segment
  3. /segment/

$this->uri->slash_rsegment(n)

这个函数功能同上面的函数，不同点在于它允许你在开启CodeIgniter的URI路由功能时进行详细分割并重新分发URI信息并可以增加斜线“/”。

$this->uri->uri_to_assoc(n)

你可以使用这个函数把每个分段信息以"标识字"=>"具体值"的形式存放在一个联合数组Array()里。 注意这个URI:

index.php/user/search/name/joe/location/UK/gender/male

使用这个函数你可以把URI以如下原型翻转到联合数组中：

[array]
(
    'name' => 'joe'
    'location' => 'UK'
    'gender' => 'male'
)

函数第一个参数可以设置偏移量，默认设置为3，因为一般情况下你的URI包含 控制器名 / 函数名 作为第一个和第二个分段。 例如：

$array = $this->uri->uri_to_assoc(3);

echo $array['name'];

第二个参数可以用来设置"标识字"，这样返回的数组总会包含索引里的标识字，甚至在丢失URI的情况下也是如此。例如：

$default = array('name', 'gender', 'location', 'type', 'sort');

$array = $this->uri->uri_to_assoc(3, $default);

如果URI不包含对应你所给标识字的具体值时，该索引的值会被设置为"FALSE"。

最后，如果相应的具体值找不到给定的标识字时(若URI段数为是一个单数时)具体值也会被设置为"FALSE"(布尔值)

$this->uri->ruri_to_assoc(n)

这个函数和上面的函数基本功能一样，不同点在于它允许你在开启CodeIgniter的URI路由功能时把URI信息分割并翻转到联合数组中去。

$this->uri->assoc_to_uri()

这个函数的功能和uri_to_assoc的功能找相反，它把数组里的信息翻转成URI地址，例如：

$array = array('product' => 'shoes', 'size' => 'large', 'color' => 'red');

$str = $this->uri->assoc_to_uri($array);

// 输出: product/shoes/size/large/color/red

$this->uri->uri_string()

返回一个包含完整URI信息的字符串。例如,假设以下为你的完整URL：

http://example.com/index.php/news/local/345

函数将返回如下字符串:

/news/local/345

$this->uri->ruri_string(n)

这个函数和上面的函数基本功能一样，不同点在于它允许你在开启CodeIgniter的URI路由功能时把URI转换成对应的字符串。

$this->uri->total_segments()

返回总的URI的段数

$this->uri->total_rsegments()

这个函数和上面的函数基本功能一样，不同点在于它允许你在开启CodeIgniter的URI路由功能时返回URI的段数。

$this->uri->segment_array()

返回一个包含URI分段的数组。例如：

$segs = $this->uri->segment_array();

foreach ($segs as $segment)
{
    echo $segment;
    echo '<br />';
}

$this->uri->rsegment_array()

这个函数和上面的函数基本功能一样，不同点在于它允许你在开启 CodeIgniter 的 URI 路由功能时返回 URI 的数组。

翻译贡献者: Hex, lomatus
最后修改: 2009-02-21 23:54:47

上一个主题: 单元测试类 · 页首 · 用户指南首页 · 下一个主题: User-Agent 类


CodeIgniter 中国首页 › 用户指南首页 › User-Agent 类

User-Agent 类

用户代理类提供的功能是，帮助识别是浏览器，还是移动设备或是机器人访问你的站点。另外，你可以得到referrer信息（译注：referrer信息就是访客来源信息，可以参照一般的统计系统来理解），以及语言，和支持的字符集信息。

初始化类

和大多数其他CI类一样，User Agent类也是在你的控制器里使用$this->load->library 方法完成初始化工作

$this->load->library('user_agent');

一旦加载, 对象就可以使用了: $this->agent

用户代理定义

用户代理名称的定义，位于一个配置文件: application/config/user_agents.php. 如果你需要你可以添加项目到user agent数组

示例

当User Agent 类初始化后，它会判断浏览你的网站是Web浏览器，还是移动设备，还是机器人。它还收集相关的操作系统信息

$this->load->library('user_agent');

if ($this->agent->is_browser())
{
    $agent = $this->agent->browser().' '.$this->agent->version();
}
elseif ($this->agent->is_robot())
{
    $agent = $this->agent->robot();
}
elseif ($this->agent->is_mobile())
{
    $agent = $this->agent->mobile();
}
else
{
    $agent = 'Unidentified User Agent';
}

echo $agent;

echo $this->agent->platform(); // Platform info (Windows, Linux, Mac, etc.)

函数参考

$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->referrer()

如果用户代理是从其他站点链接过来的，你可以做如下判断

if ($this->agent->is_referral())
{
    echo $this->agent->referrer();
}

$this->agent->agent_string()

返回一个字符串包含所有用户代理信息。通常它会是这样的:

Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.4) Gecko/20060613 Camino/1.0.2

$this->agent->accept_lang()

让你确认，用户代理是否包含一种特定的语言。例:

if ($this->agent->accept_lang('en'))
{
    echo 'You accept English!';
}

注意: 这一功能通常不是很可靠，因为有些浏览器不提供语言信息，即使提供了，也不一定准确

$this->agent->accept_charset()

让你确认，用户代理是否包含一种特定的字符集。例:

if ($this->agent->accept_charset('utf-8'))
{
    echo 'You browser supports UTF-8!';
}

注意: 这一功能通常不是很可靠，因为有些浏览器不提供字符集信息，或是提供的信息不一定正确

翻译贡献者: Hex, kissmumu
最后修改: 2009-02-21 23:55:54

上一个主题: URI 类 · 页首 · 用户指南首页 · 下一个主题: XML-RPC 类


CodeIgniter 中国首页 › 用户指南首页 › 表单验证

这个类库已经废弃掉了。鼓励使用 form_validation 类库。

表单验证

在解释CodeIgniter的数据验证前，让我们先描述下理想情况：

  1. 显示一个表单；
  2. 你填写文字并点击提交按钮；
  3. 如果你提交的东西是残缺的，又或者漏填了必须填写的项，表单重新显示并包含你提交数据的一条错误信息；
  4. 这个过程继续，直到你提交了正确的信息

在这个过程中，程序必须：

  1. 检查必须的数据。
  2. 校验数据的格式是否正确，是否符合标准(比如，如果提交用户名，那么必须只能包含有效的字符。必须有最小的长度，并且不能超过允许的长度。 用户名不可以与已有用户名重复，或者不能为保留字，等等。 Etc.)
  3. 处理数据使之更安全。
  4. 需要的情况下预格式化数据（数据需要进行剪裁，HTML格式化？等等）。
  5. 准备数据，写入数据库。

尽管上面的过程没有什么复杂的地方，但这通常需要一定数量的代码来提交错误信息，各种控制结构放置在HTML文件里。 创建简单表单验证，代码通常会非常凌乱而效能地下。

CodeIgniter提供了一个全面的解决框架，真正的精简你需要写的代码数量。当然也可以从你的HTML表单中分离出控制结构，使得它成为干净而灵活的代码。

预览

为了能使用CodeIgniter的表单验证功能，你需要做以下三件事情：

  1. 一个包含表单的 视图 文件。
  2. 一个包含提交“成功”信息的视图文件。
  3. 一个控制器函数，用来接受和处理提交的数据。

让我们创建这三个事件，使用注册表单作为样例：

表单页

使用一个文本编辑器，创建一个名叫myform.php的文件。在文中写入如下代码并保存到applications/views/ 文件夹下:

成功页

使用一个文本编辑器，创建一个名叫 formsuccess.php的文件。在文中写入如下代码并保存到applications/views/ 文件夹下:

控制器页

使用一个文本编辑器，创建一个名叫 form.php的文件。在文中写入如下代码并保存到applications/controllers/ 文件夹下:

试一试！

用与下面相似的URL地址测试下你的表单：

example.com/index.php/form/

如果你提交了表单，你会发现表单重载了。那是因为你还没有设置任何验证条件，这就是我们接下来要做的。

说明：

你会注意到一些关于上面页面的事情：

那个 页面 (myform.php) 是一个除了两个例外的标准页面：

  1. 它使用一个表单助手 来创建表单to create the form opening. 从技术上讲，这是没有必要的。你可以用标准的HTML来创建表单。然而，使用这个助手的好处在于： 它为你生成了一个段URL，就是你在CONFIG文件里定义的那个。这使得你的程序在修改时可以更简单和灵活。
  2. 在表单的顶部，你会注意到一下的不同点： <?php echo $this->validation->error_string; ?>

    验证类会使用这个变量返回并显示一些错误信息。如果没有信息将没有返回值。

这个控制器 (form.php) 有一个函数： index(). 这个函数初始化验证类并加载你的视图文件需要使用的 form helper 和 URL helper 。 当然也 运行 验证过程。这取决于验证是否成功，既不显示表单也没有返回成功信息。

如果还没有告诉验证类使之生效的信息，它会一直返回“FALSE”(布尔值 FALSE)作为默认值。如果数据成功地接受你的条件并且它们没有任何错误，那么run() 函数值返回“TRUE”。

设置验证条件

CodeIgniter可以让你设置任意数量的条件来控制给定的范围，循环，甚至同时它可以让你准备并预处理数据。让我们先看看它的用法，我们后面再具体解释。

在你的控制器 (form.php)里, 仅加入下面的初始化函数：

$rules['username'] = "required";
$rules['password'] = "required";
$rules['passconf'] = "required";
$rules['email'] = "required";

$this->validation->set_rules($rules);

你的控制器现在看起来像下面这样：

现在提交空白的表单,你将会看到错误信息。如果你提交的表单包含有完全正确的信息，你将看到你的成功页。

注意： 当表单数据有错误时，它不会被重新填充。当我们讲明验证规则后，马上回来解释它。

改变出错信息的样式

默认情况下，系统会为每个错误提示信息添加一个段落的标识(<p>)。你可以很容易地通过编码去改变这些界定符号，在控制器里写入一下代码:

$this->validation->set_error_delimiters('<div class="error">', '</div>');

在这个例子中，我们将其改成了 div 标签。

顺序编排规则

CodeIgniter可以让你把所有的验证条件有序地串联起来。我们来试一下。把你的验证条件数据改成下面的样子：

$rules['username'] = "required|min_length[5]|max_length[12]";
$rules['password'] = "required|matches[passconf]";
$rules['passconf'] = "required";
$rules['email'] = "required|valid_email";

以上代码要求如下:

  1. username区域要求在5位到12位之间.
  2. password 区域必须和 password confirmation 区域匹配.
  3. Email 区域 必须包含一个合法的Email地址.

尽管尝试下吧!

请注意: 如果你阅读最后的“规则参考”(Rule Reference)，你会发现有很多可用的规则！

准备数据

在验证函数的基础上，你可以使用不同的方法准备好你的数据，例如，你可以建立这样的规则：

$rules['username'] = "trim|required|min_length[5]|max_length[12]|xss_clean";
$rules['password'] = "trim|required|matches[passconf]|md5";
$rules['passconf'] = "trim|required";
$rules['email'] = "trim|required|valid_email";

上面的例子中，我们“修剪”内容，转换密码区域为 MD5 编码，通过“XSS_CLEAN”函数检测用户名，移除危险的数据。

默认的PHP函数能为一个规则使用一个参数，像 htmlspecialchars, trim, MD5, 等等.

Note: You will generally want to use the prepping functions after the validation rules so if there is an error, the original data will be shown in the form.

回调函数：你自己的验证函数

验证系统支持回调你自己的验证函数. 这允许你通过扩展验证类来适应自己的需要. 例如, 如果你需要执行一个数据库查询来查看用户是否选择了唯一的用户名，你可以通过创建一个回调函数来做这件事. 让我们创建一个简单的例子.

在你的控制器中将username规则改为:

$rules['username'] = "callback_username_check";

然后在你的控制器中添加一个新的函数叫做 username_check . 你的控制器看起来应该像下面的例子:

重新载入表单并以"test"做为用户名提交. 你可以看到表单中的数据已经发送到你的回调函数中处理.

要想回调一个函数只需在你定义的函数名前加上一个"callback_"前缀即可.

错误消息可以使用 $this->validation->set_message 函数来设置. 请牢记消息键（第一个参数）必须与您的函数名相匹配.

注意: 你可以在任何规则中使用你自定义的错误消息, 只需设置类似的消息. 例如,为"required"规则改变消息你可以这样做:

$this->validation->set_message('required', 'Your custom message here');

填充表单

我们花了不少时间处理错误。现在是讨论使用数据重新填充表单的时候了。这里的做法和你的验证规则类似。在你的验证规则下面加入如下代码：

$fields['username'] = 'Username';
$fields['password'] = 'Password';
$fields['passconf'] = 'Password Confirmation';
$fields['email'] = 'Email Address';

$this->validation->set_fields($fields);

数组的关键字实际上是表单域的名字，对应的值是你想要在错误信息中显示的全名。

现在你控制器中的index函数看起来应该像这样：

现在打开你的视图文件myform.php，根据每个表单域的名字更新它们的值。

现在重新加载你的页面，提交表单并触发一个错误。你的表单将会被重新填充而且错误信息也会包含更多相关的表单域的名字。

单独显示错误

如果你想要在每个表单域旁显示错误，而不是显示一个错误列表，你可以像这样修改你的表单：

如果没有错误，不会显示任何东西。如果有错误发生，消息将会使用你设置的分割标记显示(<p> 标记是默认值)。

Note: 要这样显示错误信息，你必须之前使用$this->validation->set_fields 函数描述。错误将会被转换成表单域名加"_error"后缀的变量。例如，你的用户名错误的值可以这样访问：
$this->validation->username_error.

规则参考

下面是可用的原生规则列表：

Rule | Parameter | Description | Example
required | No | Returns FALSE if the form element is empty. |
matches | Yes | Returns FALSE if the form element does not match the one in the parameter. | matches[form_item]
min_length | Yes | Returns FALSE if the form element is shorter then the parameter value. | min_length[6]
max_length | Yes | Returns FALSE if the form element is longer then the parameter value. | max_length[12]
exact_length | Yes | Returns FALSE if the form element is not exactly the parameter value. | exact_length[8]
alpha | No | Returns FALSE if the form element contains anything other than alphabetical characters. |
alpha_numeric | No | Returns FALSE if the form element contains anything other than alpha-numeric characters. |
alpha_dash | No | Returns FALSE if the form element contains anything other than alpha-numeric characters, underscores or dashes. |
numeric | No | Returns FALSE if the form element contains anything other than numeric characters. |
integer | No | Returns FALSE if the form element contains anything other than an integer. |
valid_email | No | Returns FALSE if the form element does not contain a valid email address. |
is_natural | No | 如果为非整数(自然数) 则 Returns FALSE (注意 CI 1.7x版 新增, CI 1.6x不能使用该验证规则) |
is_natural_no_zero | No | 如果为非正整数(自然数) 则 Returns FALSE (注意 CI 1.7x版 新增, CI 1.6x不能使用该验证规则) |
valid_ip | No | Returns FALSE if the supplied IP is not valid. |
valid_base64 | No | Returns FALSE if the supplied string contains anything other than valid Base64 characters. |

Note: 这些规则也可以像独立的函数一样被调用。例如：

$this->validation->required($string);

Note: 你也可以使用接受一个参数的PHP原生函数。

Prepping Reference

下面是所有可用的预处理函数列表

Name | Parameter | Description
xss_clean | No | Runs the data through the XSS filtering function, described in the Input Class page.
prep_for_form | No | Converts special characters so that HTML data can be shown in a form field without breaking it.
prep_url | No | Adds "http://" to URLs if missing.
strip_image_tags | No | Strips the HTML from image tags leaving the raw URL.
encode_php_tags | No | Converts PHP tags to entities.

Note: 你也可以,使用接收一个参数的PHP原生函数，例如trim, htmlspecialchars, urldecode，等等。

设置自定义错误信息

所有的原生错误信息防止在下面的语言文件中：language/english/validation_lang.php

你可以编辑这个文件，或使用如下函数设置你自己的信息。

$this->validation->set_message('rule', 'Error Message');

rule是特定规则的名字，Error Message是你想要显示的信息。

处理选择菜单，单选按钮，和复选框

如果你使用了选择菜单，单选按钮，和复选框，你会想在出错时保持原先的选择。验证类有三个函数帮助你完成这些：

set_select()

允许你显示和提交时状态一致的菜单项。第一个参数是选择菜单的名字，第二个参数必须包含每个选项的值。例如：

<select name="myselect">
<option value="one" <?php echo $this->validation->set_select('myselect', 'one'); ?> >One</option>
<option value="two" <?php echo $this->validation->set_select('myselect', 'two'); ?> >Two</option>
<option value="three" <?php echo $this->validation->set_select('myselect', 'three'); ?> >Three</option>
</select>

set_checkbox()

允许你显示和提交时状态一致的复选框。第一个参数是复选框的名字，第二个参数必须包含它的值，例如：

<input type="checkbox" name="mycheck" value="1" <?php echo $this->validation->set_checkbox('mycheck', '1'); ?> />

set_radio()

允许你显示和提交时状态一致的单选按钮。第一个参数是单选按钮的名字，第二个参数必须包含它的值：例如：

<input type="radio" name="myradio" value="1" <?php echo $this->validation->set_radio('myradio', '1'); ?> />

翻译贡献者: Hex, lishen2, lomatus, shnwqshnwq, tanqimin, wjm7301, yz20sui
最后修改: 2009-09-12 15:36:46

上一个主题: User-Agent 类 · 页首 · 用户指南首页 · 下一个主题: XML-RPC 类


CodeIgniter 中国首页 › 用户指南首页 › XML-RPC 和 XML-RPC 服务器类

XML-RPC 和 XML-RPC 服务器类

CodeIgniter 的 XML-RPC 类允许你发送请求到另一个服务器, 或者建立一个你自己的XML-RPC服务器来接受请求.

什么是XML-RPC?

这是一个非常简单的两台计算机使用XML通过互联网进行通信的方法. 一台计算机 , 我们称之为 客户端 , 发送一个XML-RPC 请求 给另外一台计算机 , 我们称之为 服务器. 当服务器收到请求并加以处理,然后将 结果 返回给客户端.

例如,使用 MetaWeblog 的 API(应用程序接口) , 一个XML-RPC客户端(通常是桌面发布工具)会发送一个请求到运行在你网站的XML-RPC服务端. 这个请求有可能是要发布一篇新的网志,或者是要修改已存在的网志. 当XML-RPC服务器接收到请求,将检验请求并且决定调用何种类/方法来处理请求.一旦处理完毕,服务器将返回一个响应信息.

如果要查看更详细的规范,你可以浏览 XML-RPC 网站.

初始化类

像CodeIgniter的大多数类一样, XML-RPC 和 XML-RPCS 类 在你的控制器中调用 $this->load->library 方法来进行初始化:

使用以下代码载入XML-RPC类库:

$this->load->library('xmlrpc');

一旦XML-RPC类被载入, XML-RPC 库的对象就可以使用了: $this->xmlrpc

使用下面的方法载入 XML-RPC 服务器类：

$this->load->library('xmlrpc');
$this->load->library('xmlrpcs');

一旦加入，可以通过　$this->xmlrpcs　使用 xml-rpcs　库对象: $this->xmlrpcs

注意: 使用 XML-RPC 服务器，必须同时载入 XML-RPC 类和 XML-RPC 服务器类。

发送 XML-RPC 请求

发送一个请求到 XML-RPC 服务器，需指定如下信息：

  • 服务器的 URL
  • 你要调用的服务器上的方法。
  • The 请求 数据 (说明见下面).

下面是一个简单的例子，它发送一个简单的 Weblogs.com ping 到Ping-o-Matic

$this->load->library('xmlrpc');

$this->xmlrpc->server('http://rpc.pingomatic.com/', 80);
$this->xmlrpc->method('weblogUpdates.ping');

$request = array('My Photoblog', 'http://www.my-site.com/photoblog/');
$this->xmlrpc->request($request);

if ( ! $this->xmlrpc->send_request())
{
    echo $this->xmlrpc->display_error();
}

说明

以上代码初始化XML-RPC类，设置了服务器的URL和要调用的方法（weblogUpdates.ping). 请求（在此例中为你网站的标题和URL）被放在一个数组中使用 request() 函数传输、编译。最后，整个请求发出，如果send_request()方法返回 false，我们将显示XML-RPC 服务器发回的错误信息。

请求剖析

一个 XML-RPC 请求只是你发送到 XML-RPC 服务器的数据。请求中的每个数据片断也被称为请求参数。在上面的示例中，有两个参数：你网站的URL和标题。当 XML-RPC 服务器接到你的请求，服务器会寻找请求参数。

请求参数必须放在数组中传输，每个参数可以是七种数据类型中的任一种（字符串，数字，日期，等等）。如果你的参数是字符串外的其它类型，则必须在请求数组中包含数据类型。

下面是一个包含三个参数的简单数组示例:

$request = array('John', 'Doe', 'www.some-site.com');
$this->xmlrpc->request($request);

如果你使用除字符串以外的其它类型，或有几种不同的数据类型，你需要将每个参数单独放到一个数组中，并在数组第二个位置给出数据类型。

$request = array (
                   array('John', 'string'),
                   array('Doe', 'string'),
                   array(FALSE, 'boolean'),
                   array(12345, 'int')
                 );
$this->xmlrpc->request($request); 数据类型 中包括完成的数据类型列表。

创建 XML-RPC 服务器

XML-RPC 服务扮演着交通警察的角色，等待进入的请求，并将它们转到恰当的函数进行处理。

To create your own XML-RPC server involves initializing the XML-RPC Server class in your controller where you expect the incoming request to appear, then setting up an array with mapping instructions so that incoming requests can be sent to the appropriate class and method for processing.

Here is an example to illustrate:

$this->load->library('xmlrpc');
$this->load->library('xmlrpcs');

$config['functions']['new_post'] = array('function' => 'My_blog.new_entry'),
$config['functions']['update_post'] = array('function' => 'My_blog.update_entry');
$config['object'] = $this;

$this->xmlrpcs->initialize($config);
$this->xmlrpcs->serve();

The above example contains an array specifying two method requests that the Server allows. The allowed methods are on the left side of the array. When either of those are received, they will be mapped to the class and method on the right.

The 'object' key is a special key that you pass an instantiated class object with, which is necessary when the method you are mapping to is not part of the CodeIgniter super object.

In other words, if an XML-RPC Client sends a request for the new_post method, your server will load the My_blog class and call the new_entry function. If the request is for the update_post method, your server will load the My_blog class and call the update_entry function.

The function names in the above example are arbitrary. You'll decide what they should be called on your server, or if you are using standardized APIs, like the Blogger or MetaWeblog API, you'll use their function names.

Processing Server Requests

When the XML-RPC Server receives a request and loads the class/method for processing, it will pass an object to that method containing the data sent by the client.

Using the above example, if the new_post method is requested, the server will expect a class to exist with this prototype:

class My_blog extends Controller {

    function new_post($request)
    {

    }
}

The $request variable is an object compiled by the Server, which contains the data sent by the XML-RPC Client. Using this object you will have access to the request parameters enabling you to process the request. When you are done you will send a Response back to the Client.

Below is a real-world example, using the Blogger API. One of the methods in the Blogger API is getUserInfo(). Using this method, an XML-RPC Client can send the Server a username and password, in return the Server sends back information about that particular user (nickname, user ID, email address, etc.). Here is how the processing function might look:

class My_blog extends Controller {

    function getUserInfo($request)
    {
        $username = 'smitty';
        $password = 'secretsmittypass';

        $this->load->library('xmlrpc');

        $parameters = $request->output_parameters();

        if ($parameters['1'] != $username AND $parameters['2'] != $password)
        {
            return $this->xmlrpc->send_error_message('100', 'Invalid Access');
        }

        $response = array(array('nickname'  => array('Smitty','string'),
                                'userid'    => array('99','string'),
                                'url'       => array('http://yoursite.com','string'),
                                'email'     => array('jsmith@yoursite.com','string'),
                                'lastname'  => array('Smith','string'),
                                'firstname' => array('John','string')
                                ),
                         'struct');

        return $this->xmlrpc->send_response($response);
    }
}

Notes:

The output_parameters() function retrieves an indexed array corresponding to the request parameters sent by the client. In the above example, the output parameters will be the username and password.

If the username and password sent by the client were not valid, and error message is returned using send_error_message().

If the operation was successful, the client will be sent back a response array containing the user's info.

Formatting a Response

Similar to Requests, Responses must be formatted as an array. However, unlike requests, a response is an array that contains a single item. This item can be an array with several additional arrays, but there can be only one primary array index. In other words, the basic prototype is this:

$response = array('Response data', 'array');

Responses, however, usually contain multiple pieces of information. In order to accomplish this we must put the response into its own array so that the primary array continues to contain a single piece of data. Here's an example showing how this might be accomplished:

$response = array (
                   array(
                         'first_name' => array('John', 'string'),
                         'last_name' => array('Doe', 'string'),
                         'member_id' => array(123435, 'int'),
                         'todo_list' => array(array('clean house', 'call mom', 'water plants'), 'array'),
                        ),
                 'struct'
                 );

Notice that the above array is formatted as a struct. This is the most common data type for responses.

As with Requests, a response can be one of the seven data types listed in the Data Types section.

Sending an Error Response

If you need to send the client an error response you will use the following:

return $this->xmlrpc->send_error_message('123', 'Requested data not available');

The first parameter is the error number while the second parameter is the error message.

Creating Your Own Client and Server

To help you understand everything we've covered thus far, let's create a couple controllers that act as XML-RPC Client and Server. You'll use the Client to send a request to the Server and receive a response.

The Client

Using a text editor, create a controller called xmlrpc_client.php. In it, place this code and save it to your applications/controllers/ folder:

Note: In the above code we are using a "url helper". You can find more information in the Helpers Functions page.

The Server

Using a text editor, create a controller called xmlrpc_server.php. In it, place this code and save it to your applications/controllers/ folder:

Try it!

Now visit the your site using a URL similar to this:

example.com/index.php/xmlrpc_client/

You should now see the message you sent to the server, and its response back to you.

The client you created sends a message ("How's is going?") to the server, along with a request for the "Greetings" method. The Server receives the request and maps it to the "process" function, where a response is sent back.

Using Associative Arrays In a Request Parameter

If you wish to use an associative array in your method parameters you will need to use a struct datatype:

$request = array(
                 array(
                       // Param 0
                       array(
                             'name'=>'John'
                             ),
                             'struct'
                       ),
                       array(
                             // Param 1
                             array(
                                   'size'=>'large',
                                   'shape'=>'round'
                                   ),
                             'struct'
                       )
                 );
$this->xmlrpc->request($request);

You can retrieve the associative array when processing the request in the Server.

$parameters = $request->output_parameters();
$name = $parameters['0']['name'];
$size = $parameters['1']['size'];
$size = $parameters['1']['shape'];

XML-RPC Function Reference

$this->xmlrpc->server()

Sets the URL and port number of the server to which a request is to be sent:

$this->xmlrpc->server('http://www.sometimes.com/pings.php', 80);

$this->xmlrpc->timeout()

Set a time out period (in seconds) after which the request will be canceled:

$this->xmlrpc->timeout(6);

$this->xmlrpc->method()

Sets the method that will be requested from the XML-RPC server:

$this->xmlrpc->method('method');

Where method is the name of the method.

$this->xmlrpc->request()

Takes an array of data and builds request to be sent to XML-RPC server:

$request = array(array('My Photoblog', 'string'), 'http://www.yoursite.com/photoblog/');
$this->xmlrpc->request($request);

$this->xmlrpc->send_request()

The request sending function. Returns boolean TRUE or FALSE based on success for failure, enabling it to be used conditionally.

$this->xmlrpc->set_debug(TRUE);

Enables debugging, which will display a variety of information and error data helpful during development.

$this->xmlrpc->display_error()

Returns an error message as a string if your request failed for some reason.

echo $this->xmlrpc->display_error();

$this->xmlrpc->display_response()

Returns the response from the remote server once request is received. The response will typically be an associative array.

$this->xmlrpc->display_response();

$this->xmlrpc->send_error_message()

This function lets you send an error message from your server to the client. First parameter is the error number while the second parameter is the error message.

return $this->xmlrpc->send_error_message('123', 'Requested data not available');

$this->xmlrpc->send_response()

Lets you send the response from your server to the client. An array of valid data values must be sent with this method.

$response = array(
                 array(
                        'flerror' => array(FALSE, 'boolean'),
                        'message' => "Thanks for the ping!")
                     )
                 'struct');
return $this->xmlrpc->send_response($response);

数据类型

According to the XML-RPC spec there are seven types of values that you can send via XML-RPC:

  • int or i4
  • boolean
  • string
  • double
  • dateTime.iso8601
  • base64
  • struct (contains array of values)
  • array (contains array of values)

翻译贡献者: Hex, ianyang, sydcurie, wanglinqiang
最后修改: 2009-09-20 01:04:14

上一个主题: User-Agent 类 · 页首 · 用户指南首页 · 下一个主题: Zip 编码类


CodeIgniter 中国首页 › 用户指南首页 › Zip 编码类

Zip 编码类

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

初始化

与其他CodeIgniter里的类一样，ZIP类在控制器里完成初始化工作，函数：$this->load->library

$this->load->library('zip');

一旦加载，ZIP库对象可以用$this->zip来使用

使用样例

这个例子演示了如何压缩一个文件并保存到你服务器一个文件夹，然后下载到你的桌面上。

$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');

函数参考

$this->zip->add_data()

添加数据进zip文件里. 第一个参数是文件名, 第二个参数是你要添加的数据的字符串格式:

$name = 'my_bio.txt';
$data = 'I was born in an elevator...';

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

允许你多次调用这个函数按顺序的添加若干个文件到你的存档。例子：

$name = 'mydata1.txt';
$data = 'A Data String!';
$this->zip->add_data($name, $data);

$name = 'mydata2.txt';
$data = 'Another Data String!';
$this->zip->add_data($name, $data);

或者你可以使用一个数组来传递多个文件（的值）：

$data = array(
                'mydata1.txt' => 'A Data String!',
                'mydata2.txt' => 'Another Data String!'
            );

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

$this->zip->download('my_backup.zip');

如果你希望将压缩后的数据放入子文件夹内，请把路径作为文件名的一部分包含进去:

$name = 'personal/my_bio.txt';
$data = 'I was born in an elevator...';

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

上面的例子将放置 my_bio.txt 到一个叫personal的文件夹内。

$this->zip->add_dir()

允许你添加一个目录。通常这个函数是不必要的，因为当你使用$this->zip->add_data(), 可以把你的数据放进目录里，但是如果你想要创建一个空目录的话你也可以这样做。例子：

$this->zip->add_dir('myfolder'); // Creates a folder called "myfolder"

$this->zip->read_file()

允许你压缩一个服务器某处存在的文件。提供一个文件路径，zip类将读取它并添加到存档：

$path = '/path/to/photo.jpg';

$this->zip->read_file($path);

// Download the file to your desktop. Name it "my_backup.zip"
$this->zip->download('my_backup.zip');

如果你想压缩文档保持原来文件的目录结构，可以把第二个参数设置为 TRUE （布尔值）。例子：

$path = '/path/to/photo.jpg';

$this->zip->read_file($path, TRUE);

// Download the file to your desktop. Name it "my_backup.zip"
$this->zip->download('my_backup.zip');

在上边的例子中，photo.jpg将被放到两层文件夹中：path/to/

$this->zip->read_dir()

允许你压缩一个服务器某处存在的文件夹（以及它里面的文件和子文件夹）。提供一个文件夹路径，zip类将递归读取它并重新创建添加到存档。 你所提供的路径下面的所有文件都会被压缩进来，也包括所有子文件夹。例如:

$path = '/path/to/your/directory/';

$this->zip->read_dir($path);

// 将文件下载到你的桌面上，命名为 "my_backup.zip"
$this->zip->download('my_backup.zip');

$this->zip->archive()

将Zip压缩文件写入服务器的一个目录下。请提交一个有效的服务器路径，以文件名作为结尾，并确保那个目录是可写的(权限为666或者777都可以)。例如:

$this->zip->archive('/path/to/folder/myarchive.zip'); // 创建一个名为 myarchive.zip 的文件

$this->zip->download()

本函数将使用户从你的服务器上下载一个Zip文件。你必须把你想要使用的文件名作为参数传递给函数。例如:

$this->zip->download('latest_stuff.zip'); // 文件将被命名为"latest_stuff.zip"

说明: 在调用本函数的控制器中不要显示任何数据，因为本函数将发送多个服务器header，从而使文件以二进制的形式被下载。

$this->zip->get_zip()

返回经过Zip压缩后的文件数据。通常情况下你不需要用到本函数，除非你想对数据做特殊处理。例如:

$name = 'my_bio.txt';
$data = 'I was born in an elevator...';

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

$zip_file = $this->zip->get_zip();

$this->zip->clear_data()

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

$name = 'my_bio.txt';
$data = 'I was born in an elevator...';

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

$this->zip->clear_data();

$name = 'photo.jpg';
$this->zip->read_file("/path/to/photo.jpg"); // 读取文件内容

$this->zip->download('myphotos.zip');

翻译贡献者: architectcom, Hex, lomatus, skey, yinzhili, yygcom
最后修改: 2009-08-18 17:30:44

上一个主题: XML-RPC 类 · 页首 · 用户指南首页 · 下一个主题: 数组辅助函数


404 Not Found

Not Found

The requested URL /js/hacks.txt was not found on this server.