CodeIgniter 用户指南 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 用户指南 版本 2.2.0

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

欢迎使用 CodeIgniter

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

CodeIgniter 是为谁准备的？

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

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

翻译贡献者: Hex
最后修改: 2012-02-06 01:20:20

页首

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

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


目录 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

目录

基本信息

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

安装

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

介绍

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

教程

  • 内容提要
  • 加载静态内容
  • 读取新闻条目
  • 创建新闻条目
  • 结束语

常规主题

  • CodeIgniter URL
  • 控制器
  • 保留字
  • 视图
  • 模型
  • 辅助函数
  • 使用 CodeIgniter 类库
  • 创建你自己的类库
  • 使用 CodeIgniter 适配器
  • 创建适配器
  • 创建核心类
  • 钩子 - 扩展核心
  • 自动装载资源
  • 公共函数
  • URI 路由
  • 错误处理
  • 缓存
  • 调试应用程序
  • 以 CLI 方式运行
  • 管理应用程序
  • 处理多环境
  • PHP 替代语法
  • 安全
  • 开发规范

附加资源

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

类库参考

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

适配器参考

  • 缓存类
  • 数据库类
  • Javascript 类

辅助函数参考

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

翻译贡献者: Hex
最后修改: 2012-05-09 11:06:01

页首


服务器要求 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

服务器要求

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

翻译贡献者: asimon, elevenliu, Hex, nameleq, wuzeaibaozi
最后修改: 2014-07-20 17:41:04

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


许可协议 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 许可协议

CodeIgniter 许可协议

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

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

允许使用

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

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

赔偿

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

无担保声明

该软件仅以实际效果为准，不做任何明示或暗示的保证，包括但不限于保证的质量，性能，不侵权，适销性或适用于特定用途。

责任限制

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

翻译贡献者: Hex, shamiao, xtsai
最后修改: 2014-06-10 14:13:20

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


变更记录 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

变更记录

带 Reactor Marker 标识的为社区贡献。

版本 2.2.0

发版日期: 2014年6月5日

  • 一般性更改
    • 安全: xor_encode() 方法从加密类中移除。加密类现在必须安装Mcrypt扩展。
    • 安全: Session 类 使用HMAC认证来代替简单的MD5校验和.

      HMAC参考:http://en.wikipedia.org/wiki/Hash-based_message_authentication_code

2.2.0 修正缺陷:

  • 修复了 - (#2583) - Suhosin会导致邮件类在header尾部加入了新的条目而阻止通过mail()方法发送邮件的特殊情况。
  • 修复了 - (#696) - make oci_execute() calls inside num_rows() non-committing, since they are only there to reset which row is next in line for oci_fetch calls and thus don't need to be committed.
  • 修复了 - (#2689) - 数据库维护类 中的 create_table(), drop_table() 以及 rename_table() 等方法会在'sqlsrv'驱动中产生有问题的SQL语句。
  • 修复了 - (#2427) - 数据库类中的PDO驱动没有检查是否查询失败的问题。
  • 修复了 Session 类中没经过加密的cookies验证的问题。

版本 2.1.4

发布日期：2013年7月8日

  • General Changes
    • Improved security in xss_clean().

Bug fixes for 2.1.4:

  • Fixed a bug (#1936) - Migrations Library method latest() had a typo when retrieving language values.
  • Fixed a bug (#2021) - Migrations Library configuration file was mistakenly using Windows style line feeds.
  • Fixed a bug (#1273) - Active Record method set_update_batch() was using the incorrect variables and would cause an error.
  • Fixed a bug (#2337) - Email Library method print_debugger() was not using htmlspecialchars() when being shown in the browser.

版本 2.1.3

发布日期: 2012年10月8日

2.1.3的缺陷修复

  • 修正了一个错误 (#1543) - 基于文件的缓存 中 get_metadata()方法使用不存在的数组键名寻找TTL(生存时间)值
  • 修正了一个错误 (#1314) - Session类 中的 sess_destroy() 方法无法销毁userdata数组.
  • 修正了一个错误 如果Session数据包含对象，那么Profiler类会释出E_WARNING错误
  • 修正了一个错误 (#1699) - Migration类会忽略$config['migration_path']设置.
  • 修正了一个错误 (#227) - 输入类无条件允许通过HTTP_CLIENT_IP头，使之进行IP地址欺骗
  • 修正了一个错误 (#907) - 输入类检查代理类型时会忽略HTTP_X_CLUSTER_CLIENT_IP和HTTP_X_CLIENT_IP头.
  • 修正了一个错误 (#940) - 当处理POST请求没有实际数据时，csrf_verify()仍然去设置CSRF cookie，应该使该验证请求视为无效。
  • 修正了一个错误 即使$config['csrf_protection']已经设置为FALSE,但在安全类中的CSRF cookie仍然会被创建.
  • 修正了一个错误 (#1715) - CLI向输入库发出请求触发csrf_verify().

版本 2.1.2

发布日期: 2012年6月29日

  • 总体变化
    • 增加XSS_clean()安全性

版本 2.1.1

发布日期: 2012年6月12日

  • 总体变化
    • 修正mimes.php中对docx,xlsx文件的支持
  • 类库
    • 进一步提升在文件上传类中的MIME类型检测
    • 在输入类增加对IPv6的支持
    • 在表单验证类中增加对IP格式参数验证的支持。
  • 辅助函数
    • 提高url_title()的性能和输出，可以使用任何字符串作为单词分隔符，并向后兼容“破折号”或“下划线”作为单词分隔符。

2.1.1的缺陷修复

  • 修复了上传类在检查MIME类型时，错误的使用数组KEY的问题。 (#697)
  • 修复了form_open()所使用的$action是针对site_url()而不是base_url()的问题。
  • 修复了CI_Upload::_file_mime_type() 如果它用来检测mime_content_type()可能返回FALSE的问题。
  • 修复了使用图像处理类来创建一个新的文件，Windows路径会被忽略的问题。(#538)
  • 修复了当开启数据库缓存，使用$this->db->query()检查缓存的结果不被获取的问题。
  • 修复了CSRF的cookie值允许任何（非空）字符串被写入到输出之前，使代码存在注入风险
  • 修复了PDO将’dbname’作为连接字符串参数的时候，其不顾及数据库是否在使用中就进行连接的行为所造成SQLITE无法使用的问题(#726)
  • 修复了CI_DB_pdo_result::num_rows()返回不正确的SELECT查询值，因它使用PDOStatement::rowCount().
  • 修复了CI_Image_lib::clear()不正确地清除所有必要的对象属性，包括宽度和高度(#1059)

Version 2.1.0

Release Date: November 14, 2011

  • General Changes
    • Fixed a potential parameter injection flaw in the Security Library and strengthened the XSS filter for HTML5 vulnerabilites.
    • Callback validation rules can now accept parameters like any other validation rule.
    • Added html_escape() to the Common functions to escape HTML output for preventing XSS easliy.
  • Helpers
    • Added increment_string() to String Helper to turn "foo" into "foo-1" or "foo-1" into "foo-2".
    • Altered form helper - made action on form_open_multipart helper function call optional. Fixes (#65)
    • url_title() will now trim extra dashes from beginning and end.
    • Improved speed of String Helper's random_string() method
  • Database
    • Added a CUBRID driver to the Database driver. Thanks to the CUBRID team for supplying this patch.
    • Added a PDO driver to the Database driver.
    • Typecast limit and offset in the Database driver to integers to avoid possible injection.
    • Added additional option 'none' for the optional third argument for $this->db->like() in the Database driver.
    • Added $this->db->insert_batch() support to the OCI8 (Oracle) driver.
  • Libraries
    • Changed $this->cart->insert() in the Cart library to return the Row ID if a single item was inserted successfully.
    • Added support to set an optional parameter in your callback rules of validation using the Form Validation library.
    • Added a Migration library to assist with applying incremental updates to your database schema.
    • Driver children can be located in any package path.
    • Added is_unique to the Form Validation library.
    • Added $config['use_page_numbers'] to the Pagination library, which enables real page numbers in the URI.
    • Added TLS and SSL Encryption for SMTP.
  • Core
    • Changed private functions in URI library to protected so MY_URI can override them.
    • Removed CI_CORE boolean constant from CodeIgniter.php (there are no longer different Reactor and Core versions).

Bug fixes for 2.1.0

  • Fixed #378 Robots identified as regular browsers by the User Agent class.
  • If a config class was loaded first then a library with the same name is loaded, the config would be ignored.
  • Fixed a bug (Reactor #19) where 1) the 404_override route was being ignored in some cases, and 2) auto-loaded libraries were not available to the 404_override controller when a controller existed but the requested method did not.
  • Fixed a bug (Reactor #89) where MySQL export would fail if the table had hyphens or other non alphanumeric/underscore characters.
  • Fixed a bug (#200) where MySQL queries would be malformed after calling $this->db->count_all() then $this->db->get()
  • Fixed bug #105 that stopped query errors from being logged unless database debugging was enabled
  • Fixed a bug (#160) - Removed unneeded array copy in the file cache driver.
  • Fixed a bug (#150) - field_data() now correctly returns column length.
  • Fixed a bug (#8) - load_class() now looks for core classes in APPPATH first, allowing them to be replaced.
  • Fixed a bug (#24) - ODBC database driver called incorrect parent in __construct().
  • Fixed a bug (#85) - OCI8 (Oracle) database escape_str() function did not escape correct.
  • Fixed a bug (#344) - Using schema found in Saving Session Data to a Database, system would throw error "user_data does not have a default value" when deleting then creating a session.
  • Fixed a bug (#112) - OCI8 (Oracle) driver didn't pass the configured database character set when connecting.
  • Fixed a bug (#182) - OCI8 (Oracle) driver used to re-execute the statement whenever num_rows() is called.
  • Fixed a bug (#82) - WHERE clause field names in the DB update_string() method were not escaped, resulting in failed queries in some cases.
  • Fixed a bug (#89) - Fix a variable type mismatch in DB display_error() where an array is expected, but a string could be set instead.
  • Fixed a bug (#467) - Suppress warnings generated from get_magic_quotes_gpc() (deprecated in PHP 5.4)
  • Fixed a bug (#484) - First time _csrf_set_hash() is called, hash is never set to the cookie (in Security.php).
  • Fixed a bug (#60) - Added _file_mime_type() method to the File Uploading Library in order to fix a possible MIME-type injection (also fixes bug #394).
  • Fixed a bug (#537) - Support for all wav type in browser.
  • Fixed a bug (#576) - Using ini_get() function to detect if apc is enabled or not.
  • Fixed invalid date time format in Date helper and XMLRPC library.

版本号 2.0.3

发布时间: 2011年8月20号
Hg标签: v2.0.3

  • 安全方面
    • 改进了MySQL和MySQLi的驱动以防止通过在数据库连接时使用多字节的字符集来进行SQL注入。

      • 在PHP版本低于5.2.3和MySQL版本低于5.0.7环境下使用mysql_set_charset()方法的不兼容将会导致一种危险状况，在此环境下使用多字节字符集可能会暴露出SQL注入攻击的漏洞。Latin-1，UTF-8，和其他“低ASCII”字符集在所有环境下使用都是没问题的。

      如果你在为你的数据库连接使用或者考虑使用多字符集的话，请密切关注你部署的服务器环境，以确保服务器的安全。

  • 总体变化
    • 修复了在index.php中一个注释的拼写错误。
    • 将Session类的用户数据添加到了output分析器中。并在HTTP消息头，Session数据和配置参数中增加了一个切换显示和隐藏状态的开关。
    • 移除内部使用的EXT常量。
    • 更新了welcome_message视图和default error模版文件. 感谢danijelb 所提供的建议。
    • 为PostgreSQL数据库驱动增加了insert_batch()方法。感谢epallerols所提供的建议。
    • 为mimes.php.增加"application/x-csv"。
    • 修复了一个 Email库的bug（当Email名字上附带“.”的时候将使用无效的MIME类型）。
  • 辅助函数的变化
    • 为heading()方法增加了一个可选的第三个参数，这个参数将允许为渲染标题标签增加html属性。
  • 类库变化
    • 修改了Session类来使用一个更长的与用户代理字符串的匹配。如果使用数据库sessions请查看更新日志。
    • 为数据库驱动增加了$this->db->set_dbprefix()方法。
    • 改变了Cart库中的$this->cart->insert()方法，如果只有一个数据被成功插入，这个方法将返回插入行的id。
    • 为Loader库增加了$this->load->get_var()方法，这个方法将检索通过$this->load->view()和$this->load->vars()方法所设置的全局变量是否存在。
    • 修改了$this->db->having()方法，插入引号将使用escape()方法而不是escape_str()方法。

2.0.3的Bug修复

  • 增加ENVIRONMENT为保留字(Reactor #196)
  • 修改服务器检查以确保SCRIPT_NAME被定义(Reactor #57)
  • 从autoloader包里移除APPPATH.'third_party'，从而取消了不必要的文件属性（在不存在包或者开发者默认没有加载任何包情况下）
  • 修复了(Reactor #231)Session库中的数据库表SQL示例不包含最近一次更改索引的bug，详情请见更新日志.
  • 修复了(Reactor #229)Sessions库文档SQL示例中的错误语句。
  • 修复了(Core #340)当向$this->db->select()传第二个参数时,在之后的查询中列名称可能不会正确去除的bug。
  • 修复了一个问题#199 -当作字符串传递的属性在开始标记和它自己之间不包含空格 。
  • 修复了Cart库中的$this->cart->total_items()方法，现在它将返回cart中所有条目的总数量而不是你自己的总数。
  • 修复了当为mysql和mysqli驱动的db_forge增加字段时不设置为“null”的bug，现在将把字段默认设置为Null。
  • 修复了当使用 $this->db->select_max(), $this->db->select_min()等方法时可能抛出的提示，感谢w431的修补。
  • 用php_sapi_name() == 'cli'替换了标准输入（STDIN ）的检查，以使得整体更加的可靠。它将在定时工作时获取参数。

版本号 2.0.1

发表时间: 2011年3月15号
Hg标签: v2.0.1

  • 总体变化
    • config文件添加了 $config['cookie_secure'] 用来允许安全链接(HTTPS) 设置cookie.
    • 添加了常量 CI_CORE 以用于区分核心代码: TRUE 和社区贡献代码: FALSE.
    • index.php添加了常量ENVIRONMENT, 可以改变PHP的error reporting设置, 可选的, which configuration files are loaded (如下). 更多请见于 环境控制 .
    • 添加了支持 定制环境的配置文件.
  • 类库
    • Form validation Class添加了decimal, less_than和greater_than规则.
    • 如果未提供第一个参数，Input Class 的post()和get()方法将返回包含全部结果的数组.
    • set_cookie() helper和Input Class的方法可以生成Secure cookies.
    • Output Class添加了set_content_type()方法，用于设置HTTP的头：Content-Type的 MIME Type或者是config/mimes.php的数组.（Added set_content_type() to Output Class to set the output Content-Type HTTP header based on a MIME Type or a config/mimes.php array key.）
    • Output Class现在支持链式调用.
  • 辅助类
    • 改变了Form helper的form_open()处理逻辑. 如果没有值传递过来，那么将会提交当前的URL.

2.0.1的Bug修正

  • 可以在任意文件夹下面运行CLI的请求, 不再只限于index.php所在目录.
  • Fixed issue #41: 为mp3添加了audio/mp3 mime头.
  • Fixed a bug (核心代码#329) 文件缓存驱动引用了错误的缓存目录.
  • Fixed a bug (社区代码#69) SHA1类库命名错误.

版本号：2.0.0

编译时间:2011年1月28日
Hg标签:v2.0.0

  • 总体变化
    • 已不支持PHP4。 CodeIgniter现在最低需要PHP5.1.6。
    • 脚手架前一版本已被弃用，2.0已删除。
    • Plugins已被删除，鼓励使用Helpers。验证码图片plugin已经转为一个Helper，并归入文档。 由于可以使用其他更成熟的JavaScript日历类库，特别是jQuery，自带的JavaScript的日历插件已删除。
    • 增加了新的特殊的库类型：Drivers。
    • 新增对query-string的完整支持，详见配置文件。
    • 将application从system文件夹中移出。
    • 将system/cache和system/logs文件夹从system移到application里。
    • 对主index.php文件添加路由重载，使普通的路由指向能够在每个单个的"index"文件的里重写。
    • 在主index.php文件增加直接从数据集设置配置值（或重写配置值）的能力，这可以使一个单独的应用程序被多个前端Controller使用，而每个Controller之间又有自己的配置。
    • 添加配置$config['directory_trigger']，使访问一个Controller子目录时可以用指定的URI，而不是_GET字符串。
    • 新增设置“Package”路径功能 - 每次访问加载时，Loader和config总是首先从这里查找。这使分布的每个子应用都可以在一个单独的"package"目录里拥有它们自己的libraries, models, config等等。详见Loader class文档。
    • 开发中的代码现在托管在BitBucket。
    • 删除了过时Validation类。
    • 在所有核心类名上添加了CI_前缀。
    • 现在可以在自动加载文件application/config/autoload.php里设置"Package"的路径。
    • 现在可以不带扩展名设置Upload库的file_name，扩展名将由实际上传的文件扩展名取代给定的。
    • 在Database Forge中如果你不改变名称，$this-> dbforge -> modify_column()第二个参数可以省略。
    • 配置$config['base_url']现在默认为空，会判断它应该是什么。
    • 启用完整的命令行界面兼容配置config['uri_protocol'] = 'CLI';。
  • 类库
    • 增加了一个Cache driver，支持APC，memcached，和基于文件的缓存。
    • 在Pagination library里新增了$prefix, $suffix 和 $first_url属性。
    • 在Pagination library里新增了可以设置值为false来禁用首页，上一页，下一页，和翻页跳转的链接。
    • 增加Security library，它现在包含xss_clean方法，filename_security方法和其他安全相关的方法。
    • 在Security library添加CSRF（跨站点的参考伪造）的保护。
    • 在Output library新增$parse_exec_vars属性。
    • Profiler新增能开启/禁用个别路径的访问权限。
    • 在File Uploading Class增加了一个通配符配置选项$config['allowed_types'] = '*'。
    • 在XML-RPC Server library中增加了一个'object'配置变量，这样就可以指定对象寻找要调用的方法，而不是在$CI superobject中假设它。
    • 在单元测试运行的开头加入了“is_object”。
    • Table library将生成一个空字段，赋值为一个空字符串或NULL值。
    • 在Table library新增了功能：新增字段，设置标记属性。
    • 在Parser Class增加了一个parse_string()。
    • 在Profiler输出中曾加HTTP头和配置信息。
    • 在User Agent Class中增加通过browser()对浏览器Chrome和Flock的检测。
    • 在Unit Test Class中现在有一个可选的“notes”设置，允许使用$this->unit->set_test_items()分离显示测试结果。
    • 在XMLRPC library增加了一个成员变量$xss_clean，使控制可以使用Security library的xss_clean()方法。
    • 在FTP library增加了一个download()方法。
    • 更改如果上传文件XSS检查失败，do_xss_clean()返回false。
    • 在Upload library添加stripslashes() 和trim()，对$_FILES的双引号规范输入。
    • 在$this->zip->read_dir('/path/to/directory', FALSE)添加了第二个参数（bool）来消除创建ZIP档案时前面的空文件夹。好比一个压缩文件应该包含一个文件夹和所有内容。
    • 在Image Library添加使用GD库的调整尺寸和调整PNG透明度。
    • 修改了Session类，如果没有在配置文件里设置“encryption key”的值，则不能使用Session。
    • 在Session class增加了一个新的配置项sess_expire_on_close，允许浏览器窗口关闭时，会话自动到期。
    • 改进Encryption library的性能,当服务器上Mcrypt可用时。
    • 改变了Encryption library默认的加密模式为CBC。
    • 新增一个encode_from_legacy()用来转换在CI1.x中加密的数据到2.0。详见升级说明 。
    • 修改Form_Validation library，允许在set_rules(), set_message()()和set_error_delimiters()使用方法链接。
    • 修改Email Library允许使用方法链接。
    • 在input class新增request_headers(), get_request_header() 和 is_ajax_request()。
    • 修改User agent library，使is_browser(), is_mobile() 和 is_robot()可以选择检查特定的浏览器或移动设备。
  • 数据库
    • 数据库配置.
    • 在database configuration新增autoinit值。
    • 在database configuration新增stricton值。
    • 在Database Utilities Class新增database_exists()。
    • db->version()发生语义变化，允许对数据库的异常列表和函数返回版本字符串，代替特殊格式的SQL查询。目前，这份名单只包括Oracle和SQLite。
    • 修正了一个当在有标识保护的特定表执行函数field_data()发生异常。
    • 修正了一个未定义的类变量在数据库驱动中引用的一个错误。
    • 修改了有数据库错误时，标识出有问题的文件名和行。
    • 删除了已过时的函数：orwhere, orlike, groupby, orhaving, orderby, getwhere。
    • 从db utility drivers中删除过时的_drop_database() and _create_database()。
    • 改进Postgres数据库驱动的dbforge create_table()。
  • Helpers
    • Added convert_accented_characters() function to text helper.
    • Added accept-charset to the list of inserted attributes of form_open() in the Form Helper.
    • Deprecated the dohash() function in favour of do_hash() for naming consistency.
    • Non-backwards compatible change made to get_dir_file_info() in the File Helper. No longer recurses by default so as to encourage responsible use (this function can cause server performance issues when used without caution).
    • Modified the second parameter of directory_map() in the Directory Helper to accept an integer to specify recursion depth.
    • Modified delete_files() in the File Helper to return FALSE on failure.
    • Added an optional second parameter to byte_format() in the Number Helper to allow for decimal precision.
    • Added alpha, and sha1 string types to random_string() in the String Helper.
    • Modified prep_url() so as to not prepend http:// if the supplied string already has a scheme.
    • Modified get_file_info in the file helper, changing filectime() to filemtime() for dates.
    • Modified smiley_js() to add optional third parameter to return only the javascript with no script tags.
    • The img() function of the HTML helper will now generate an empty string as an alt attribute if one is not provided.
    • If CSRF is enabled in the application config file, form_open() will automatically insert it as a hidden field.
    • Added sanitize_filename() into the Security helper.
    • Added ellipsize() to the Text Helper
    • Added elements() to the Array Helper
  • Other Changes
    • Added an optional second parameter to show_404() to disable logging.
    • Updated loader to automatically apply the sub-class prefix as an option when loading classes. Class names can be prefixed with the standard "CI_" or the same prefix as the subclass prefix, or no prefix at all.
    • Increased randomness with is_really_writable() to avoid file collisions when hundreds or thousands of requests occur at once.
    • Switched some DIR_WRITE_MODE constant uses to FILE_WRITE_MODE where files and not directories are being operated on.
    • get_mime_by_extension() is now case insensitive.
    • Added "default" to the list Reserved Names.
    • Added 'application/x-msdownload' for .exe files and ''application/x-gzip-compressed' for .tgz files to config/mimes.php.
    • Updated the output library to no longer compress output or send content-length headers if the server runs with zlib.output_compression enabled.
    • Eliminated a call to is_really_writable() on each request unless it is really needed (Output caching)
    • Documented append_output() in the Output Class.
    • Documented a second argument in the decode() function for the Encryption Class.
    • Documented db->close().
    • Updated the router to support a default route with any number of segments.
    • Moved _remove_invisible_characters() function from the Security Library to common functions.
    • Added audio/mpeg3 as a valid mime type for MP3.

Bug fixes for 2.0.0

  • Fixed a bug where you could not change the User-Agent when sending email.
  • Fixed a bug where the Output class would send incorrect cached output for controllers implementing their own _output() method.
  • Fixed a bug where a failed query would not have a saved query execution time causing errors in the Profiler
  • Fixed a bug that was writing log entries when multiple identical helpers and plugins were loaded.
  • Fixed assorted user guide typos or examples (#10693, #8951, #7825, #8660, #7883, #6771, #10656).
  • Fixed a language key in the profiler: "profiler_no_memory_usage" to "profiler_no_memory".
  • Fixed an error in the Zip library that didn't allow downloading on PHP 4 servers.
  • Fixed a bug in the Form Validation library where fields passed as rule parameters were not being translated (#9132)
  • Modified inflector helper to properly pluralize words that end in 'ch' or 'sh'
  • Fixed a bug in xss_clean() that was not allowing hyphens in query strings of submitted URLs.
  • Fixed bugs in get_dir_file_info() and get_file_info() in the File Helper with recursion, and file paths on Windows.
  • Fixed a bug where Active Record override parameter would not let you disable Active Record if it was enabled in your database config file.
  • Fixed a bug in reduce_double_slashes() in the String Helper to properly remove duplicate leading slashes (#7585)
  • Fixed a bug in values_parsing() of the XML-RPC library which prevented NULL variables typed as 'string' from being handled properly.
  • Fixed a bug were form_open_multipart() didn't accept string attribute arguments (#10930).
  • Fixed a bug (#10470) where get_mime_by_extension() was case sensitive.
  • Fixed a bug where some error messages for the SQLite and Oracle drivers would not display.
  • Fixed a bug where files created with the Zip Library would result in file creation dates of 1980.
  • Fixed a bug in the Session library that would result in PHP error when attempting to store values with objects.
  • Fixed a bug where extending the Controller class would result in a fatal PHP error.
  • Fixed a PHP Strict Standards Error in the index.php file.
  • Fixed a bug where getimagesize() was being needlessly checked on non-image files in is_allowed_type().
  • Fixed a bug in the Encryption library where an empty key was not triggering an error.
  • Fixed a bug in the Email library where CC and BCC recipients were not reset when using the clear() method (#109).
  • Fixed a bug in the URL Helper where prep_url() could cause a PHP error on PHP versions < 5.1.2.
  • Added a log message in core/output if the cache directory config value was not found.
  • Fixed a bug where multiple libraries could not be loaded by passing an array to load->library()
  • Fixed a bug in the html helper where too much white space was rendered between the src and alt tags in the img() function.
  • Fixed a bug in the profilers _compile_queries() function.
  • Fixed a bug in the date helper where the DATE_ISO8601 variable was returning an incorrectly formatted date string.

版本 1.7.2

发布日期：2009年9月11日
Hg Tag: v1.7.2

  • 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
Hg Tag: 1.7.1

  • 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
Hg Tag: 1.7.0

  • 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日
Hg Tag: v1.6.3

版本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
Hg Tag: 1.6.2

  • 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
Hg Tag: 1.6.1

  • 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.

翻译贡献者: anjianshi, caesarjuly, CosyBoy, fushengqian, Hex, yygcom, 暗夜星辰, 曜日晨阳, 杜建宇
最后修改: 2014-06-14 16:50:14

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


关于 CodeIgniter - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 关于 CodeIgniter

关于 CodeIgniter

CodeIgniter 最早是由 Rick Ellis 开发（EllisLab 公司的 CEO）。这个框架是为真实应用而编写的，集成了很多类库、辅助函数(helpers)以及从 ExpressionEngine 借用的子系统。

CodeIgniter 当前由“ExpressionEngine 开发团队”开发并维护。
Bleeding edge development is spearheaded by the handpicked contributors of the Reactor Team.

来自 Ruby on Rails 的灵感启发我们创造了一个 PHP 框架，并且将框架的概念引入到网络社区的一般意识中。

翻译贡献者: csfhc, Hex, imjie, irini
最后修改: 2014-01-01 21:43:00

上一个主题: 变更记录 · 页首 · 用户指南首页 · 下一个主题: 下载 CodeIgniter


下载 CodeIgniter - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

下载 CodeIgniter

  • CodeIgniter V 2.2.0 (最新版本)
  • CodeIgniter V 2.1.4
  • CodeIgniter V 2.1.3
  • CodeIgniter V 2.1.2
  • CodeIgniter V 2.1.1
  • CodeIgniter V 2.1.0
  • CodeIgniter V 2.0.3
  • CodeIgniter V 2.0.2
  • CodeIgniter V 2.0.1
  • CodeIgniter V 2.0.0
  • CodeIgniter V 1.7.3
  • 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

Git 服务器

Git is a distributed version control system.

Public Git access is available at GitHub. Please note that while every effort is made to keep this code base functional, we cannot guarantee the functionality of code taken from the tip.

Beginning with version 2.0.3, stable tags are also available via GitHub, simply select the version from the Tags dropdown.

翻译贡献者: Hex, IT不倒翁, thestar
最后修改: 2014-06-10 13:53:57

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


安装指导 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

安装指导

CodeIgniter 安装分为四个步骤：

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

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

为了安全考虑,system和application两个文件夹应放到网站根目录（Web Root）以外的地方，这样浏览器就不能够直接访问它们。在默认设置下, 在每个文件夹中都有一个 .htaccess 配置文件以拒绝直接访问, 但是当把代码部署到生产环境时最好移除他们，因为生产环境的 Web 服务可能会不支持 .htaccess 的配置。

如果你移动了以上两个文件夹,请打开主目录下的index.php文件并编辑$system_path和$application_folder两个变量, 最好使用绝对路径进行替换, 例如：'/www/MyUser/system'.

另外有一个附加的考虑就是，如果要在生产环境中使用，最好关闭PHP的错误报告以及其他任何与开发时有关的功能， 在CodeIgniter中，可以设置 ENVIRONMENT 常量来实现这个功能。详细的文档请参阅 安全 章节。

以上就是全部安装过程！

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

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

翻译贡献者: 1294822, djc6914, greenlee, Hex, hutushen222, localtest, lp_ci, lw1001, thestar, 拉风的牛仔
最后修改: 2014-06-05 10:27:02

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


从老版本升级 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

从老版本升级

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

  • 从 2.1.4 升级到 2.2.0
  • 从 2.1.3 升级到 2.1.4
  • 从 2.1.2 升级到 2.1.3
  • 从 2.1.1 升级到 2.1.2
  • 从 2.1.0 升级到 2.1.1
  • 从 2.0.3 升级到 2.1.0
  • 从 2.0.2 升级到 2.0.3
  • 从 2.0.1 升级到 2.0.2
  • 从 2.0.0 升级到 2.0.1
  • 从 1.7.3 升级到 2.0.0
  • 从 1.7.2 升级到 1.7.3
  • 从 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
最后修改: 2014-06-10 13:55:43

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


疑难解答 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 开始

CodeIgniter 将从这里开始

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

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

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

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

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

翻译贡献者: alsove, Hex, lp_ci
最后修改: 2011-01-20 19:22:17

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


CodeIgniter 是什么？ - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

CodeIgniter 是什么？

CodeIgniter 是一个应用程序框架

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

CodeIgniter 是免费的

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

CodeIgniter 是轻量级的

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

CodeIgniter 是快速的

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

CodeIgniter 使用 M-V-C 模型

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

CodeIgniter 生成干净的 URL

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

example.com/news/article/345

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

CodeIgniter 功能强大

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

CodeIgniter 是可扩展的

这个系统可以非常简单的通过自定义类库、辅助函数来进行扩展，或者也可以通过扩展类、系统钩子来实现。

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 拥有一个友好的用户社区

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

翻译贡献者: csfhc, Hex, iptton, irini, IT不倒翁, Rayne
最后修改: 2014-01-02 21:34:11

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


CodeIgniter 速记表 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

CodeIgniter 速记表

类库参考

CodeIgniter Library Reference

辅助函数参考

CodeIgniter Library Reference

翻译贡献者: Hex, lp_ci
最后修改: 2011-01-31 01:08:08

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


特性 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 特性

CodeIgniter 特性

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

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

翻译贡献者: architectcom, Hex, iptton, IT不倒翁
最后修改: 2011-06-04 19:01:51

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


应用程序流程 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 应用程序流程

应用程序流程图

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

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

翻译贡献者: Hex
最后修改: 2012-02-06 01:19:24

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


MVC - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › MVC

模型-视图-控制器

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

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

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

翻译贡献者: bigfat, Hex, irini, IT不倒翁, lp_ci, soyota
最后修改: 2011-05-13 13:28:47

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


目标 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 目标

设计和架构目标

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

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

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

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

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

翻译贡献者: 85868405, Hex, lp_ci
最后修改: 2011-01-31 01:09:47

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


内容提要 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 教程 › 内容提要

教程 − 内容提要

通过由浅入深，前后连贯的章节安排，本教程将向你介绍CodeIgniter框架基础以及MVC程序架构的基本理论。

在教程中，你将创建一个简单新闻系统。首先，你将学会：如何编写代码让程序能够加载静态内容页面；紧接着，你将学会：从数据库中读取新闻条目数据并将其显示出来；最后，你将学会：通过创建页面表单将新闻条目添加进数据库中。

教程将主要介绍以下技术要点：

  • 模型-视图-控制器（Model-View-Controller）基础知识。
  • URI路由基础。
  • 表单验证。
  • 使用"Active Record"执行基本的数据库操作。

为便于理解，整个教程会被分拆成多个章节——每个章节会介绍涉及到CodeIgniter的不同功能技术要点。具体章节安排如下：

  • 内容提要（本页面）：介绍教程将覆盖的内容要点。
  • 加载静态内容：此节主要介绍控制器(Controllers)，视图(Views)和路由(Routing)的基础知识。
  • 读取新闻条目：此节开始介绍数据模型(Models)的相关知识，以及在数据模型(Models)中执行基本数据库操作。
  • 创建新闻条目：此节主要介绍在CodeIgniter中执行高级数据库操作，以及表单验证的相关知识。
  • 结束语：总结整个教程，给出深入学习CodeIgniter框架的一些建议和参考资源链接。

卷起袖头，准备好最爱的程序编辑器，开始你的CodeIgniter框架探索之旅吧。

翻译贡献者: cnsaturn, Hex
最后修改: 2012-02-07 11:48:11

上一个主题: 目标 · 页首 · 用户指南首页 · 下一个主题: 加载静态内容


加载静态内容 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 教程 › 加载静态内容

教程 − 加载静态内容

注意: 本教程假定你已经下载和安装了CodeIgniter开发环境。

首先，你需要创建一个可以处理静态内容请求的控制器类。控制器，是一个用来代理完成某项任务的PHP类，它充当基于MVC架构应用程序的“粘合剂”（译者注：控制器用来粘合/协调不同模型和视图。随着教程的深入，你会更深刻的理解这一点）。

举例来说，假设存在某个针对如下URL的请求: http://example.com/news/latest/10 仔细观察此URL地址，我们可以猜测它所完成的任务：存在某个类名为"news"的控制器，调用此类下的"latest"方法用来提取10条最新新闻，然后解析显示在最终浏览器页面上。在基于MVC架构思想的应用程序中，我们经常会见到如下典型URL格式： http://example.com/[控制器类名]/[控制器方法名]/[所需参数] 在实际项目中，以上典型格式可能会存在变化趋于复杂。但到目前为止，了解这一典型格式已然足够。

创建一个控制器文件application/controllers/pages.php，并编写如下代码：

你已经创建了一个名为"pages"的类, 包含一个名为"view"的方法，并定义了一个名为 $page 的参数。 这个pages类继承了CI_Controller类。这就意味着 这个新的pages类可以继承CI_Controller (system/core/Controller.php) 类里面定义的方法和变量。

这个控制器会成为你的网站程序每次请求的中心。 在非常技术性的CodeIgniter的讨论中，我们把它称为 超级对象。就像任何php类一样，在你自己的控制器中，使用$this来调用它，这样就可以实现用 $this 来加载所有变量、视图和对这个框架进行一般操作。

现在你已经创建了自己的第一个方法，是时候来做几个基础的页面模板了。我们将要创建两个 "视图" (模板页面) ，也就是页面的页头（header）和页脚（footer）。

创建页头文件 application/views/templates/header.php ，代码如下。

页头文件包括在正式加载视图前需要的基本的HTML代码。同时，这里还输出了 $title 变量，一会儿我们会在控制器中对它进行定义。现在我们来创建一个页脚 application/views/templates/footer.php ，代码如下:

为控制器添加逻辑结构 (Adding logic to the controller)

之前你创建了一个控制器并定义了一个方法view()。这个方法里定义了一个参数，它的值是即将加载的页面的名称。静态页面的模板将被放在 application/views/pages/ 文件夹中。

在那个文件夹中需要创建两个文件，分别为 home.php 和 about.php。在这两个文件中敲一些任何你喜欢的内容进去并保存。如果你喜欢特别不寻常的内容，可以试试敲“Hello World!”。

为了能加载那些页面，你需要检查一下它们是否存在：

public function view($page = 'home')
{

  if ( ! file_exists(APPPATH.'/views/pages/'.$page.'.php'))
  {
    // 页面不存在
    show_404();
  }

  $data['title'] = ucfirst($page); // 将title中的第一个字符大写

  $this->load->view('templates/header', $data);
  $this->load->view('pages/'.$page, $data);
  $this->load->view('templates/footer', $data);

}

此时，如果页面存在，它将被加载，同时，页头和页脚也会显示出来。如果页面不存在，那么就会显示404错误页面。

这个方法中的第一行是检查文件是否存在的，使用的是PHP自带的函数 file_exists() 。show_404() 是CodeIgniter中的函数，用来调用404错误页面。

在页头模板（header.php）中，我们用 $title 变量来自定义页面标题（<title>）。而这个变量的值，我们现在在这个方法中对它进行了定义。不过，我们并没有将这个值直接赋给变量，而是将它作为一个元素赋给了 $data 数组。

最后一项，按照需要显示的顺序来加载那些视图。 view() 方法中的第二个参数是用来传递值给视图的。数组中的每个值都被定义成与它关键字相同的一个变量，如控制器中 $data['title'] 的值就等同于视图中变量$title。

设置路由（Routing）

这个控制器现在可以工作了，在浏览器中键入后面的地址 [你的网址]index.php/pages/view 就可以看到Home页面。输入 index.php/pages/view/about 也可以看到about页面，也是带页头和页脚的哦。

根据自定义路由的规则，你也可以自己定义任何控制器和方法的URI，这样就可以摆脱下面的既定规则了。 http://example.com/[controller-class]/[controller-method]/[arguments]

我们来试试吧。打开路由文件 application/config/routes.php ，并添加下面两行代码，并删除 $route 数组中的其他代码。

$route['default_controller'] = 'pages/view';
$route['(:any)'] = 'pages/view/$1';

CodeIgniter由上而下读取路由规则然后将请求路由至第一个匹配的规则。每一个规则都是一个正则表达式（左侧）映射到一个由斜线分隔的控制器和方法名（右侧）。当有请求到来时，CodeIgniter寻找第一个匹配的路由规则，然后调用相应的控制器和方法，通常还带着参数。

更多关于路由设置的信息都在 URI 路由 文档 里。

回到上面的代码，第二行是指利用通配符 (:any) 可以使任何请求都能匹配到 $routes 数组，并且通过参数传递给pages类的view()方法。

现在，访问下 index.php/about. 看看是不是已经能正确地显示页面了呢？赞！

翻译贡献者: aolinks, borisauschina, changekale, cnsaturn, csfhc, Hex, irini, lionskys, liuzhengyi, ljhljh235, syrdxb, zzdjk6
最后修改: 2014-06-10 14:12:28

上一个主题: 内容提要 · 页首 · 用户指南首页 · 下一个主题: 读取新闻条目


读取新闻条目 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 教程 › 读取新闻条目

教程 − 读取新闻条目

在上一节中，我们通过如何写出一个包含静态页面的类来了解了一些这个框架的基本概念。我们也根据自定义路由规则重新梳理了URI。现在是时候向大家介绍动态内容和如何使用数据库了。

创建你的数据模型

数据库的运算并不是在控制类中进行的，而是在数据模型中，这样他们就可以在后面很容易地被反复使用。数据模型就是对你的数据库或其他数据存储方式进行取回、插入和更新的地方，它们的功能是展示你的数据（They represent your data）。

打开 application/models 文件夹新建一个文件 news_model.php ，代码如下。确保你已经按照 这里的说明配置了自己的数据库并且数据库服务器与PHP.ini有相应配置。

<?php
class News_model extends CI_Model {

  public function __construct()
  {
    $this->load->database();
  }
}

这段代码和早前写过的控制器的代码类似。它创建了一个继承 CI_Model 的数据模型，并用来载入数据库。通过 $this->db 对象就可以使用数据库类了。

在对数据库进行查询前，我们要先建一个数据表。连接你的数据库并执行下面的 SQL 命令，并在里面加些内容。

CREATE TABLE news (
  id int(11) NOT NULL AUTO_INCREMENT,
  title varchar(128) NOT NULL,
  slug varchar(128) NOT NULL,
  text text NOT NULL,
  PRIMARY KEY (id),
  KEY slug (slug)
);

现在数据库和数据模型都设置好了，我们需要一个方法来把我们的文章从数据库中读取出来。数据库抽象层已经包含在CodeIgniter的 Active Record模式 中了。这样可以确保只写一次查询就可以应用到 所有的数据库系统上。在你的数据库模型中添加如下代码。

public function get_news($slug = FALSE){
  if ($slug === FALSE)
  {
    $query = $this->db->get('news');
    return $query->result_array();
  }

  $query = $this->db->get_where('news', array('slug' => $slug));
  return $query->row_array();
}

通过上面的代码可以实现两个不同的查询，你可以得到所有的新闻纪录，也可以通过 slug得到某一篇新闻。你可能注意到了 $slug 变量在查询前并没有被检验过（sanitized），因为Active Record类已经把这个工作做完啦。

显示新闻

既然查询已经写完了，我们就要把这个数据模型和用来显示新闻内容的视图联系起来了。其实这个工作在我们之前写的pages控制类中就可以实现，但为了更清楚地向大家说明，我们来定义一个新的news控制类 application/controllers/news.php，代码如下。

<?php
class News extends CI_Controller {

  public function __construct()
  {
    parent::__construct();
    $this->load->model('news_model');
  }

  public function index()
  {
    $data['news'] = $this->news_model->get_news();
  }

  public function view($slug)
  {
    $data['news_item'] = $this->news_model->get_news($slug);
  }
}

看看上面的代码就会发现和我们之前写过的文件相似。首先，__construct方法是父级类 (CI_Controller) 的构造函数，并调用了数据模型，这样这个控制器中的其他方法就能使用那个数据模型了。

其次，这里有两个方法分别用来显示所有的新闻和某一条。在第二个方法中可以看到 $slug 变量被传递给了数据模型中的方法。数据模型就是用这个slug来确定需要返回哪一篇文章的。

现在通过数据模型，数据已经被控制器获得了，但还无法显示出来。下面我们就要把数据传递给视图了。

public function index(){
  $data['news'] = $this->news_model->get_news();
  $data['title'] = 'News archive';

  $this->load->view('templates/header', $data);
  $this->load->view('news/index', $data);
  $this->load->view('templates/footer');
}

上面的代码从数据模型中获得了所有新闻的记录，并把它们赋值给了一个变量。页面的标题也赋给了 $data['title'] ，这些所有的数据都会传递给视图。现在你需要创建一个视图来显示这些新闻。新建 application/views/news/index.php 代码如下。

<?php foreach ($news as $news_item): ?>

    <h2><?php echo $news_item['title'] ?></h2>
    <div class="main">
        <?php echo $news_item['text'] ?>
    </div>
    <p><a href="http://[你的域名]/index.php/news/<?php echo $news_item['slug'] ?>">View article</a></p>

<?php endforeach ?>

在这里，每条新闻都被循环出来展示给读者了。你可以看到我们的模板是用PHP和HTML混着写的，如果你更喜欢用模板语言的话，你可以用CodeIgniter的 模板解析器类 或者第三方模板解析器（模板引擎）。

新闻概述页面已经做好了，现在还缺少每一篇文章的页面。之前写好的数据模型现在就可以非常简单地用来实现这个功能啦。你只需要添加一些代码到控制器并且创建一个视图。把下面的代码添加到news控制器中。

public function view($slug){
  $data['news_item'] = $this->news_model->get_news($slug);

  if (empty($data['news_item']))
  {
    show_404();
  }

  $data['title'] = $data['news_item']['title'];

  $this->load->view('templates/header', $data);
  $this->load->view('news/view', $data);
  $this->load->view('templates/footer');
}

这里，$slug 变量作为参数传递给了 get_news() 方法，这样就可以返回特定的某一篇文章了。现在剩下的一件事就是创建视图 application/views/news/view.php了，代码如下。

<?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];

设置路由

因为之前设置了通配符路由规则，现在你需要额外的路由来显示刚刚写的控制器。按照下面的代码修改你的路由文件 (application/config/routes.php) ，这样就确保了请求调用的是news控制器而不是之前设置的pages控制器。第一行代码表示的是控制器中通过slug读取的那条新闻。

$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';

把浏览器的地址改回根目录，在后面加上 index.php/news 来看看你的新闻页面吧。

翻译贡献者: 250351515, csfhc, Hex, irini, kphcdr, odissey, scncpb, 就是欠揍
最后修改: 2014-06-10 14:10:10

上一个主题: 加载静态内容 · 页首 · 用户指南首页 · 下一个主题: 创建新闻条目


创建新闻条目 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 教程 › 创建新闻条目

教程 - 创建新闻条目

现在你已经知道了怎样用CodeIgniter从数据库中读取数据，但还不知道怎样往数据库中写入数据。在这一节中，你将学到通过怎么扩展之前写过的新闻控制器和数据模型来实现这一功能。

创建一个表单

为了向数据库里输入数据，你需要创建一个表单来输入需要被存储的信息。这就是说你需要一个带两个输入域的表单，一个用来输入标题，一个用来输入内容。另外，你可以通过数据模型中的标题来取得slug。在 application/views/news/create.php 创建一个新的视图。

这里只有两个东西可能你不熟悉，一个是 form_open() 函数，一个是 validation_errors() 函数。

第一个由 表单辅助函数 提供，用来提供表单元素和一些额外功能，例如添加隐藏的 安全类。第二个用来报告表单验证中出现的错误信息。

回到新闻控制器，在这里你需要做两件事，一件是检查表单是否被提交了，另一件是检查提交的数据是否能够通过验证规则。你需要用到 表单验证 库来做这些。

public function create()
{
  $this->load->helper('form');
  $this->load->library('form_validation');

  $data['title'] = 'Create a news item';

  $this->form_validation->set_rules('title', 'Title', 'required');
  $this->form_validation->set_rules('text', 'text', 'required');

  if ($this->form_validation->run() === FALSE)
  {
    $this->load->view('templates/header', $data);
    $this->load->view('news/create');
    $this->load->view('templates/footer');

  }
  else
  {
    $this->news_model->set_news();
    $this->load->view('news/success');
  }
}

上面的代码中添加了一些功能，前几行载入了表单辅助函数和表单验证库，这样，表单验证的规则就被设定好了。 set_rules() 方法包含三个参数，第一个是输入域的名称，第二个是错误信息的名称，第三个是错误信息的规则——在这里的规则是输入内容的文本域必填。

正如上面所展示的，CodeIgniter拥有一个强大的表单验证库。你可以 从这里了解到这个库的更多内容。

继续，你会看到一个用来检查表单验证是否运行成功的条件。如果没有成功，显示表单，如果提交成功并且通过了验证，则会调用数据模型。这之后会加载一个显示成功信息的视图。在这里 application/view/news/success.php 创建一个新的视图用来显示成功信息。

数据模型

现在只剩一件事要做了，那就是写一个方法用来向数据库中写入数据。你将用到Acitve Record类来插入信息，并用到输入类来获得post数据。打开之前创建的数据模型加入下面的代码：

public function set_news()
{
  $this->load->helper('url');

  $slug = url_title($this->input->post('title'), 'dash', TRUE);

  $data = array(
    'title' => $this->input->post('title'),
    'slug' => $slug,
    'text' => $this->input->post('text')
  );

  return $this->db->insert('news', $data);
}

这个新的方法是用来维护向数据库插入新闻条目的。第三行包含了一个新的函数url_title()。这个函数是由 URL辅助函数 提供的，用来组织（strips down）你输入的字符串，将空格的地方替换成横线（-），确保其中全都是小写字母。这样之后剩下的就是一个漂亮的slug，可以很好地用来创建URI。

我们来继续准备一会儿要向$data数组输入的记录。这里的每个元素都对应着早前创建的数据表中的每一列。你可能注意到了这里有个新的方法叫 post() ，它是由 输入类提供的。这个方法可以确保数据是被过滤过（sanitized）的，从而保护你不被其他人恶意攻击。这个输入类是默认加载的。最后，就是将 $data 数组插入到我们的数据库。

设置路由

在你向你的CI程序添加新闻条目之前，你还要向 config/routes.php 里添加一个额外的规则。确保你的文件包含下列代码。这样可以保证CodeIginter将“create”看做一个方法来正确显示，而不是把它显示成一个slug为“create”的新闻页面。

$route['news/create'] = 'news/create';
$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';

现在在你的浏览器输入你本地CI程序的地址并在后面加上 index.php/news/create 。恭喜你，你刚刚完成了你的第一个CI程序！添加些新闻来看看其他你创造的其他页面吧！

翻译贡献者: cinewer, Hex, irini
最后修改: 2012-06-13 16:09:43

上一个主题: 读取新闻条目 · 页首 · 用户指南首页 · 下一个主题: 结束语


结束语 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 教程 › 结束语

教程 - 结束语

这篇教程没有涉及你可能期待的一个较为完整的内容管理系统的所有的事, 但它向你介绍更重要的路由,控制器与模型书写的一般规则. 我们希望这篇教程可以帮助你更深入地了解一些CodeIgniter的基本设计模式，以便于在此基础上做扩展。

既然你已经完成了这篇教程,我们建议您查看其余的文档. CodeIgniter因其全面的文档而常被称赞. 利用这一优势并彻底阅读“介绍”和“常规主题”部分. 当需要时你应该查阅类库参考和辅助函数参考.

每一个中级PHP程序员都应该能够在几天之内熟悉CodeIgniter.

如果你对框架或你自己的CodeIgniter代码仍旧有疑问, 你可以:

  • 访问中文社区
  • 访问英文社区
  • 访问英文官方 IRC 聊天室
  • 浏览 Wiki

翻译贡献者: Hex, irini, 飞翔的小强
最后修改: 2012-02-29 14:59:49

上一个主题: 创建新闻条目 · 页首 · 用户指南首页 · 下一个主题: CodeIgniter URL


URL - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

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'; //方法名
$config['directory_trigger']='d'; //若控制器在子目录下，URL中需带有这个参数，指定控制器所在子目录名称

如果你将 enable_query_strings 更改为 TRUE ，那么这个功能就被激活了。此时，你就可以通过关键字来调用需要的控制器和方法了：

index.php?c=controller&m=method

请注意：如果你使用查询字符串，那么就必须使用自己建立的 URL ，而且不能使用URL 辅助函数（或是其他生成 URL 的辅助函数，例如表单辅助函数），因为这些都是根据分段 URL 设计的。

翻译贡献者: awinlei, dren_a, Hex, icebird, levin, longjianghu, lp_ci, zhupeng, 笼中
最后修改: 2014-02-08 22:34:25

页首 · 用户指南首页 · 下一个主题: 控制器


控制器 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 控制器

控制器

控制器是应用程序的心脏，因为它们决定如何处理 HTTP 请求。

  • 什么是控制器？
  • Hello World
  • 方法
  • 将 URI 片段传递给方法
  • 定义一个默认控制器
  • 重新定义方法的调用规则
  • 控制数据输出
  • 私有方法
  • 如何将控制器放入子文件夹中
  • 构造函数
  • 已保留的方法名称

什么是控制器？

简而言之，一个控制器就是一个类文件，是以一种能够和 URI 关联在一起的方式来命名的。

假设这个 URI:

example.com/index.php/blog/

在上面的例子中，CodeIgniter 将尝试寻找并装载一个名为 blog.php 的控制器。

当控制器的名字匹配 URI 的第一段时，它将被装载。

让我们试试看: Hello World！

我们来创建一个简单的控制器，以便更直观地了解其工作原理。使用你的文本编辑器，创建一个名为 blog.php 的文件，然后输入下列代码：

然后保存文件到 application/controllers/ 文件夹。

现在使用类似这样的 URL 访问你的站点：

example.com/index.php/blog/

如果你做的没错，你应该看到Hello World！.

注意：类名必须以大写字母开头。换句话说，这是有效的：

<?php
class Blog extends CI_Controller {

}
?>

下面的blog首字母b小写，是属于无效的写法：

<?php
class blog extends CI_Controller {

}
?>

同时，始终确保你的控制器扩展自父控制器类，以便它能够继承其所有的方法。

方法

上面的例子中用到的方法名是 index()。如果 URI 的第二部分为空的话，会默认载入 “index” 方法。也可以将地址写成这样来访问 “Hello World”：

example.com/index.php/blog/index/

URI 的第二部分是用来决定调用控制器中哪个方法的。

我们再来试试。在你的控制器中加入一个新的方法：

现在在地址栏中输入下面的内容来访问 comments 方法：

example.com/index.php/blog/comments/

你应该看到新的信息了：看这里！

将 URI 片段传递给方法

如果你的 URI 超过两个部分，那么超过的将被作为参数传递给方法。

举例来说，如果你的 URI 是这样的：

example.com/index.php/products/shoes/sandals/123

URI 的第3和第4部分会被传递给你的方法（“sandals” 和 “123”）：

<?php
class Products extends CI_Controller {

    public function shoes($sandals, $id)
    {
        echo $sandals;
        echo $id;
    }
}
?>

上面的方法调用时必须给两个相应的参数，要不然会出错。当然你也可以像下面这样写，就不用在调用的时候给参数了！

<?php
class Products extends CI_Controller {

    public 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() 方法来废除这种规则：

public function _remap()
{
    // Some code here...
}

注意：如果你的控制器中包含一个名为 _remap() 的方法，那么不管你的 URI 中包含什么，它总会被忽略掉。这个方法会废除掉由 URI 片段来决定哪个方法被调用的规则，允许你重新定义调用方法的规则（方法的路由规则）。

被重新定义的方法调用方式（一般是 URI 中的第二片段）将作为一个参数传递给 _remap() ：

public function _remap($method)
{
    if ($method == 'some_method')
    {
        $this->$method();
    }
    else
    {
        $this->comments();
    }
}

任何附加在该方法名称之后的段都会被视为 _remap() 的第二个参数（可选）。这个可选的数组参数可以与PHP的call_user_func_array联用，模拟CodeIgniter的默认行为。

public function _remap($method, $params = array())
{
    $method = 'process_'.$method;
    if (method_exists($this, $method))
    {
        return call_user_func_array(array($this, $method), $params);
    }
    show_404();
}

处理输出

CodeIgniter 拥有一个输出类用来确保你修改的数据会自动被传递给浏览器。关于这个的更多信息可以在视图和输出类里找到。有些时候，你可能想要自己发布修改一些最终的数据或是自己把它传递给浏览器。CodeIgniter 允许你给你的控制器增加一个名为 _output() 的方法来接收最终的数据。

注意： 如果你的控制器包含一个 _output() 方法，那么它将总是被调用，而不是直接输出最终的数据。这个方法类似于OO里的析构函数，不管你调用任何方法这个方法总是会被执行。

例如：

public function _output($output)
{
    echo $output;
}

请注意，你的 _output() 将接收最终的数据。 Benchmark和内存的使用率数据将被渲染，缓存文件会被写入（如果已启用缓存），并且 HTTP 头也将被发送（如果您使用该功能），然后交给 _output() 函数。

为了让你的控制器输出缓存正确, 它的 _output() 函数可以这样来写:
if ($this->output->cache_expiration > 0)
{
$this->output->_write_cache($output);
}

如果您正在使用页面执行时间和内存使用统计的功能，这可能不完全准确，因为他们不会考虑到你所做的任何进一步的动作。请在输出类参用可用的方法，来控制输出以使其在任何最终进程完成之前执行。

私有方法

在某些情况下，你可能想要隐藏一些方法使之无法对外查阅。将方法私有化很简单，只要在方法名字前面加一个下划线（“_”）做前缀就无法通过 URL 访问到了。例如，如果你有一个像这样的方法：

private 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::__construct();

这行代码的必要性在于，你此处的构造函数会覆盖掉这个父控制器类中的构造函数，所以我们要手动调用它。

<?php
class Blog extends CI_Controller {

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

如果你需要设定某些默认的值或是在实例化类的时候运行一个默认的程序，那么构造函数在这方面就非常有用了。
构造函数并不能返回值，但是可以用来设置一些默认的功能。

已保留的方法名称

因为你添加的控制器类继承了主要的应用程序控制器，所以你要小心你的方法名不要和那个类中的方法名一样了，否则你的方法会覆盖原有的。详细信息请查看保留字部分。

就这样了！

OK，总的来说，这就是关于控制器的所有内容了。

翻译贡献者: 34333432, alsove, ashmodeus, bin_live, crazyant_ps2, dawenxi123, hewenxiang, Hex, irini, liuyanghejerry, li_star, longjianghu, lp_ci, vvchuanqi, zhangqianxun
最后修改: 2012-06-04 16:28:02

上一个主题: CodeIgniter URL · 页首 · 用户指南首页 · 下一个主题: 保留字


保留字 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 保留字

保留字

为了便于编程，CodeIgniter使用了一系列的函数和名称来完成操作。所以，有些名称不能被程序员使用。下面是不能被程序员使用的保留字列表。

控制器名称

因为你的控制器类将继承主程序控制器，所以你的函数命名一定不能和主程序控制器类中的函数名相同，否则你的局部函数将会覆盖他们。下面列出了已经保留的名称，请不要将你的控制器命名为这些：

  • Controller
  • CI_Base
  • _ci_initialize
  • Default
  • index

函数

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

变量

  • $config
  • $mimes
  • $lang

常量

  • ENVIRONMENT
  • 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
最后修改: 2012-02-05 23:33:59

上一个主题: 控制器 · 页首 · 用户指南首页 · 下一个主题: 视图


视图 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

当我们一次性载入多个视图的时候，你只需在第一个视图传入数据就可以了(header视图显示title,content视图显示message)，比如：

<?php

class Page extends CI_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, hewenxiang, Hex, ianyang, irini, lishen2, longjianghu, sydcurie, thankwsx, zhupeng
最后修改: 2012-02-05 23:43:50

上一个主题: 保留字 · 页首 · 用户指南首页 · 下一个主题: 模型


模型 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 模型

模型

模型对于那些想用传统MVC方式的人来说是可选的。

  • 什么是模型?
  • 剖析模型
  • 载入模型
  • 自动载入模型
  • 连接数据库

什么是模型?

模型是专门用来和数据库打交道的PHP类。例如，假设你想用CodeIgniter来做一个Blog。你可以写一个模型类，里面包含插入、更新、删除Blog数据的方法。下面的例子将向你展示一个普通的模型类:

class Blogmodel extends CI_Model {

    var $title   = '';
    var $content = '';
    var $date    = '';

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

    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 CI_Model {

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

Model_name 是模型类的名字。 类名的首字母必须大写，其他字母小写。 并且确保你的类继承了基本模型类(Base Model Class)。

文件名应该是模型类名的小写版。比如，如果你的类是:

class User_model extends CI_Model {

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

类的文件名应该是：

application/models/user_model.php

载入模型

模型可以在 控制器 中被引用。 就像这样:

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

如果模型文件在子文件夹下，引用的时候要带上相对路径名。例如：如果你有一个模型 application/models/blog/queries.php。 下面的代码可以引用它:

$this->load->model('blog/queries');

模型一旦被载入，你就能通过下面的方法使用它:

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

$this->Model_name->function();

在默认的情况下模型名称就直接被引入作为对象名，就如上面所示。当然，如果你愿意，可以起个更好记的对象名！那么，可以在加载模型函数中指定第二个参数来设定，例如：

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

$this->fubar->function();

这里有个控制器的例子，加载一个模型，然后通过视图显示出来

class Blog_controller extends CI_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);

    • 备注: 经过友好链接测试（也即只连接数据库不涉及查询），自动连接数据库和手动连接数据库时，消耗的内存情况是一样的，我本人的本机测试是0.67M

翻译贡献者: analyzer, crazyant_ps2, Hex, levin, liuhuyydy, li_star, longbill, longjianghu, ripen, shishirui, soyota, tinsn
最后修改: 2014-06-10 13:37:44

上一个主题: 视图 · 页首 · 用户指南首页 · 下一个主题: 辅助函数


辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 辅助函数

辅助函数

辅助函数，顾名思义，是帮助我们完成特定任务的函数。每个辅助函数文件仅仅是一些函数的集合。例如，URL Helpers 可以帮助我们创建链接，Form Helpers 可以帮助我们创建表单，Text Helpers 提供一系列的格式化输出方式，Cookie Helpers 能帮助我们设置和读取COOKIE， File Helpers 能帮助我们处理文件，等等。

跟其他部分不同的是，辅助函数不是用类的方式来实现的。它们仅仅是一些简单的过程处理函数。 每个辅助函数处理一个特定的任务，并且不必依靠其他函数。

CodeIgniter 默认是没有载入辅助函数文件的，所以如果你想用辅助函数，就必须先载入它。 一旦被载入，辅助函数将全局可用(globally available)，你可以在 controller 和 views 中使用它们。

辅助函数文件一般保存在 system/helpers 或 application/helpers 文件夹中。CodeIgniter 将会先在 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。

注意：辅助函数中的函数名最好做好命名规范，如果同时加载多个辅助函数文件，且其中有名称相同的函数，会导致 CI 出现空白页问题（也就是 PHP 语法错误）。

“扩展”辅助函数

你如果想 "扩展"一个原有的 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_ 这样的前缀命名,所以请不要使用CI_来自定义前缀.

现在可以做什么?

在目录里面有所有辅助函数的列表，你可以打开每个文件看看他们都能做些什么。

不过目前还没有想到更好的方法让我们如何记住这些辅助函数！要不编辑个快速查询手册？？如果你有更好的方法请告诉我！

翻译贡献者: architectcom, borisauschina, chenshenghan, csfhc, Hex, levin, lishen2, longbill, ripen, sheshi37c, shishirui, tangjianft, thankwsx, Xwoder
最后修改: 2014-06-05 10:17:46

上一个主题: 模型 · 页首 · 用户指南首页 · 下一个主题: 使用类库


使用 CodeIgniter 类库 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 使用 CodeIgniter 类库

使用 CodeIgniter 类库

所有的类库文件存放在system/libraries 文件夹。大多数情况下你需要预先在controller中初始化后才能使用它们:

$this->load->library('class name');

class name是你想要使用的类名。例如，要载入“表单验证类”，你可以这样做：

$this->load->library('form_validation');

一旦类库被载入，你就可以按照用户手册中的方法来使用它们。

此外，多个类库可以通过传递包含类库的数组一次加载。

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

创建类库

请阅读用户手册中关于 创建你自己的类库 的部分。

翻译贡献者: Hex, IT不倒翁, lishen2, longbill
最后修改: 2011-05-12 22:08:53

上一个主题: 辅助函数 · 页首 · 用户指南首页 · 下一个主题: 创建程序库


创建你自己的类库 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 创建你自己的类库

创建类库

当我们使用术语"类库"时,我们一般指的是位于libraries 文件夹中的类,它们在wiki的"类库参考"这个板块被讨论.在当前这个话题中,我们将讨论如何在 application/libraries 文件夹中建立你自己的类库,并使它们与全框架的资源维持分离.

作为一个额外的功能,当你需要在原始类中简单地添加一些功能时,CodeIgniter能使你的类库extend 自原始类.你甚至可以通过在application/libraries文件夹下安放同名类库文件的方法来完全替换原始类.

总之:

  • 你可以创建全新的类库.
  • 你可以扩展原始类库.
  • 你可以替换原始类库.

以下页面将深入介绍这三个概念.

注意: 除了数据库类无法被扩展或替换，剩余其他类均可。

建立你的类库文件

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

命名约定

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

类文件

所有的类应有基础原型(注意,这里我们以 Someclass 这个名字为例):

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

    public function some_function()
    {
    }
}

/* End of file Someclass.php */

使用你自己的类

在所有的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 {

    public function __construct($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 对象，而不是创建一个副本。

用你自己的类替换原始类

简单的将你自己的类命名为与原始类一样就能使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 {

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

载入你的子类

要载入扩展子类，你应该使用标准字符名. 请不要使用前缀. 例如,要载入上文说过的email扩展子类，你应该这样写:

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

扩展子类一旦被载入，就能像一般的类一样使用它们. Email类中的所有函数就能被调用:

$this->email->some_function();

设定自定义前缀

要设定你自己的子类前缀,请打开 application/config/config.php 文件并找到这一项:

$config['subclass_prefix'] = 'MY_';

注意所有原始CodeIgniter类库以 CI_ 作为前缀,所以请勿以CI_作为你自己的前缀.

翻译贡献者: benfeng, billycui, Deloz, dustin, Hex, IT不倒翁, shishirui, soyota, thinksand, walkbird, 志明
最后修改: 2014-04-09 17:17:10

上一个主题: 使用 CodeIgniter 程序库 · 页首 · 用户指南首页 · 下一个主题: 使用 CodeIgniter 适配器


使用 CodeIgniter 适配器 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 使用 CodeIgniter 适配器

使用 CodeIgniter 适配器

适配器是一种特殊的库，它有一个父类和任意数量的子类。子类可以访问其父类元素，但不能访问其兄弟类的元素。在你的控制器中，适配器为类库提供了一种优雅的语法，因此类库会就此获益甚至会需要分解成离散的类。

适配器的源文件存放在system/libraries 目录下, 命名一个和类名字相同的文件夹，文件夹下存放该类。同时在该文件夹中，有一个子文件夹叫做 drivers在其中包含了所有的子类。

要使用一个适配器，你需要在一个控制器里用如下的初始化函数初始它：

$this->load->driver('class name');

这里的class name 是你想加载的适配器的名字。 比如说你想加载一个叫做"Some Parent"的适配器，你可以这样：

$this->load->driver('some_parent');

适配器类中的方法可以用如下的方式来调用:

$this->some_parent->some_method();

这些作为子类的适配器能直接通过父类调用，而不用初始化。

$this->some_parent->child_one->some_method();
$this->some_parent->child_two->another_method(); 请查看缓存适配器的文件缓存使用方法

创建自己的适配器

如果想创建自己的适配器，请阅读用户手册中关于创建适配器的部分.

翻译贡献者: amos, crazyant_ps2, Hex, qixingyue, ripen, tinsn, TomLiu, zhangqianxun
最后修改: 2012-11-21 07:00:58

上一个主题: 创建你自己的程序库 · 页首 · 用户指南首页 · 下一个主题: 创建适配器


创建适配器 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 创建适配器

创建适配器

适配器目录和文件结构

适配器目录和文件结构布局的例子：

  • /application/libraries/Driver_name
    • Driver_name.php
    • drivers
      • Driver_name_subclass_1.php
      • Driver_name_subclass_2.php
      • Driver_name_subclass_3.php

注意: 为了在大小写敏感的文件系统上维持兼容性，这个 Driver_name 目录必须使用 ucfirst() 函数处理。

翻译贡献者: crazyant_ps2, Hex, hk_yuhe, IT不倒翁, mahone, qixingyue, tinsn
最后修改: 2012-06-05 19:05:24

上一个主题: 使用 CodeIgniter 适配器 · 页首 · 用户指南首页 · 下一个主题: 创建核心系统类


创建核心系统类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 创建核心系统类

创建核心系统类

每次CodeIgniter运行时都有很多基础类作为核心框架的一部分被自动初始化.但你也可以使用经过你修改的类来替换甚至扩展这些原始的核心系统类.

大多数用户一般不会有这种需求,但对于那些想较大幅度的改变CodeIgniter的人来说,我们依然提供了替换和扩展核心系统类的选择.

注意: 改变系统核心类会产生很大影响,所以在你做之前必须清楚地知道自己正在做什么.

系统类清单

以下是系统核心文件的清单,它们在每次CodeIgniter启动时被调用:

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

替换核心类

要使用你自己的系统类替换默认类只需简单的将你自己的 .php 文件放入本地文件夹 application/core

application/core/some-class.php

如果这个文件夹不存在你可以自己创建一个.

只要你自定义的文件名与默认的完全一样,它就会自动替换原有的类.

要注意的是你自定义的类必须以CI作为前缀,例如你自己建立了Input.php类的名字必须是:

class CI_Input {

}

扩展核心类

如果你需要在现有类库中加入一两个新的功能,那就完全不必要替换整个类库文件.你只需简单地扩展(继承)现有的类,扩展一个类就像在类中增加一些例外:

  • 扩展的类必须申明由父类扩展而来.
  • 新扩展的类所在的文件必须以 MY_ 为前缀(这个选项是可配置的,下面有说明).

例如,要扩展原有的Input 类,你应该新建一个文件名为application/core/MY_Input.php, 并按如下声明你的类:

class MY_Input extends CI_Input {

}

注意:如果你需要在类中使用构造函数,你必须在构造函数中显式继承父类构造函数:

class MY_Input extends CI_Input {

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

Tip: 所有在你的新类中定义的函数如果与父类中函数的命名完全一样,这些函数就能取代父类中原有的函数 (这也被称为"方法覆盖").这允许你在本质上改变CodeIgniter的核心.

如果你扩展了控制器核心类，那么也要在你的应用程序控制器的构造函数中使用这个新类。

class Welcome extends MY_Controller {

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

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

自定义前缀

要设定你自己的子类前缀,请打开application/config/config.php 文件并找到这一项:

$config['subclass_prefix'] = 'MY_';

请注意所有原始CodeIgniter类库以 CI_ 作为前缀,所以请勿以CI_作为你自己的前缀.所有的扩展核心类必须放到core目录中！

翻译贡献者: dustin, Hex, longbill, qixingyue, skey, thinksand
最后修改: 2014-02-14 14:54:29

上一个主题: 创建你自己的程序库 · 页首 · 用户指南首页 · 下一个主题: 钩子 - 扩展核心


钩子 - 扩展框架的核心 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

翻译贡献者: anbutu, chouqiuqiu, dustin, elviscai, Hex, Jack, nardo, qixingyue, shishirui
最后修改: 2014-02-14 14:59:24

上一个主题: 创建核心类 · 页首 · 用户指南首页 · 下一个主题: 自动装载资源


自动装载资源 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 自动装载资源

自动装载资源

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

下列项目可以自动装载：

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

要自动装载资源，打开 application/config/autoload.php 文件，然后将你想要自动装载的项目添加到 autoload 数组中，你会发现该文件中对应于上面每个项目类型指示。

注意：增加项目到自动装载数组中的时候，不要包括文件扩展名(.php)。

翻译贡献者: Hex, ianyang, lnnujxxy
最后修改: 2011-01-31 17:08:05

上一个主题: 钩子 - 扩展核心 · 页首 · 用户指南首页 · 下一个主题: 公共函数


公共函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 公共函数

公共函数

注：本条为本人添加。公共函数位于 system/core/Common.php 文件中，大家可以在这里定义自己的公共函数。--IT不倒翁

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()函数能够取得单个配置信息，但是配置类是访问这些信息的优选方式。更多信息请见类库参考。

注:此函数获取的是从config文件直接获取的值，无法取得配置类 set_item() 函数变更后的值。

show_error('message'), show_404('page'), log_message('level', 'message')

这些函数在错误处理中描述。

set_status_header(code, 'text');

允许你手动设置服务器状态头(header)。例如:

set_status_header(401);
// 将header设置为: Unauthorized

单击这里 查看全部的header列表。

remove_invisible_characters($str)

这个函数能防止在ASCII字符之间插入空字符，如Java\0script.

html_escape($mixed)

利用此功能可以方便的使用htmlspecialchars()函数。它接受字符串和数组。有助于防止跨站脚本攻击（XSS）。

翻译贡献者: actionbi, Hex, IT不倒翁, lishen2, walkbird, yinzhili, 我是我, 暗夜星辰
最后修改: 2012-05-01 21:58:48

上一个主题: 自动装载资源 · 页首 · 用户指南首页 · 下一个主题: URI 路由


URI 路由 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 将匹配一个只包含有数字的segment(段).
:any 将匹配任何字符(可以是多个segment段).可以匹配多个值，如：
$route['product/(:any)'] = "catalog/product_lookup/$1/$2/$3/$4/$5";        //将整条url上的每一个参数全部传递给catalog控制器下的 product_lookup方法。

注意: 路由将会按照定义的顺序来运行.高层的路由总是优先于低层的路由.

例子

下面是一些简单的例子:

$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 方法.

你也可以混合使用通配符与正则表达式.

系统保留的路由

系统会保留两个路由：

第一个为系统默认的路由：

$route['default_controller'] = 'welcome';

这个路由表明了当URI中不包含要访问的类和控制器信息的（即只访问根目录的情况，如http://localhost/ci）将要加载哪个控制器。上例中,系统将加载 "welcome" 这个类（控制器）。你应该保证设置一个默认路由，不然你的首页将会显示 404 错误。

第二个为404页面的路由：

$route['404_override'] = '';

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

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

翻译贡献者: architectcom, caesarjuly, caincheung, chouqiuqiu, dren_a, Hex, IT不倒翁, lijun14992560, nardo, shnwqshnwq, ssxdw, test_88, 志明
最后修改: 2014-04-10 09:25:51

上一个主题: 公共函数 · 页首 · 用户指南首页 · 下一个主题: 错误处理


错误处理 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 错误处理

错误处理

在你的程序里使用以下的函数，CodeIgniter将允许你建立自己的错误报告。另外，他有一个错误记录类能够将错误和调试信息保存为文本文档。

注意: 在默认的情况下, CodeIgniter 会显示所有的PHP错误.　但是当你开发程序结束时，你可能想要改变这个情况. 你会发现在index.php文件顶端有这个函数error_reporting()，通过它可以进行对错误的设置。 即使你关闭了错误报告，当有错误发生时，错误记录也不会停止。

不像大多数系统, CodeIgniter的错误报告函数是一个简单的程序接口，可以在整个应用程序里使用。 不用考虑类或者是函数的范围，这种办法可以直接触发错误通知。

可以使用以下函数来产生错误消息:

show_error('消息' [, int $status_code = 500 ] [, string $heading = 'An Error Was Encountered'])

这个函数将会使用以下错误模版来显示错误消息:

application/errors/error_general.php

可选参数 $status_code 决定在显示错误的同时将会发送哪种 HTTP 状态代码。

可选参数 $heading 决定错误模版h1标签内容。

show_404('页面' [, 'log_error'])

这个函数将会使用以下错误模版来显示 404 错误信息:

application/errors/error_404.php

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

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

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" 文件夹是可写的,才能准确地将消息写入记录文件中。此外, 你必须设置application/config/config.php文件中的"threshold"设定，通过设置“threshold“，你可以只记录错误类型的消息，而不用记录其他两种。如果你将“threshold“设为0，记录就会被禁止。

翻译贡献者: aykirk, borisauschina, crgod, csfhc, Hex, IT不倒翁, tyronecai, walkbird, xjflyttp, 暗夜星辰, 笼中
最后修改: 2013-10-31 22:46:33

上一个主题: URI 路由 · 页首 · 用户指南首页 · 下一个主题: 页面缓存


页面缓存 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 页面缓存

网页缓存

Codeigniter 支持缓存技术，以达到最快的速度。

尽管CI已经相当高效了，但是网页中的动态内容、主机的内存CPU 和数据库读取速度等因素直接影响了网页的加载速度。 依靠网页缓存，你的网页可以达到近乎静态网页的加载速度，因为他们将程序输出的结果保存到硬盘上了。

缓存是怎么工作的？

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

注意：Benchmark 标签在使用了缓存的页面仍然可用。

启动缓存

启用缓存功能，只需要将下面的代码放入你的任何一个控制器(controller)的方法(function)内：

$this->output->cache(n);

其中 n 是你希望缓存更新的 分钟 数。可以使用 m/60 来精确到秒，例如 1/60 ，则是精确到 1秒

上面的代码可以放到任何一个 function 里面。他的出现顺序对缓存并没有影响，所以将它放在你认为最合乎逻辑的地方。一旦上面的代码放到了控制器的方法中，页面就会被缓存。

警告: 由于CI存储缓存文件的方式，只有通过 view 文件的输出才能被缓存。

注意: 在缓存文件产生之前，请确保 application/cache 文件夹可写。

清除缓存

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

翻译贡献者: Hex, IT不倒翁, jinhao7773, longbill, sunxch100
最后修改: 2011-06-04 19:23:41

上一个主题: 错误处理 · 页首 · 用户指南首页 · 下一个主题: 评测你的应用程序


调试你的应用程序 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 调试你的应用程序

调试你的应用程序

该分析器将在页面下方显示基准测试结果，运行过的 SQL 语句，以及 $_POST 数据。这些信息有助于开发过程中的调试和优化。

初始化类

注意: 此分析器无须手动初始化.如果已按照下面的方式激活,他将被输出类自动装载。

激活分析器

在控制器中设置以下方法以激活该分析器

$this->output->enable_profiler(TRUE);

分析器激活后将产生一个报告并插入您的页面底部

使用以下方法禁用该分析器:

$this->output->enable_profiler(FALSE);

设定基准点

为了让该分析器编译和显示你的测试数据，你必须使用特定的语法命名基准点。

请在基准测试类部分阅读关于设置基准点的资料。

启用和禁用分析数据中的字段

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

$config['config']          = FALSE;
$config['queries']         = FALSE;

另一种方法是：你可以在控制器中通过调用set_profiler_sections() 来覆盖全局设置和默认设置，详细可见： Output class:

$sections = array(
    'config'  => TRUE,
    'queries' => TRUE
    );

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

下表列出了可用的分析器数据字段和用来访问这些字段的key。

Key | Description | Default
benchmarks | 在各个计时点花费的时间以及总时间 | TRUE
config | CodeIgniter 配置变量 | TRUE
controller_info | 被调用的method及其所属的控制器类 | TRUE
get | 在request中传递的所有GET参数 | TRUE
http_headers | 本次请求的 HTTP 头 | TRUE
memory_usage | 本次请求消耗的内存（byte为单位） | TRUE
post | 在request中传递的所有POST参数 | TRUE
queries | 列出执行的数据库操作语句及其消耗的时间 | TRUE
uri_string | 本次请求的URI | TRUE
query_toggle_count | 指定显示多少个数据库查询语句，剩下的则默认折叠起来。 | 25

翻译贡献者: amos, chouqiuqiu, Hex, teamoustar
最后修改: 2013-03-23 03:19:52

上一个主题: 缓存 · 页首 · 用户指南首页 · 下一个主题: 管理应用程序


以 CLI 方式运行 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 以 CLI 方式运行

以CLI方式运行

除了可以在浏览器中通过URL调用一个 控制器 外，也可以通过命令行接口(CLI)调用。

  • 什么是CLI？
  • 为什么使用这种方式？
  • 它如何工作？

什么是CLI？

命令行接口是一种基于文本的和计算机交互的方式。 如果想查看更详细说明，请看Wikipedia article.

为什么使用命令行？

虽然不是必须的，但在某些情况下我们会用到命令行

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

让我们试一试：Hello World!

首先创建一个简单的控制器。使用你的文本编辑器，创建一个叫做 tools.php 的文件，并且输入如下代码：

然后将这个文件保存到你的 application/controllers/ 文件夹里。

现在正常情况下你可以通过你网站的 URL 来访问它：

example.com/index.php/tools/message/to

除此之外，我们也可以在 Mac/Linux 中打开终端，或者在 Windows 下进入“运行”输入“cmd”，并进入我们的 CodeIgniter 项目的目录。

$ cd /path/to/project;
$ php index.php tools message

如果你跟着一步步下来，你应该会看到 Hello World!。

$ php index.php tools message "John Smith"

这里我们像使用 URL 参数一样给它传递了一个参数。“John Smith”作为一个参数被传递了，并且输出也变成：Hello John Smith!。

就是这样！

简单的来说，这就是全部你需要知道的有关命令行中使用控制器的事情了。记住这只是一个普通的控制器，所以路由和 _remap 也照样工作。

翻译贡献者: baiyuxiong, csfhc, Hex, tinsn, upsuper, yinsigan
最后修改: 2013-11-02 07:39:23

上一个主题: CodeIgniter URL · 页首 · 用户指南首页 · 下一个主题: 保留字


管理你的应用程序 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 管理你的应用程序

管理你的应用程序

默认情况下，你会将应用程序放入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",你的应用程序文件夹的结构可能会像下面的这样:

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

要选择使用某个应用程序，你需要打开主 index.php 文件，并且设置 $application_folder 变量为目标路径。例如，通过如下设置，就可以选择使用 "foo" 应用程序:

$application_folder = "applications/foo";

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

翻译贡献者: aykirk, Hex, thankwsx, zhupeng
最后修改: 2011-01-31 18:04:05

上一个主题: 评测你的应用程序 · 页首 · 用户指南首页 · 下一个主题: PHP 替代语法


处理多环境 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 处理多环境

处理多环境

开发者通常希望就开发环境或者生产环境的不同而有不同的系统行为(响应)。 例如，输出冗长的错误对开发过程很有用，但是当项目上线时这可能会造成一些安全问题。

ENVIRONMENT 常量

默认情况下 CodeIgniter 把环境常量设置为 'development'. 在 index.php 文件的顶部，你会看到:

define('ENVIRONMENT', 'development');

除了影响一些基本框架行为外（查看下一章节）， 你还可以在开发过程中用这个常量来区分正在运行的是哪个环境。

对默认框架行为的影响

CodeIgniter 系统有些地方使用了 ENVIRONMENT 常量。 在这一章节会说明默认情况下环境常量对框架行为的影响。

错误报告

设置 ENVIRONMENT 常量为 'development' 值将会允许所有PHP错误报告都输出到浏览器。 相反的，设置常量为 'production' 将会禁止所有错误报告的输出。 在产品中禁用错误报告是一个 不错的安全措施。

配置文件

可选的，你可以让 CodeIgniter 加载特定环境的配置文件。 这可能会对管理如在多环境使用不同API密钥这样的事情很有用。 这在文档配置类“环境”一节有详细的说明。

翻译贡献者: Hex, xwjie
最后修改: 2012-02-11 00:32:10

上一个主题: 管理应用程序 · 页首 · 用户指南首页 · 下一个主题: PHP 替代语法


PHP 替代语法 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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; ?>

翻译贡献者: chenshenghan, csfhc, Hex, iiiiissss, laotan, levin
最后修改: 2013-11-02 08:00:20

上一个主题: 管理应用程序 · 页首 · 用户指南首页 · 下一个主题: 安全


安全 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 安全

安全

本页描述了一些关于 Web 安全的“最佳实践”，并详细说明了 CodeIgniter 的内部安全特性。

URI 安全

CodeIgniter 严格限制 URI 中所能包含的字符，以此帮助你设计的程序减少被恶意数据入侵的可能。URI 一般只包含下列内容：

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

Register_globals

系统初始化期间所有的全局变量都被 unset，除了那些在 $_GET、$_POST 和 $_COOKIE 数组中的数据。实际上 unsetting 实例程序的作用与register_globals = off 相同。

error_reporting

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

在 index.php 设置CodeIgniter的 ENVIRONMENT 常量为 'production' 将会关闭这些错误(报告)。在开发模式下，推荐设为 'development'。 更多关于各环境间区别的信息可以在处理多环境一章找到。

magic_quotes_runtime

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

最佳实践

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

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

CodeIgniter 提供了下列函数以辅助这个过程:

  • XSS 过滤

    CodeIgniter带有一个跨站脚本过滤器. 这个过滤器会查找那些用通常手段嵌入到你数据中恶意的Javascript,或其它一些试图欺骗cookie类型的或者做其它恶意事情的代码. XSS Filter的详细描述在 这里.

  • 验证数据

    CodeIgniter 有一个表单验证类用来帮助验证、过滤和预处理数据。

  • 插入数据库之前转义所有数据

    不要插入未转义的信息到你的数据库中。要了解更多信息请参阅查询章节。

翻译贡献者: Hex, IT不倒翁, lishen2, shnwqshnwq, xwjie
最后修改: 2012-02-11 00:35:08

上一个主题: PHP 替代语法 · 页首 · 用户指南首页 · 下一个主题: 开发规范


开发规范 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 开发规范

常用风格和语法

下面将描述采用CI开发中的编码的规范.

内容列表

  • 文件格式
  • PHP 闭合标签
  • 类和方法的命名
  • 变量命名
  • 注释
  • 常量
  • TRUE, FALSE, 和NULL
  • 逻辑运算符
  • 比较返回值和类型映射
  • 调试代码
  • 空行分割
  • 兼容性
  • 用常规词做类名和文件名
  • 数据库表名
  • 一个文件一个类
  • 空白
  • 断行
  • 代码缩进
  • Bracket and Parenthetic Spacing
  • Localized Text
  • 私有方法和变量
  • PHP 错误
  • 短标签
  • 每行一条语句
  • 字符串
  • SQL 查询
  • 缺省函数参数

文件格式

文件应该使用 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闭合标签，并插入一段注释来标明这是文件的底部并定位这个文件在这个应用的相对路径。这样有利于你确定这个文件已经结束而不是被删节的。

不当的: <?php echo "Here's my code!"; ?> 适当的: <?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 __construct()
 {

 }
}

不当的和适当的方法名称的示例：

不当的:
function fileproperties()  // 方法名没有清晰的描述以及下划线分割单词
function fileProperties()  // 方法名没有清晰的描述以及使用了驼峰法命名
function getfileproperties()  // 还可以!但是忘记了下划线分割单词
function getFileProperties()  // 使用了驼峰法命名
function get_the_file_properties_from_the_file() // 方法名太冗长

适当的:
function get_file_properties() // 清晰的方法名描述，下划线分割单词，全部使用小写字母

变量命名

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

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

常量

常量命名除了要全部用大写外，其他的规则都和变量相同。在适当的时候，始终使用CodeIgniter常量，例如LASH, LD, RD, PATH_CACHE等等.

不当的: myConstant // 未使用下划线分割单词，未全部使用大写字母 N // 不能使用单个字母作为常量 S_C_VER // 常量名没有清晰的含义 $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))

比较返回值与类型映射

部分PHP函数执行失败时返回 FALSE, 但也可能有一个有效的返回值 "" 或 0, 它在松散比较中会被计算为FALSE. 在条件语句中使用这些返回值的时候，为了确保返回值是你所预期的类型而不是一个有着松散类型的值，请进行显式的比较。

在返回和检查你自己的变量时也要遵循这种严格的方法，必要时使用=== 和 !==。

不当的:
// 如果 'foo' 位于此字符串的起始处，strpos将返回 0,
// 此处条件判断的结果为TRUE
if (strpos($str, 'foo') == FALSE)

恰当的:
if (strpos($str, 'foo') === FALSE)

不当的:
function build_string($str = "")
{
 if ($str == "") // uh-oh!  如果传递的参数是FALSE或者整数0那会怎么样?
 {

 }
}

恰当的:
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":

试译：另见类型映射的信息，也会非常有用。类型映射的结果稍微有些不同，但也是可用的。比如，你把一个变量映射为字符串的时候，NULL以及布尔值FALSE会变成空字符串，0(以及其它数字)变成包含数字的字符串，布尔值TRUE变成 "1":

$str = (string) $str; // 将 $str 映射为字符串

调试代码

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.

试译：在已提交的附加组件所在的地方不能有调试代码，它们被注释掉的情况除外，例如，创建附加组件时不能调用 var_dump(), print_r(), die(), 以及 exit() ，除非它们已经被注释掉了。

// print_r($foo);

文件中的空格

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.

试译：在PHP开始标记之前和结束标记之后都不能有空格。输出已经被缓存，所以文件中的空格会导致CodeIgniter在输出自己的内容之前就开始了输出，这会使CodeIgniter出错且无法输出正确的header。在下面的例子中，使用鼠标选中这些文本，你就能看到那些不应该有的空格。

不当的:

<?php // ...在PHP开始标记上面有空格和换行符 // 并且在PHP结束标记后面也有空格 ?>

恰当的:

<?php // 本例中，PHP开始标记之前和结束标记之后就没有空格 ?>

兼容性

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.

试译：除非你的附加组件的文档中有特别说明，否则所有代码必须与PHP 5.1以上版本兼容。此外，不要使用那些依赖于非默认安装的库的函数，除非你的代码中包含了该函数不可用时的替代方法，或者你在文档中明确说明了你的附加组件需要某些库。

使用常见词语来命名类和文件

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.

试译：当你的类或文件名是一个常见词语时，或者是很可能与另一个PHP脚本同名时，使用一个唯一的前缀来避免冲突。你必须始终明白这一点：你的最终用户可能会运行其它第三方的附加组件或者PHP脚本。选择一个能够唯一标识开发者或公司的前缀。

不当的: class Email pi.email.php class Xml ext.xml.php class Import mod.import.php 恰当的: class Pre_email pi.pre_email.php class Pre_xml ext.pre_xml.php class Pre_import mod.pre_import.php

数据库表名

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.

你的附加组件所用到的任何表都必须使用 'exp_' 这个前缀，然后是一个能够唯一标识开发者或公司的前缀，最后才是一个简短的描述性的表名。你不需要担心用户安装时所使用的数据库前缀，因为CodeIgniter的数据库类将根据实际情况自动地对 'exp_' 进行转换。

不当的: email_addresses // 缺少这两个前缀 pre_email_addresses // 缺少 exp_ 前缀 exp_email_addresses // 缺少唯一前缀 恰当的: 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

说明： 请注意MySQL对表名的限制是不能多于64个字符。会超出这个限制的那些表名都是不合理的，因此这应该不是问题。例如，下面的这个些表名比最大限制多出一个字符。这很傻，不是吗？ 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.

对于你的附加组件所使用的类应当遵循一个文件一个类的原则，除非这些类是紧密相关的。CodeIgniter的文件中包含多个类的一个例子是数据库类文件，其中包含了DB类和DB_Cache类，还有Magpie插件，其中包含了Magpie和Snoopy类。

空格

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.

在代码中使用tab代替空格。这虽然看起来像是小事，但是使用tab代替空格有利于那些阅读你的代码的开发者在他们各自所使用的应用程序中自定义缩进方式。此外还有一个好处是，使用这种方式保存的文件稍微紧凑一点。

换行

文件必须使用Unix换行符保存。这对于那些在Windows下的开发者来说更为重要，但无论如何，确保你的文本编辑器已经设置为使用Unix换行符来保存文件。

代码缩进

使用 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++)
 {
  // ...
 }
}

方括号及圆括号内的空格符

通常情况下，不要在方括号"[]"和圆括号"()"内增加任何空格符。唯一的例外就是为了提高可读性和区别开它们与函数，在接受参数的PHP语法控制结构所使用的括号里，需要增加空格符(declare, do-while, elseif, for, foreach, if, switch, while)。

不恰当的: $arr[ $foo ] = 'foo'; 正确的: $arr[$foo] = 'foo'; // 数组键值的方括号内没有空格 不恰当的: function foo ( $bar ) { } 正确的: function foo($bar) // 函数声明的圆括号内没有空格 { } 不恰当的: foreach( $query->result() as $row ) // PHP语法控制结构之后有空格，但不是在圆括号内 正确的: foreach ($query->result() as $row)

本地化文本

Any text that is output in the control panel should use language variables in your lang file to allow localization.

所有在控制面板输出的文本都应该使用 lang 文件里的语言变量来允许本地化。

INCORRECT: return "Invalid Selection"; CORRECT: return $this->lang->line('invalid_selection');

私有方法和变量

代码里像一些只是为了被类里其他公开函数所调用而封装的工具/辅助类方法，应该以一个下划线做前缀来命名。

convert_text() // 公开方法 _convert_text() // 私有方法

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

短标记

一直使用 PHP 完整标记，以免服务器不支持短标记，也就是未打开 short_open_tag 。（IT不倒翁注释：这条已经不成立，因为新版本的 CI 已经解决了服务器不支持短标记的问题，不过还是建议使用完整标记）

不正确的: <? echo $foo; ?> <?=$foo?> 正确的: <?php echo $foo; ?>

每行一条语句

切记不要在一行写多条语句

不正确:
$foo = 'this'; $bar = 'that'; $bat = str_replace($foo, $bar, $bag);

正确:
    $foo = 'this';
$bar = 'that';
$bat = str_replace($foo, $bar, $bag);

字符串

一直使用单引号除非你需要解析变量，如果需要解析变量请使用大括号， to prevent greedy token parsing. 如果字符串包含单引号的话你可以使用双引号，这样就不用转义了。

INCORRECT: "My String" // 没有解析变量，不需要使用双引号 "My string $foo" // 解析变量需要使用括号 'SELECT foo FROM bar WHERE baz = \'bag\'' // 需要转义单引号''时这样写比较难看，可以使用双引号 CORRECT: 'My String' "My string {$foo}" "SELECT foo FROM bar WHERE baz = 'bag'"

SQL 查询

MySQL的关键词都是大写: SELECT, INSERT, UPDATE, WHERE, AS, JOIN, ON, IN, 等。

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

不正确的: //
关键词是小写并且一行中的查询太长（...表示行的继续）
$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");
正确的:
$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");

缺省函数参数

适当的时候，提供函数参数的缺省值，这有助于防止因错误的函数调用引起的PHP错误，另外提供常见的备选值可以节省几行代码 例如:

function foo($bar = '', $baz = FALSE)

翻译贡献者: alsove, bnlt, chenshenghan, crazyfriday, fzdxstf, Hex, ianyang, IT不倒翁, levin, neversaylate, shallow, xxx1052, yinzhili, 杜建宇, 笼中
最后修改: 2014-01-10 13:48:32

上一个主题: 安全 · 页首 · 用户指南首页


快速参考图 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 快速参考图

快速参考图

此图的 PDF 版本，单击这里。

翻译贡献者: Hex
最后修改: 2014-06-10 13:44:58

页首


基准测试类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

更多信息请参考 调试你的应用程序 .

显示总的执行时间

如果你想显示从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}

翻译贡献者: drazzi, Hex, levin, Roger_masslong
最后修改: 2012-11-14 15:13:24

上一个主题: 安全 · 页首 · 用户指南首页 · 下一个主题: 日历类


日历类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 | 模板字符串。参考下面的模版部分。
local_time | time() | None | 当前时间的 Unix 时间戳。
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
最后修改: 2013-03-24 02:28:26

上一个主题: 基准测试类 · 页首 · 用户指南首页 · 下一个主题: 购物车类


购物车类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 购物车类

购物车类

购物车类允许项目被添加到session中，session在用户浏览你的网站期间都保持有效状态。这些项目能够以标准的 "购物车" 格式被检索和显示，并允许用户更新数量或者从购物车中移除项目。

请注意购物车类只提供核心的"购物车"功能。它不提供配送、信用卡授权或者其它处理组件。

初始化购物车类

重要：购物车类利用 CodeIgniter 的 Session 类把购物车信息保存到数据库中，所以在使用购物车类之前，你必须根据 Session 类文档中的说明来创建数据库表，并且在 application/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) 是可选的。当你的商品包含一些相关的选项信息时，你就可以使用它。正如上面所显示的那样，请使用一个数组来保存选项信息。注意：$data['price'] 的值必须大于0

五个保留的索引分别是:

  • id - 你的商店里的每件商品都必须有一个唯一的标识符(identifier)。典型的标识符是 "sku"(译者注：库存量单位) 或者其它类似的标识符。
  • qty - 购买的数量(quantity)。
  • price - 商品的价格(price)。
  • name - 商品的名称(name)。
  • options - 标识商品的任何附加属性。必须通过数组来传递。

除以上五个索引外，还有两个保留字：rowid 和 subtotal。它们是购物车类内部使用的，因此，往购物车中插入数据时，请不要使用这些词作为索引。

你的数组可能包含附加的数据。你的数组中包含的所有数据都会被存储到session中。然而，最好的方式是标准化你所有商品的数据，这样更方便你在表格中显示它们。

如果成功的插入一条数据后，insert()方法将会返回一个id值（$rowid）

将多个项目添加到购物车

通过下面这种多维数组的方式，可以一次性添加多个产品到购物车中。当你希望允许用户选择同一页面中的多个项目时，这就非常有用了。

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

以数组的形式返回特定商品的选项信息。本函数被设计为与 $this->cart->contents() 一起在循环中使用，因此就像上面的 显示购物车 范例所显示的那样，你必须把 rowid 传递给这个函数。

$this->cart->destroy();

允许你销毁购物车。这个函数一般是在你处理完用户订单后调用。

第三方扩展

修改购物车options数组中内容

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

http://codeigniter.org.cn/forums/thread-15485-1-1.html

翻译贡献者: Hex, morpheus, yinzhili, yz20sui, 曜日晨阳
最后修改: 2013-06-02 17:54:22

上一个主题: 日历类 · 页首 · 用户指南首页 · 下一个主题: 配置类


配置类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

配置类

该配置类提供一种方法来进行偏好设置。该偏好来源于默认的配置文件(application/config/config.php) 或您自己定制的配置文件。

注意：该类已经自动加载而无需手动启用。

分析配置文件

默认情况下，CodeIgniter已经有一个主要的配置文件，位于application/config/config.php。如果你用文本编辑器打开你会看到配置项目被存储在一个叫$config的数组里。

您可以添加您自己的配置项目到这个文件里，或者您更愿意让您自己的配置项目与原配置项目分开（假设你需要额外的配置项），简单的创建一个文件并保存到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 是改变后的值.

注意：这里修改的配置元素并不是改变配置文件(application/config/config.php)的值，仅改变当前$this->config->item()方法取到的值

环境

你可以根据当前的开发/服务环境读取不同的配置文件. ENVIRONMENT 常量在 index.php 定义, 在 处理多环境 一章有详细的描述和说明.

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

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

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

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

你可以放置以下配置文件到特定环境的文件夹:

  • 默认的 CodeIgniter 配置文件
  • 你自己的用户配置文件

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

辅助函数

配置类有以下辅助函数:

$this->config->site_url();

该函数得到你网站的 URL，其中包含了你在 config 文件中设置的 "index" 的值。

$this->config->base_url();

该函数返回站点的根 URL，可以在这个函数后拼接一个 URL 路径，用以生成 CSS 或图片文件的 URL。

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

$this->config->system_url();

该函数得到 system 文件夹的 URL。

翻译贡献者: airwin, aykirk, borisauschina, Hex, localtest, skey, szlinz, tanqimin, tinsn, xwjie, zhupeng, 暗夜星辰
最后修改: 2013-08-05 11:33:15

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


Email 类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › Email 类

Email 类

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

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

发送邮件

发送邮件不仅简单，而且可以发送时进行配置或者将参数放到配置文件中。

这里是一个发送邮件的标准示例。注意：该示例是假定使用一个控制器来发送邮件。

$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 的实际路径。protocol 为 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()

添加附件。第一个参数是相对于入口文件的文件路径/文件名（不能写成'/path/photo1.jpg'). 注意: 是路径而不是URL。多次使用该函数可以添加多个附件:

$this->email->attach('path/photo1.jpg');
$this->email->attach('path/photo2.jpg');
$this->email->attach('path/photo3.jpg');

$this->email->send();

$this->email->print_debugger()

返回包含邮件内容的字符串，包括EMAIL头和EMAIL正文。用于调试。

取消自动换行

如果你启用自动换行(建议遵循 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, csfhc, ekawayi, Hex, ianyang, imjie, kele_87, larryli, roln, sygb, xjflyttp, xluohome, yinzhili, yygcom
最后修改: 2014-02-26 22:19:14

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


加密类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 加密类

加密类

数据加密类提供了双向数据加密方式。加密类使用 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);

如果你不想使用配置文件中的密钥，你可以通过可选的第二个参数随意设置你的密钥。

$msg = 'My secret message';
$key = 'super-secret-key';

$encrypted_string = $this->encrypt->decode($msg, $key);

$this->encrypt->set_cipher();

允许你设置一个 Mcrypt 算法。默认使用 MCRYPT_RIJNDAEL_256。例如：

$this->encrypt->set_cipher(MCRYPT_BLOWFISH);

请访问 php.net 看一下可用的算法。

如果你想手动测试一下你的服务器是否支持 Mcrypt，你可以使用：

echo ( ! function_exists('mcrypt_encrypt')) ? 'Nope' : 'Yup';

$this->encrypt->set_mode();

允许你设置一个 Mcrypt 模式。默认使用 MCRYPT_MODE_CBC。例如：

$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，你可以使用别人提供的函数。

$this->encrypt->encode_from_legacy($orig_data, $legacy_mode = MCRYPT_MODE_ECB, $key = '');

允许你重新加密由Codeigniter 1.x版本加密过的数据，以便与CodeIgniter 2.x中的加密类匹配。只有当加密过的数据已经在数据库或者文件当中存储，同时所在服务器支持Mcrypt的时候才会用到这个函数。"Light" use encryption such as encrypted session data or transitory encrypted flashdata require no intervention on your part. However, 已经存在的加密session会被销毁 since data encrypted prior to 2.x will not be decoded.

为什么只有重新加密的方式而不是继续支持原有的加密和解密方式呢？CodeIgniter 2.x中的加密库算法无论是性能还是安全性都有了很大的进步，因此我们不希望继续支持大家使用原有的加密方法。当然，如果你有需求，可以自行扩展加密库并添加原来的加密方式以便无缝兼容CodeIgniter 1.x，但作为一个开发者，这样的决定还是谨慎点，多想想好啊。

$new_data = $this->encrypt->encode_from_legacy($old_encrypted_string);
参数 | 默认值 | 介绍
$orig_data | n/a | 原始数据，用CodeIgniter 1.x加密过的
$legacy_mode | MCRYPT_MODE_ECB | 生成原始数据的Mcrypt加密模式。CodeIgniter 1.x的默认加密方式是MCRYPT_MODE_ECB, 在没有通过参数设定方式的时候就会默认采用这个方式。
$key | n/a | 加密密钥. 这个值通常在配置文件里面。

翻译贡献者: baiyuxiong, binota, csfhc, Hex, popcorner, qixingyue, zhupeng, 志明
最后修改: 2014-06-10 14:01:25

上一个主题: Email 类 · 页首 · 用户指南首页 · 下一个主题: 文件上传类


文件上传类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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:
//【如果你在 config文件夹内的 autoload.php 文件中自动加载了 upload 类，或者在构造函数内加载了的话，可以调用初始化函数 initialize 来加载设置。————本括号内由IT不倒翁翻译，加入了自己的理解】
$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将会在新文件的文件名后面加一个数字。
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
    [client_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 | 上传的文件最初的文件名。这只有在设置上传文件重命名（encrypt_name）时才有效。
client_name | 上传的文件在客户端的文件名。
file_ext | 文件扩展名（包括‘.’）
file_size | 图像大小，单位是kb
is_image | 是否是图像。 1 =是图像。 0 = 不是图像。
image_width | 图像宽度.
image_height | 图像高度
image_type | 文件类型，即文件扩展名（不包括‘.’）
image_size_str | 一个包含width和height的字符串。用于放在一个img标签里。

翻译贡献者: cnmiss, csfhc, helingjun2008, Hex, IT不倒翁, lishen2, roln, szlinz, thankwsx, wangyueqiang, yinzhili
最后修改: 2013-11-06 08:08:53

上一个主题: 加密类 · 页首 · 用户指南首页 · 下一个主题: 表单验证类


表单验证 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 表单验证

表单验证详解

CodeIgniter 提供了一个全面的表单验证和数据预处理类以帮助缩减你所写的代码。

  • 概述
  • 表单验证指南
    • 表单
    • 成功页面
    • 控制器
    • 设置验证规则
    • 使用一个数组设置验证规则
    • 级联规则（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]|is_unique[users.username]');
$this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[users.email]');

上面的代码设置了一组规则:

  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()函数中包含每个表单域的名字！

现在刷新你的页面并提交表单产生一个错误。你的表单域应该被重新填写了。但是，只能重新填充设置了规则(rules)的表单域。

注意:1.下面的 函数参考 节包含了可以让你重填下拉菜单，单选框和复选框的函数。

重要提示: 如果你使用一个数组作为一个表单域的名字，你必须为函数提供给它一个数组。例如：

<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_"前缀并放在验证规则里。如果你需要在你的回调函数中调用一个额外的参数，你只需要在回调函数后面用[]把参数（这个参数只能是字符串类型）括起来, 例如: "callback_foo[bar]", 其中bar将成为你的回调函数中的第二个参数.【译者注：第一个参数是input的value值】

注意：你也可以处理并返回传递给你的回调函数中的表单数据。如果你的回调函数返回了除布尔型的TRUE/FALSE外的任何值，它将被假定数据是你新处理过的表单数据。

设置错误信息

所有自身的错误信息位于下面的语言文件中：language/english/form_validation_lang.php

要设置你的自定义信息你可以编辑那个文件，或使用下面的函数：

$this->form_validation->set_message('rule', 'Error Message');

其中 rule 是该条定义规则的名称，Error Message 该规则会显示的错误文本。

如果你在错误信息中包含了 %s，它将插入显示出你在表单域中设置的别名。

在上面回调的例子中，, 错误信息是通过传送函数名称返回的:

$this->form_validation->set_message('username_check')

你也可以重写语言文件中的错误信息. 例如, 你可以这么做来改变"required" 规则的信息:

$this->form_validation->set_message('required', 'Your custom message here');

翻译表单域名称

如果你希望将传递给 set_rules() 函数的自然语言参数存储在一个语言文件中——使他们有一个或多个翻译版本，你可以这么做：

首先，给当前表单域自定义一个key值（通常就是表单标签的name），然后添加上lang:前缀，如下：

$this->form_validation->set_rules('first_name', 'lang:first_name', 'required');

然后，以如下语言数组（数组的key值不必包含lang前缀）的形式保存在你的语言文件中：

$lang['first_name'] = 'First Name';

注意: 开发者自定义的语言文件数组（如上例）不会自动被CI加载，你需要在控制器中手动加载：

$this->lang->load('file_name');

关于语言文件的具体设置和加载请参考 语言类 说明。

更改错误定界符

在默认情况下，表单验证类会使用 (<p>) 标签来分割每条错误信息，以达到分段效果。你可以自行对其进行定义。

  1. 定界符统一更改

    如果需要全局更改错误定界符， 可以在你的控制器中，在表单验证类加载之后添加如下代码：

    $this->form_validation->set_error_delimiters('<div class="error">', '</div>');

    在此例中，我们将定界符由系统默认的 <p> 更改为一个div标签。

  2. 定界符单独更改

    表单验证类所提供的两种显示错误验证信息的函数，分别可以通过如下方法来设置它们的定界符：

    <?php echo form_error('field name', '<div class="error">', '</div>'); ?>

    或者：

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

独立显示错误

如果你喜欢紧挨着每个表单域显示错误信息而不是显示为一个列表，你可以使用 form_error() 函数。

试一下！更改你的表单代码为下面这样：

如果没有错误信息，将不会显示。如有错误信息，会在输入框旁单独显示。

注意: 如果你的表单域名称使用的是数组形式，你必须提供该完整的数组函数。 例如：

<?php echo form_error('options[size]'); ?>
<input type="text" name="options[size]" value="<?php echo set_value("options[size]"); ?>" size="50" />

如要了解更多，请参阅 使用数组作为表单字段名称 。

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

表单验证类的一个超拽的特性是它允许你将整个应用的所有验证规则存储到一个配置文件中。你可以组织这些规则到“组”里。这些组既可以在符合controller/function的调用时自动加载，也可以在用到时你手动调用。

怎样保存你的规则

如果想要将验证规则保存在独立的文件中，你首先需要在 application/config/ 文件夹下创建一个名称为 form_validation.php的文件。 然后，将验证规则的配置信息保存在数组 $config 中即可，具体格式如下：

$config = array(
               array(
                     'field'   => 'username',
                     'label'   => 'Username',
                     'rules'   => 'required'
                  ),
               array(
                     'field'   => 'password',
                     'label'   => 'Password',
                     'rules'   => 'required'
                  ),
               array(
                     'field'   => 'passconf',
                     'label'   => 'Password Confirmation',
                     'rules'   => 'required'
                  ),
               array(
                     'field'   => 'email',
                     'label'   => 'Email',
                     'rules'   => 'required'
                  )
            );

当用户触发 run() 函数时，你的验证规则会自动被控制器加载和调用。

注意：请务必要将数组名称定义成 $config.

创建多组验证规则

为了创建多组验证规则，我们需要将它们放置到子数组中。请参考下面的例子，在此例中我们设置了两组规则，组名称分别是 "signup" 和 "email"。 当然，在实际开发中，你可以根据自己的需求任意命名：

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

调用某组验证规则

当同时存在多组规则时，为了调用某一组规则，你需要将组的名字传递给 run() 函数。 比如， 要调用上例中"signup"组下面的规则，你应该这么做：

if ($this->form_validation->run('signup') == FALSE)
{
   $this->load->view('myform');
}
else
{
   $this->load->view('formsuccess');
}

将控制器和验证组关联在一起

调用某一特定验证规则组的另一方法（更自动化）：将规则组的名称定义为你要关联的控制器类/函数(class/function)名称。举例来说，假设你有一个控制器名称叫做 Member，它下面有个函数叫做 signup。那么，你的控制器可能会这么写：

<?php

class Member extends CI_Controller {

   function signup()
   {
      $this->load->library('form_validation');

      if ($this->form_validation->run() == FALSE)
      {
         $this->load->view('myform');
      }
      else
      {
         $this->load->view('formsuccess');
      }
   }
}
?>

在你的验证配置文件中，你需要将你的规则组命名为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'
                                         )
                                    )
               );

当验证规则组的名称符合”控制器类名称/函数名称“(class/function)条件时，那么在 run() 函数被执行时，它所对应的规则会自动被调用。

使用数组作为表单字段名称

表单验证类支持表单字段的名称为数组，比如：

<input type="text" name="options[]" value="" size="50" />

如果你将表单字段名称定义为数组，那么在使用 Helper函数时，你必须传递给他们与字段名称一样的数组名。对应此表单字段的验证规则也同样遵循此规则。

比如，在设置此类表单字段时，你可能会用到：

$this->form_validation->set_rules('options[]', 'Options', 'required');

或者，在显示此类表单字段的验证错误信息时，你需要使用：

<?php echo form_error('options[]'); ?>

同样的，在预填充此字段的值时使用：

<input type="text" name="options[]" value="<?php echo set_value('options[]'); ?>" size="50" />

你还可以使用多维数组作为表单字段的名称，比如

<input type="text" name="options[size]" value="" size="50" />

甚至使用：

<input type="text" name="sports[nba][basketball]" value="" size="50" />

和上个例子一样，在helper函数中，你必须使用同样的名称：

<?php echo form_error('sports[nba][basketball]'); ?>

如果你选择使用那些支持多个选项的表单字段，比如checkbox，别忘了在名称之后加上空的方括号。只有这样，当用户提交表单时，所有的选项值就会被添加到 POST 数组当中：

<input type="checkbox" name="options[]" value="red" />
<input type="checkbox" name="options[]" value="blue" />
<input type="checkbox" name="options[]" value="green" />

或者你使用的时多维数组：

<input type="checkbox" name="options[color][]" value="red" />
<input type="checkbox" name="options[color][]" value="blue" />
<input type="checkbox" name="options[color][]" value="green" />

当你使用helper函数时，也同样需要添加方括号：

<?php echo form_error('options[color][]'); ?>

规则参数列表

以下列表将列出可被使用的原生规则

规则 | 参数 | 描述 | 举例
required | No | 如果元素为空，则返回FALSE |
matches | Yes | 如果表单元素的值与参数中对应的表单字段的值不相等，则返回FALSE | matches[form_item]
is_unique | Yes | 如果表单元素的值与指定数据表栏位有重复，则返回False（译者注：比如is_unique[User.Email]，那么验证类会去查找User表中Email栏位有没有与表单元素一样的值，如存重复，则返回false，这样开发者就不必另写Callback验证代码。） | is_unique[table.field]
min_length | Yes | 如果表单元素值的字符长度少于参数中定义的数字，则返回FALSE | min_length[6]
max_length | Yes | 如果表单元素值的字符长度大于参数中定义的数字，则返回FALSE | max_length[12]
exact_length | Yes | 如果表单元素值的字符长度与参数中定义的数字不符，则返回FALSE | exact_length[8]
greater_than | Yes | 如果表单元素值是非数字类型，或小于参数定义的值，则返回FALSE | greater_than[8]
less_than | Yes | 如果表单元素值是非数字类型，或大于参数定义的值，则返回FALSE | less_than[8]
alpha | No | 如果表单元素值中包含除字母以外的其他字符，则返回FALSE |
alpha_numeric | No | 如果表单元素值中包含除字母和数字以外的其他字符，则返回FALSE |
alpha_dash | No | 如果表单元素值中包含除字母/数字/下划线/破折号以外的其他字符，则返回FALSE |
numeric | No | 如果表单元素值中包含除数字以外的字符，则返回 FALSE |
integer | No | 如果表单元素中包含除整数以外的字符，则返回FALSE |
decimal | No | 如果表单元素中包含非十进制数字时，则返回FALSE |
is_natural | No | 如果表单元素值中包含了非自然数的其他数值 （其他数值不包括零），则返回FALSE。自然数形如：0,1,2,3....等等。 |
is_natural_no_zero | No | 如果表单元素值包含了非自然数的其他数值 （其他数值包括零），则返回FALSE。非零的自然数：1,2,3.....等等。 |
valid_email | No | 如果表单元素值包含不合法的email地址，则返回FALSE |
valid_emails | No | 如果表单元素值中任何一个值包含不合法的email地址（地址之间用英文逗号分割），则返回FALSE。 |
valid_ip | No | 如果表单元素的值不是一个合法的IP地址，则返回FALSE。通过可选参数"IPv4"或"IPv6"来指定 IP 地址格式。 |
valid_base64 | No | 如果表单元素的值包含除了base64 编码字符之外的其他字符，则返回FALSE。 |

注意: 这些规则也可以作为独立的函数. 例如:

$this->form_validation->required($string);

注意: 你也可以用适合参数的本地PHP系统函数.

过滤函数

下面是可用的过滤函数:

名称 | 参数 | 功能描述
xss_clean | No | 通过 XSS 过滤函数来运行数据, 详细说明见 Input 类.
prep_for_form | No | 将特殊字符的转换，以便可以在表单域中显示 HTML 数据，而不会破坏它。.
prep_url | No | 当URL丢失"http://" 时，添加"http://".
strip_image_tags | No | 将图像的html代码当中的URL提取出来。
encode_php_tags | No | Converts PHP tags to entities.

注意:你也可以在这里使用任何自身接收一个参数的PHP函数，例如trim, htmlspecialchars, urldecode, 等。

函数（方法）参考

下面的这些方法是让你在控制器里使用的。

$this->form_validation->set_rules();

允许您设置验证规则，如在本教程上面的章节中描述的：

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

$this->form_validation->run();

运行验证程序。成功返回TRUE，失败返回FALSE。您可以选择通过功能验证组的名称，例如：将一系列验证规则保存到一个配置文件.

$this->form_validation->set_message();

允许您设置自定义错误消息。看上面的设置错误信息

辅助函数参考

以下函数在调用form时自动加载无需手动载入。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.【译者注：所有使用下列函数的表单项都必须有验证规则，规则可以为''，或者为简单的trim函数，不可为NULL】

form_error()

给这个函数提供一个表单名称，它就可以显示出对应表单存在的错误（如果有的话）。例如：

<?php echo form_error('username'); ?>

错误定界符是可供修改的。请看上面的更改错误定界符介绍。

validation_errors()

通过字符形式显示所有错误信息。例如：

<?php echo validation_errors(); ?>

错误定界符是可供修改的。请看上面的更改错误定界符介绍。

set_value()

这个函数可以用来设置input或textarea表单的值。函数的第一个参数为必填项，代表字段名称；第二个参数是可选的，用于设置表单的默认值。例如：

<input type="text" name="quantity" value="<dfn><?php echo set_value('quantity', '0'); ?></dfn>" size="50" />

上面的表单第一次加载的时候会显示“0”。

set_select()

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

例如：

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

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

set_checkbox()

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.

此函数与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'); ?> />

翻译贡献者: 739122706, as3291363, baiyuxiong, carboo, chenshenghan, cnsaturn, dimitry, Fanbin, goocarlos, Hex, huangnaiang, IT不倒翁, mchipengfei, niudongwei, popcorner, rockey329, savioryu, skidu, soyota, wangyueqiang, wnpers, xgdd1987, yuwen002, 上官元恒, 我是我, 暗夜星辰, 曜日晨阳, 笼中
最后修改: 2014-06-10 14:05:52

上一个主题: 文件上传类 · 页首 · 用户指南首页 · 下一个主题: FTP 类


FTP 类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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。

$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模式，将根据源文件的扩展名来自动选择传输模式。

设置权限，你可以将一个octal (八进制)的权限值通过第四个参数传递过去。

$this->ftp->download()

从你的服务器下载文件。你必须提供远程路径和本地路径，设置什么模式是可选的。例：

$this->ftp->download('/public_html/myfile.html', '/local/path/to/myfile.html', 'ascii');

Mode options are: ascii, binary, and auto (the default). If auto is used it will base the mode on the file extension of the source file.

如果下载失败返回 FALSE (包括 PHP 没有写入文件的权限的情况)

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

允许你在服务器上创建一个目录。请给出你想要创建的目录的完整路径，截止到你要创建的目录名，并在末尾添加斜线结束。你还可以在第二个参数中传递一个八进制的权限值。

// 创建一个名为"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, IT不倒翁, tg8866, yinzhili, yygcom
最后修改: 2012-02-06 00:44:15

上一个主题: 表单验证类 · 页首 · 用户指南首页 · 下一个主题: HTML 表格类


HTML 表格类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › HTML 表格类

HTML 表格类

表格类提供了多个函数，允许你从数组或者数据库结果集中自动生成HTML表格。

初始化类

像CodeIgniter的其它类一样, 在控制器中使用$this->load->library 函数来初始化表格类:

$this->load->library('table');

一旦被加载,可以这样建立一个表格库对象的实例: $this->table

例子

此例演示如何通过一个多维数组（multi-dimensional array）自动生成表格。 注意:数组的第一个索引将成为表头(或者你可以通过set_heading()函数自定义表头)。

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

函数参考

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

如果你想要单独设置一个单元格的属性，你可以使用一个关联数组。关联键名 'data' 定义了这个单元格的数据。其它的键值对 key => val 将会以 key='val' 的形式被添加为该单元格的属性:

$cell = array('data' => 'Blue', 'class' => 'highlight', 'colspan' => 2);
$this->table->add_row($cell, 'Red', 'Green');

// 生成
// <td class='highlight' colspan='2'>Blue</td><td>Red</td><td>Green</td>

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

$this->table->function

允许你指定一个本地的PHP方法或一个有效的方法应用到所有的单元格中的数据的数组对象。

$this->load->library('table');

$this->table->set_heading('Name', 'Color', 'Size');
$this->table->add_row('Fred', '<strong>Blue</strong>', 'Small');

$this->table->function = 'htmlspecialchars';
echo $this->table->generate();

在上面的例子中，所有单元格中的数据都可以通过PHP的htmlspecialchars()方法实现html转义，其结果如下：

<td>Fred</td><td>&lt;strong&gt;Blue&lt;/strong&gt;</td><td>Small</td>

翻译贡献者: architectcom, bnlt, Hex, huangnaiang, KilluaVX, tanqimin, vidon, Xwoder, yinzhili
最后修改: 2011-11-22 09:47:50

上一个主题: FTP 类 · 页首 · 用户指南首页 · 下一个主题: 图像处理类


图像处理类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 图像处理类

图像处理类

CodeIgniter 的图像处理类可以使你完成以下的操作：

  • 调整图像大小
  • 创建缩略图
  • 图像裁剪
  • 图像旋转
  • 添加图像水印

可以很好的支持三个主流的图像库：GD/GD2, NetPBM, 和 ImageMagick。

注意: 添加水印操作仅仅在使用GD/GD2时可用。另外，即使支持其他的图像处理库，但是为了计算图像的属性，GD是必需的。然而，将使用你制定的库来进行图像处理操作。

初始化类

像 CodeIgniter 的大多数类一样，图像处理类在你的控制器里使用 $this->load->library 方法来初始化：

$this->load->library('image_lib');

在图像处理库被载入后就已经做好被使用的准备了。你将用来调用所有图像处理方法的图像处理库对象是：$this->image_lib

处理一个图像

不管你想进行何种图像处理操作（调整大小，图像裁剪，图像旋转，添加水印），通常过程都是一样的。你先设置一些你想进行的图像操作的参数，然后调用四个可用方法中的一个。例如，创建一个图像缩略图：

$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的形式

注意: 为了让图像类能进行所有操作，包含图片的文件夹必须开启可写权限。

Note: 图像处理操作需要大量的服务器内存。如果处理图像时你出现了内存错误。您可能需要限制他们的最大大小,和/或调整PHP内存限制。

处理函数

有五个处理函数可以调用:

  • $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, X, 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 | 一个数字 | 与前一个选项一起, 允许你指定某个像素的坐标值, 这个像素所代表的颜色就是你要设置为透明的颜色。

翻译贡献者: amu945, aykirk, bnlt, csfhc, Hex, huangnaiang, hui314, lamtin, soaringup, sydcurie, szlinz, tangjianft, yinzhili, 志明
最后修改: 2014-04-11 13:58:50

上一个主题: HTML 表格类 · 页首 · 用户指南首页 · 下一个主题: 输入类


输入类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 输入类

输入类

输入类有两个目的：

  1. 为了安全，预处理输入数据。
  2. 提供helper的一些方法，取得输入数据，并预处理输入数据。

说明: 系统自动加载此类，不用手动加载。

安全过滤（Security Filtering）

当触发一个控制器的时候，安全过滤（Security Filtering）功能自动启动。做以下事情：

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

跨站脚本（XSS）过滤

输入类有能力阻止跨站脚本攻击。如果你想让过滤器遇到 POST 或者 COOKIE 数据时自动运行，你可以通过打开你的 application/config/config.php 文件进行如下设置实现:

$config['global_xss_filtering'] = TRUE;

请参考 安全类 文档以获得更多信息在你的应用中使用跨站脚本过滤。

使用 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);

不设置任何参数，该方法将以一个数组的形式返回全部POST过来的数据。

把第一个参数设置为NULL，第二个参数设置为 TRUE (boolean)，该方法将经过跨站脚本过滤，返回一个包含全部POST数据的数组。

如果POST没有传递任何数据，该方法将返回 FALSE (boolean)

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

$this->input->get()

此方法类似post方法，用来取得get数据：

$this->input->get('some_data', TRUE);

如果没有设置参数将返回GET的数组

如果第一参数为NULL，且第二参数为True，则返回经过跨站脚本过滤（XSS Filtering）的数组。

如果没有设从GET中取到数据将返回 FALSE (boolean)

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

$this->input->get_post()

这个方法将会搜索POST和GET方式的数据流，首先以POST方式搜索，然后以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->set_cookie()

设置一个 Cookie 的值。这个函数接收两种形式的参数：数组形式和参数形式：

数组形式

用这种形式的话，第一个参数传递的是一个关联数组：（重要：自己推荐）

$cookie = array(
    'name'   => 'The Cookie Name',
    'value'  => 'The Value',
    'expire' => '86500',
    'domain' => '.some-domain.com',
    'path'   => '/',
    'prefix' => 'myprefix_',
    'secure' => TRUE
);

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

说明：

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

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

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

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

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

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

参数形式

你可以通过一个个单独的参数来设置cookies, 如果你喜欢的话：

$this->input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure);

$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';
}

可以通过第二个可选参数 "IPv4" 或 "IPv6" 来指定 IP 地址格式。默认两种格式都检查。

$this->input->user_agent()

返回当前用户正在使用的浏览器的user agent信息。 如果不能得到数据，返回FALSE。

echo $this->input->user_agent();

查看User Agent Class了解在user agent字符串中该方法的更多扩展信息。

$this->input->request_headers()

在不支持apache_request_headers()的非Apache环境非常有用。返回请求头（header）数组。

$headers = $this->input->request_headers();

$this->input->get_request_header();

返回请求头（request header）数组中某一个元素的值

$this->input->get_request_header('some-header', TRUE);

$this->input->is_ajax_request()

检查服务器头HTTP_X_REQUESTED_WITH是否被设置，并返回布尔值。

$this->input->is_ajax_request()

$this->input->is_cli_request()

检查看常量STDIN是否被设置, 这只是一个检查PHP是否以命令行方式运行的应急方法。

$this->input->is_cli_request()

翻译贡献者: 377210718, architectcom, csfhc, Hex, hk_yuhe, IT不倒翁, loiynet, qiutao520, soyota, sunjiaxi, xjflyttp, yinzhili, yzheng624, 暗夜星辰, 月夜之人
最后修改: 2014-05-06 11:20:29

上一个主题: 图像处理类 · 页首 · 用户指南首页 · 下一个主题: 装载器类


Javascript 类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › Javascript 类

提示: 此类是实验性的, 其功能设置及执行在未来版本中可能更改.

Javascript 类

CodeIgniter提供一个类库用来加载你想用的Javascript库. 请注意,CodeIgniter不是只引入jQuery才能运行,其他脚本库也能运行.jquery仅仅作为一个方便的工具,如果你选择使用它的话.

初始化 Javascript 类

为了初始化Javascript类,通常在你的控制器内手动添加,使用$this->load->library 函数. 目前,唯一能用的脚本库是jQuery,它会像这样自动加载:

$this->load->library('javascript');

Javascript类也能接受其他参数,函数js_library_driver (string) default 'jquery' and autoload (bool) default TRUE. 你可以覆盖默认参数,只要你愿意发送一个关联数组:

$this->load->library('javascript', array('js_library_driver' => 'scripto', 'autoload' => FALSE));

再次说明,目前只有'jquery'是可用的.你可以设置autoload为FALSE. 不过,如果你不希望jquery自动包含一个jquery核心文件的脚本标记. 如果你在CodeIgniter外加载了它或者已经在你的标记中加载了它,这个做法无疑是有用的.

一旦加载了,jQuery库就可以这样引用: $this->javascript

安装与配置

在你的视图里设置这些变量

作为一个Javascript库,你的源文件必须提供给你的应用程序.

由于Javascript是一种客户端语言，库必须能够写入到最终输出的内容。这通常意味:您需要在文件的<head>节设置以下变量.

<?php echo $library_src;?>
<?php echo $script_foot;?>

$library_src, 就是载入真正库文件的路径，以及随后任何插件脚本的调用路径; $script_head 就是具体的事件，功能和其他命令将被渲染.

项目设置与配置库路径

Javascript库中有一些配置项。这些配置项可以在application/config.php文件，在自己的config/javascript.php文件，或在任何控制器里使用set_item()函数里配置.

比如一个图片被用作"ajax loader", 或者进度指示条,或者在调用ajax时显示简单文字信息"loading"

$config['javascript_location'] = 'http://localhost/codeigniter/themes/js/jquery/';
$config['javascript_ajax_img'] = 'images/ajax-loader.gif';

如果你把文件留在与图片下载路径相同的文件夹里,那么你不需要设置这个配置项.

jQuery 类

要初始化jQuery 类一般在控制器构造类里使用$this->load->library 函数:

$this->load->library('jquery');

您可以使用一个可选的参数,以决定在载入库时是否自动把 jQuery 的 script 标签输出到 HTML 中。默认为自动输出到 HTML 中。为了防止这种情况，配置加载库如下：

$this->load->library('jquery', FALSE);

一旦加载了,jquery库就可以这样引用: $this->jquery

jQuery 事件

使用以下语法来设置事件.

$this->jquery->event('element_path', code_to_run());

在上面例子中:

  • "event" 事件可以是 blur, change, click, dblclick, error, focus, hover, keydown, keyup, load, mousedown, mouseup, mouseover, mouseup, resize, scroll, or unload的任何一个.
  • "element_path" is any valid jQuery selector. 是任何有效的jquery选择器.由于jQuery独特的选择器语法，通常是一个元素ID或CSS选择器。例如，"#notice_area" 会影响到<div id="notice_area">, and "#content a.notice" 会影响div包含"notice" id为"content"的所有锚.
  • "code_to_run()" 是你写的脚本,或者一个行为程序比如在jquery下实现的动态效果.

特效

jQuery支持一个强大的:Effects功能.要实现一个效果,必须这样加载:

$this->jquery->effect([optional path] plugin name);
// for example
$this->jquery->effect('bounce');

hide() / show()

这个功能通过控制页面上一个项目元素的可见性实现效果. hide() 使其隐藏, show() 则显示它.

$this->jquery->hide(target, optional speed, optional extra information);
$this->jquery->show(target, optional speed, optional extra information);

  • "target" 任何一个有效的jQuery选择器.
  • "speed" 可选参数,可设置slow, normal, fast,也可以是毫秒数.
  • "extra information" 可选参数, 包括一个回调函数或者其他额外信息.

toggle()

toggle() 将使一个项目元素从当前状态改变成与原先相反的可见状态,原先隐藏则使项目可见，或者 显示原先隐藏的项目.

$this->jquery->toggle(target);

  • "target" 是任何有效的一个或多个jQuery选择器.

animate()

$this->jquery->animate(target, parameters, optional speed, optional extra information);

  • "target" 是任何有效的一个或多个jQuery选择器.
  • "parameters" 通常是你想改变的元素本身的一系列CSS属性.
  • "speed" 是可选的，可以被设置为 slow, normal, fast 当中的一种或者是一个毫秒数值.
  • "extra information" 是可选的，可以包含一个回调函数，或者其它附加信息.

想要一个完整的摘要,请参考 http://docs.jquery.com/Effects/animate

下面是一个例子, id 为"note"的div调用animate(), 通过单击引发jQuery库的click() 事件.

$params = array(
'height' => 80,
'width' => '50%',
'marginLeft' => 125
);
$this->jquery->click('#trigger', $this->jquery->animate('#note', $params, normal));

fadeIn() / fadeOut()

$this->jquery->fadeIn(target, optional speed, optional extra information);
$this->jquery->fadeOut(target, optional speed, optional extra information);

  • "target" 是任何有效的一个或多个jQuery选择器.
  • "speed" 是可选的，可以被设置为 slow, normal, fast 当中的一种或者是一个毫秒数值.
  • "extra information" 是可选的，可以包含一个回调函数，或者其它附加信息.

toggleClass()

此功能是对目标元素添加或删除一个CSS类.

$this->jquery->toggleClass(target, class)

  • "target" 是任何有效的一个或多个jQuery选择器.
  • "class" 任何CSS类名. 请注意，这个css类必须定义在一个已加载的CSS文件.

fadeIn() / fadeOut()

这些效果是随时间的推移实现一个元素的隐藏或显示.

$this->jquery->fadeIn(target, optional speed, optional extra information);
$this->jquery->fadeOut(target, optional speed, optional extra information);

  • "target" 是任何有效的一个或多个jQuery选择器.
  • "speed" 是可选的，可以被设置为 slow, normal, fast 当中的一种或者是一个毫秒数值.
  • "extra information" 是可选的，可以包含一个回调函数，或者其它附加信息.

slideUp() / slideDown() / slideToggle()

这些效果是实现对元素的滑动.

$this->jquery->slideUp(target, optional speed, optional extra information);
$this->jquery->slideDown(target, optional speed, optional extra information);
$this->jquery->slideToggle(target, optional speed, optional extra information);

  • "target" 是任何有效的一个或多个jQuery选择器.
  • "speed" 是可选的，可以被设置为 slow, normal, fast 当中的一种或者是一个毫秒数值.
  • "extra information" 是可选的，可以包含一个回调函数，或者其它附加信息.

插件

有一些可选择的基于jQuery库的插件.

corner()

用于在页面元素四周添加不同样式的圆角。有关详情请参阅http://www.malsup.com/jquery/corner/

$this->jquery->corner(target, corner_style);

  • "target" 是任何有效的一个或多个jQuery选择器.
  • "corner_style" is optional, 可以设置为任何样式如圆，尖，斜面，撕纹，dog等. 个别的圆角可使用以下定位样式"tl" (左上), "tr" (右上), "bl" (左下), or "br" (右下).

$this->jquery->corner("#note", "cool tl br");

tablesorter()

等待描述

modal()

等待描述

calendar()

等待描述

翻译贡献者: changekale, chenwenli, csfhc, Hex, Jimmy_zZ, yinzhili, zhiquan
最后修改: 2014-03-14 11:04:32

上一个主题: 输入类 · 页首 · 用户指南首页 · 下一个主题: 语言类


装载器类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

你可以随心所欲地将文件保存到多层的子目录下。

另外，你可以同时加载多个类（库），只要按照下面的代码为load方法传入一个包含所有要载入的类名的数组即可：

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

设置选项

第二个参数是可选的，作用是允许你有选择性地传递配置参数。一般来说你可以将参数以数组的形式传递过去:

$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->vars($array)

这个函数以一个关联数组作为输入参数,将这个数组用PHP的extract函数转化成与之对应的变量。这个方法的结果与上面的$this->load->view()方法使用第二个参数的结果一样。在后面提到的情况下你可能需要单独使用这个函数：假如你想在控制器的构造函数中定义一些全局变量，并希望这些变量在控制器的每一个方法加载的视图文件中都可用。你可以多次调用该方法，数据将被缓存，并被合并为一个数组，以便转换成变量。

$this->load->get_var($key)

该方法检查关联数组中的变量对你的视图是否可用。当一个变量在一个类（库）或者控制器的另一个方法里被以这样的方式定义时：$this->load->vars()，会做这样的检查。

$this->load->helper('file_name')

这个函数的作用是载入辅助函数， file_name 是辅助函数对应的文件名，不包括 _helper.php 扩展名。

$this->load->file('filepath/filename', true/false)

这是一个通用的文件载入函数。在第一个参数中给出文件所在的路径和文件名，对应的文件将会被打开。默认情况下，数据会被发送给浏览器，就如同视图文件一样，但如果你将第二个参数设置为 true (布尔型) 那么数据就会以字符串的形式被返回，而不是发送给浏览器。

$this->load->language('file_name')

这个函数是 语言加载函数: $this->lang->load() 的一个别名。

$this->load->config('file_name')

这个函数是 配置文件加载函数: $this->config->load() 的一个别名。

应用程序包(Package)

应用程序包（Package）可以很便捷的将你的应用部署在独立的目录中，以实现自己整套的类库，模型，辅助函数，配置，文件和语言包。建议将这些应用程序包被放置在application/third_party文件夹。下面是一个简单应用程序包的目录

简单应用程序包"Foo Bar"的目录

下面是一个名为"Foo Bar"的应用程序包目录的例子。

/application/third_party/foo_bar

config/
helpers/
language/
libraries/
models/

无论应用程序包是为了实现什么样的目的，它都包含属于自己的配置文件、辅助函数、语言包、类库和模型。在你的控制器里使用这些资源，你首先需要告知加载器（Loader）从应用程序包加载资源、添加包路径。

$this->load->add_package_path()

添加包指示加载器类使用给定的路径用以请求后续的资源。例如, "Foo Bar"应用程序包里有一个名为foo_bar.php的类.在控制器中，我们可以按照如下的方法调用：

$this->load->add_package_path(APPPATH.'third_party/foo_bar/');
$this->load->library('foo_bar');

$this->load->remove_package_path()

当你的控制器完成从应用程序包中调取资源，特别是如果你需要调用其他的应用程序包的资源，你会希望删除当前使用的包路径来让加载器不在使用这个文件夹中的资源。要删除的最后一个使用的包路径，你可以调用不带参数的方法。

$this->load->remove_package_path()

或者删除一个特定的包路径，指定与之前使用add_package_path所加载的包相同的路径。:

$this->load->remove_package_path(APPPATH.'third_party/foo_bar/');

包的视图文件

默认情况下，包视图文件的路径是在add_package_path()方法被调用时就已经设置了。视图路径通过循环匹配来确定视图的加载。

在这种情况下，它可能在包内产生视图命名冲突，并可能导致包被错误的加载。为了确保不会发生此类问题，在调用add_package_path()方法时可设置一个可选的第二个参数FALSE

$this->load->add_package_path(APPPATH.'my_app', TRUE);
$this->load->view('my_app_index'); // Loads
$this->load->view('welcome_message'); // Will not load the default welcome_message b/c the second param to add_package_path is TRUE

// Reset things
$this->load->remove_package_path(APPPATH.'my_app');

// Again without the second parameter:
$this->load->add_package_path(APPPATH.'my_app', TRUE);
$this->load->view('my_app_index'); // Loads
$this->load->view('welcome_message'); // Loads

翻译贡献者: cookieu, Hex, soaringup, tg8866, weelia, Xwoder, yinzhili, 曜日晨阳
最后修改: 2013-11-13 14:03:32

上一个主题: 输入类 · 页首 · 用户指南首页 · 下一个主题: 语言类


语言类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 语言类

语言类

语言类提供方法去“解开（retrieve）”语言文件或者文本行（lines of text）以实现国际化(internationalization).

CodeIgniter的系统(system)目录下的language目录中有一系列的语言文件。 当你需要显示另外一种语言的错误信息或者其它的一些信息时，可以创建自己的语言文件。

语言文件一般存放在 system/language目录下。或者你可以在application目录下创建一个language目录，并把语言文件存放在这里。CodeIgniter会首先查找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
最后修改: 2011-02-01 01:40:31

上一个主题: 装载器类 · 页首 · 用户指南首页 · 下一个主题: 输出类


迁移类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 迁移类

迁移类

迁移是一种结构化与有组织的方式来更改数据库的方便方法。你可以手动编辑 SQL 的片段，然后告知其他开发人员他们需要运行这些片段。你还得保持追踪他们的变化，追踪那些下次部署时那些需要运行但是会与生产设备冲突的变化。

数据库表的 迁移 追踪那些已经运行的迁移信息，你需要做的就是更新你的应用文件并执行 $this->migrate->current() 来计算出哪个迁移信息是需要被运行的。迁移信息的当前版本可以在这里 config/migration.php 找到。

创建一个迁移信息

这将是一个 blog 站点的第一个迁移信息。所有的迁移信息都在文件夹 application/migrations/ 里，并且具有这样的名称，例如：001_add_blog.php.

defined('BASEPATH') OR exit('No direct script access allowed');

class Migration_Add_blog extends CI_Migration {

  public function up()
  {
    $this->dbforge->add_field(array(
      'blog_id' => array(
        'type' => 'INT',
        'constraint' => 5,
        'unsigned' => TRUE,
        'auto_increment' => TRUE
      ),
      'blog_title' => array(
        'type' => 'VARCHAR',
        'constraint' => '100',
      ),
      'blog_description' => array(
        'type' => 'TEXT',
        'null' => TRUE,
      ),
    ));

    $this->dbforge->create_table('blog');
  }

  public function down()
  {
    $this->dbforge->drop_table('blog');
  }

然后在文件 application/config/migration.php 中设置 $config['migration_version'] = 1;。

使用范例

在该范例中，一些简单的代码被放置在 application/controllers/migrate.php 以更新架构(schema)。

$this->load->library('migration');

if ( ! $this->migration->current())
{
  show_error($this->migration->error_string());
}

方法参考

$this->migration->current()

当前的迁移信息是什么，被设置于 $config['migration_version'] 在文件 application/config/migration.php 中。

$this->migration->latest()

这个方法的工作方式和 current() 很像，但是不会从 $config['migration_version'] 寻找迁移信息，而是在文件系统中寻找最新的迁移信息。

$this->migration->version()

迁移版本可以用来回滚或前进到特定版本。它工作起来像是 current() 但是会忽略 $config['migration_version'] 的设置。

$this->load->library('migration');

$this->migration->version(5);

迁移参数

以下是迁移类的配置选项列表。

参数 | 默认值 | 可选项 | 描述
migration_enabled | FALSE | TRUE / FALSE | 启用或禁用迁移。
migration_version | 0 | 无 | 当前数据库所使用的版本。
migration_path | APPPATH.'migrations/' | 无 | 迁移信息所在路径。

翻译贡献者: csfhc, Hex, huboo
最后修改: 2013-11-29 10:20:55

上一个主题: 表单验证类 · 页首 · 用户指南首页 · 下一个主题: HTML 表格类


输出类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 输出类

输出类

输出类是只有一个主要功能的简单的类: 发送最终的Web页面到所请求的浏览器。如果您开启缓存功能，他还负责缓存您的网页文件。

输出类虽然很简单，但是它实现的功能却很重要咯: 输出最后的执行结果给发送请示的浏览器. 如果你选择了使用缓存 ，这块也归它管.

注意：输出类的初始化操作是由系统自动完成的，基本上不用你操心.

在一般的情况下你是感觉不到它的存在的（也用不着去关心），对于你来说它就是透明的，不用去干预，它就能正常的工作. 比如说, 你使用装载器类加载了一个视图文件, 这个视图文件的内容会自动传递给输出类对象, 然后呢，在方法执行完毕后会自动调用输出类对象将执行的结果输出. 但是呢，实际开发的过程当中会遇见一些特殊的情况需要我们干预输出，接管输出的控制权(像是客户要求将数据导出成Excel，提供下载)，这种时候，下面的这些个方法就用啦:

$this->output->set_output();

告诉CodeIgniter方法执行完毕后，用给定的数据做为输出。例如：

$this->output->set_output($data);

重要：使用这个方法有一点很重要，就要将它放在最后一句，千万要注意啊，到时候出了错，不要怪我没提醒你.

$this->output->set_content_type();

允许你设置页面的mime类型以便于输出 JSON , JPEG, XML 等类型的数据.

$this->output
    ->set_content_type('application/json')
    ->set_output(json_encode(array('foo' => 'bar')));

$this->output
    ->set_content_type('jpeg') // 你也可以用".jpeg"，它在查找 config/mimes.php 文件之前会移除句号
    ->set_output(file_get_contents('files/something.jpg'));

重要: 确保你传递到此方法的非mime字符串在 config/mimes.php 存在，否则设置不起作用。

$this->output->get_output();

使用这个方法，你可以得到将要输出的数据，并把它保存起来，留着它用（我们做新闻类型网站的时候，常常需要生成静态的HTML文件）. 例如：

$string = $this->output->get_output();

注意，如果先前的数据已经被一个类似 $this->load->view() 的 CodeIgniter 函数送到了输出类，那么只能取得那个函数之后的输出。

$this->output->append_output();

在输出字符串后附加数据。例如：

$this->output->append_output($data);

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

允许你在评测器启用时控制(开/关)其特定部分。请参考评测器了解详细信息。

$this->output->cache();

CodeIgniter的输出类同样也控制缓存。要获取更多信息，请阅读 缓存文档.

Parsing Execution Variables

默认情况下，CodeIgniter总会在输出中解析伪变量{elapsed_time}和{memory_usage}。 如需禁用，在控制器中将类属性$parse_exec_vars设为FALSE。 $this->output->parse_exec_vars = FALSE;

译者注：此处存在源码级错误，直接应用此代码会报错“Fatal error: Cannot access protected property CI_Output::$parse_exec_vars ”。建议用以下代码： public $parse_exec_vars = TRUE; 替换掉源文件systerm/core/Output.php第86行（CI版本2.1.3）的此句代码： protected $parse_exec_vars = TRUE;

翻译贡献者: billycui, crazyfriday, csfhc, Glen, Hex, hk_yuhe, lishen2, Raidal, xwjie, yinzhili
最后修改: 2013-11-22 20:12:23

上一个主题: 语言类 · 页首 · 用户指南首页 · 下一个主题: 分页类


分页类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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['use_page_numbers'] = TRUE;

默认分页URL中是显示每页记录数,启用use_page_numbers后显示的是当前页码，如下：

不启用：http://example.com/index.php/test/page/20
启用后：http://example.com/index.php/test/page/1

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

你希望在分页的左边显示“第一页”链接的名字。如果你不希望显示，可以把它的值设为 FALSE 。

$config['first_tag_open'] = '<div>';

“第一页”链接的打开标签。

$config['first_tag_close'] = '</div>';

“第一页”链接的关闭标签。

自定义结束链接

$config['last_link'] = 'Last';

你希望在分页的右边显示“最后一页”链接的名字。如果你不希望显示，可以把它的值设为 FALSE 。

$config['last_tag_open'] = '<div>';

“最后一页”链接的打开标签。

$config['last_tag_close'] = '</div>';

“最后一页”链接的关闭标签。

自定义“下一页”链接

$config['next_link'] = '&gt;';

你希望在分页中显示“下一页”链接的名字。如果你不希望显示，可以把它的值设为 FALSE 。

$config['next_tag_open'] = '<div>';

“下一页”链接的打开标签。

$config['next_tag_close'] = '</div>';

“下一页”链接的关闭标签。

自定义“上一页”链接

$config['prev_link'] = '&lt;';

你希望在分页中显示“上一页”链接的名字。如果你不希望显示，可以把它的值设为 FALSE 。

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

“数字”链接的关闭标签。

隐藏“数字”链接

如果你不想显示“数字”链接（比如只显示 “上一页” 和 “下一页”链接）你可以添加如下配置：

$config['display_pages'] = FALSE;
// 不显示“数字”链接

给链接添加 CSS 类

如果你想要给每一个链接添加 CSS 类，你可以添加如下配置：

$config['anchor_class'] = "";
//添加 CSS 类

翻译贡献者: csfhc, drazzi, Fanbin, Hex, IT不倒翁, jianghaosen, li_star, peirancao, roln, sankai, yadgen, 笼中
最后修改: 2014-06-04 20:43:16

上一个主题: 输出类 · 页首 · 用户指南首页 · 下一个主题: Session 类


安全类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 安全类

安全类

安全类包含一些方法，能帮助您创建安全的应用程序，对输入的数据进行安全方面的处理.

XSS 过滤

CodeIgniter 包含了跨站脚本攻击的防御机制，它可以自动地对所有POST以及COOKIE数据进行过滤，或者您也可以针对单个项目来运行它。默认情况下，它 不会 全局运行，因为这样也需要一些执行开销，况且您也不一定在所有情况下都用得到它.

XSS过滤器会查找那些常被用来触发JavaScript或者其他类型的企图劫持cookie或进行其它恶意行为的代码. 如果发现任何不允许的内容，它将把那些内容转换为字符实体，以确保安全.

注意: 此函数只应该用来处理那些提交过来的数据. 它不适合在常规运行时使用，因为它执行时的开销也是不容忽视的.

要使用XSS过滤器对数据进行过滤，请使用此函数:

$this->security->xss_clean()

下面是一个使用实例:

$data = $this->security->xss_clean($data);

如果你希望过滤器能自动过滤所有被访问到的POST或者COOKIE数据，请打开你的 application/config/config.php 文件，进行如下设置即可启用自动过滤:

$config['global_xss_filtering'] = TRUE;

说明: 如果你使用表单验证类，同样也有XSS过滤的选项.

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

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

$this->security->sanitize_filename()

当接受用户所输入的文件名时, 最好是对它们进行一下“消毒”, 这样能避免目录被遍历以及其它安全相关的问题. 要完成这项工作, 请使用安全类中的 sanitize_filename() 方法. 下面是一个实例:

$filename = $this->security->sanitize_filename($this->input->post('filename'));

如果你允许用户所输入的内容中包含有相对路径，例如 file/in/some/approved/folder.txt, 你可以把第二个可选参数 $relative_path 设置为TRUE.

$filename = $this->security->sanitize_filename($this->input->post('filename'), TRUE);

跨站请求伪造(Cross-site request forgery,CSRF)

打开你的 application/config/config.php 文件，进行如下设置，即可启用 csrf 保护:

$config['csrf_protection'] = TRUE;

如果你使用 表单辅助函数, form_open() 函数将会自动地在你的表单中插入一个隐藏的csrf字段.

翻译贡献者: Hex, yinzhili
最后修改: 2011-02-13 08:21:49

上一个主题: 分页类 · 页首 · 用户指南首页 · 下一个主题: Session 类


Session 类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › Session 类

Session 类

Session 类可以使用户在浏览您的网站时，维持他们的状态并跟踪他们的行为。 Session 类将每个用户的 session 信息序列化（serialize）后存储到到 cookie 中（并同时进行加密）。 您还可以将 session 数据存储到数据库中来增强安全性，但是这时要求存储在用户 cookie 中的 session ID 值能与数据库中存储的用户 session ID 值相匹配。程序默认只在 cookie 中存储 session。如果您要在数据库中存储 session 的话，需要按照下面指示的方法，在您的数据库中创建需要的数据表。

注意：Session类并不使用PHP本身的session，而是使用类自己的session，这样做，可以给开发者提供更大的灵活性。

注意：即使没有使用加密会话，你也需要在配置文件里设置一个加密密钥。这将有助于防止伪造 Session 数据。

注意：The Session class relies on the Encryption class, so you must have Mcrypt extension installed.

初始化 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 地址
  • 用户浏览器信息（取前120个字符）
  • 最新的一个活跃时间戳.

以上数据将会用以下数组格式序列化并存到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 上次被写入的时间。 这个时间可以通过设置 application/config/config.php 文件里的 $config['sess_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 数据

用下面的这种方式可以得到一个所有Session用户数据的数组:

$this->session->all_userdata()

代码将返回一个类似这样的关联数组:

Array
(
    [session_id] => 4a5a5dca22728fb0a84364eeb405b601
    [ip_address] => 127.0.0.1
    [user_agent] => Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7;
    [last_activity] => 1303142623
)

删除 Session 数据

正如使用 set_userdata() 是用来添加信息到 session 中，而通过向 unset_userdata() 函数中传递 session key 可以用来删除这些信息。例如, 你想要从 session 信息里去掉 'some_name':

$this->session->unset_userdata('some_name');

也可以给这个函数传一个要删除项的关联数组。

$array_items = array('username' => '', 'email' => '');

$this->session->unset_userdata($array_items);

闪出数据

CodeIgniter 支持 "闪出数据", 或者说Session数据只对下次服务器请求可用, 然后会自动清除。这应该会非常有用，往往应用在信息或状态提示中（例如：“记录2已删除”）。

注意: 闪出数据变量名以“flash_”开头，所以在你自己的变量名中要避免使用这个前缀。

要添加闪出数据：

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

你也可以使用和 set_userdata() 同样的方式向 set_flashdata() 传递一个数组。

要读取一个闪出数据变量：

$this->session->flashdata('item');

如果你发现你需要在一个附加的请求中保留一个闪出数据，你可以使用 keep_flashdata() 这个函数。

$this->session->keep_flashdata('item');

将 Session 数据存入数据库

由于Session数据数组是附带一个Session ID保存在用户cookie里的，你无法验证它，除非你把session数据存储在数据库中。在一些不需要或很少需要安全保护的应用中，session ID 或许并不需要。但如果你的应用需要安全保护，验证是必须的。否则，用户可以通过篡改Cookies来恢复旧的Session。

当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().

Session 的参数

你可以在application/config/config.php 文件中找到以下的 Session 相关的参数:

参数 | 默认 | 选项 | 描述
sess_cookie_name | ci_session | 无 | 你想要保存 Session Cookie 的名字。
sess_expiration | 7200 | 无 | session 持续的秒数。默认是2个小时(7200秒)。如果将这个数值设为: 0，就可以得到 永久 session。
sess_expire_on_close | FALSE | TRUE/FALSE (boolean) | 这个选项决定当浏览器窗口关闭时是否自动使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, bearcat001, csfhc, Drice, Fanbin, guns1985, Hex, mchipengfei, mental, noproblem, phper08, qixingyue, shishirui, uicestone, xwjie
最后修改: 2014-06-10 14:08:32

上一个主题: 安全类 · 页首 · 用户指南首页 · 下一个主题: Trackback 类


引用通告类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

注意: 上面的代码不包含数据验证，那正是我们鼓励你去添加的。

翻译贡献者: Drice, Hex, shnwqshnwq, yinzhili
最后修改: 2010-11-10 11:48:26

上一个主题: Session 类 · 页首 · 用户指南首页 · 下一个主题: 模板解析器类


模板解析器类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

$this->parser->parse_string()

This method works exactly like parse(), only accepts a string as the first parameter in place of a view file.

变量对

上面的示例代码中演示简单变量的替换。如果你想要替换整个块的变量，这个块的每行都包含新值？想象一下在页面最顶端我们展示的例子：

<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
最后修改: 2011-02-01 01:51:47

上一个主题: Trackback 类 · 页首 · 用户指南首页 · 下一个主题: 排版类


排版类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 排版类

排版类

排版类提供帮助你格式化文本的函数。

初始化排版类

和CI中的其他类一样, 排版类也需要在控制器中这样用 $this->load->library 方法初始化:

$this->load->library('typography');

一旦被加载, 排版类的对象就可以这样使用: $this->typography

auto_typography()

格式化文本以便纠正语义和印刷的错误HTML代码。输入一个字符串输出如下的格式化文本：

  • 用一对P标签包住段落（看起来像是用两个换行符把段落分隔开似的）。
  • 除了出现 <pre> 标签外，所有的单个换行符被转换为 <br />。
  • 块级别的元素，如<div>标签，没有被段落包装，但是如果他们包含段落的话就会包含文本。
  • 除了出现在标签中的引号外，引号会被转换成正确的实体。
  • 撇号“'”被转换为相应的实体。
  • 双破折号 (像 -- 或--) 被转换成 em—破折号.
  • 三个连续的点也会被转换为省略号…
  • 句子后连续的多个空格将被转换为&nbsp;以便在网页中显示。

例如：

$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:

试翻译:此函数与上面出现的auto_typography函数类似, 唯一不同的是此函数仅对以下字符进行转换:

  • 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.
  • 试翻译:双破折号(比如 -- 或--) 将被转换成 em—符号.
  • 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.

试翻译: 除了 <pre> 标签内的新行,将被转换为 <br /> 标签. 除了本函(方法)数支持 <pre> 标签外, 其与PHP内置函数 nl2br() 相同.

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.

试翻译: 当排版类与模板解析器类结合使用时，为了使显示正常，经常需要把单引号和双引号放在大括号中。如果你是这种情况，可以把protect_braced_quotes类属性设置为 TRUE.

Usage example:

试翻译:例子：

$this->load->library('typography');
$this->typography->protect_braced_quotes = TRUE;

翻译贡献者: drazzi, Hex, icebird, neversaylate, noproblem, tonera, zhou78620051
最后修改: 2012-11-14 14:56:28

上一个主题: 模板解析器 · 页首 · 用户指南首页 · 下一个主题: 单元测试类


单元测试类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 单元测试类

单元测试类

单元测试是一种用于测试应用程序中每个函数的软件开发方法。如果你对此概念不熟悉，或许需要google一下相关概念。

CodeIgniter的单元测试类非常简单，由一个评估函数和两个结果函数组成。它没打算成为一个十全的测试集，只提供一个简单的能够评测你的代码是否可以产生正确的数据类型及结果的解决方案。

初始化单元类

和大多数其它的类一样，在CodeIgniter中，单元测试类一样要在控制器中用函数$this->load->library 来初始化:

$this->load->library('unit_test');

测试类一旦加载，单元测试对象可以这样使用：$this->unit

运行测试：

运行一个测试应提供一个测试及期望的结果给以下函数：

$this->unit->run( test, expected result, 'test name', 'notes');

Where test is the result of the code you wish to test, expected result is the data type you expect, test name is an optional name you can give your test, and notes are optional notes. Example:

$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_object
  • 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)

Unit Test Display

When your unit test results display, the following items show by default:

试翻译:当你显示单元测试结果的时候,以下信息(原以为条目)将被默认显示:

  • Test Name (test_name)
  • 试翻译:测试名称(test_name)
  • Test Datatype (test_datatype)
  • 试翻译:测试数据类型(test_datatype)
  • Expected Datatype (res_datatype)
  • 试翻译:期望数据类型(res_datatype)
  • Result (result)
  • 试翻译:结果(result)
  • File Name (file)
  • 试翻译:文件名称(file)
  • Line Number (line)
  • 试翻译:行数(line)
  • Any notes you entered for the test (notes)
  • 试翻译:手动添加的注释(notes)

You can customize which of these items get displayed by using $this->unit->set_items(). For example, if you only wanted the test name and the result displayed:

试翻译:使用$this->unit->set_items() ,你可以自定义显示信息(条目). 比如,如果你只期望显示测试名称和测试结果:

Customizing displayed tests

试翻译:自定义显示测试结果

$this->unit->set_test_items(array('test_name', 'result'));

Creating a Template

试翻译:创建显示模板

如果你希望测试结果以自定义的格式显示，这里提供一个简单的模板示例。注意必需的伪变量(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, Jimmy_zZ, zhou78620051
最后修改: 2012-06-20 09:21:46

上一个主题: 排版类 · 页首 · 用户指南首页 · 下一个主题: URI 类


URI 类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

这个函数和上面的函数基本功能一样，不同点在于它允许你在开启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
最后修改: 2013-03-22 07:43:09

上一个主题: 单元测试类 · 页首 · 用户指南首页 · 下一个主题: User-Agent 类


User-Agent 类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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)

if ($this->agent->is_browser('Safari'))
{
    echo 'You are using Safari.';
}
else if ($this->agent->is_browser())
{
    echo 'You are using a browser.';
}

Note: The string "Safari" in this example is an array key in the list of browser definitions. You can find this list in application/config/user_agents.php if you want to add new browsers or change the stings.

$this->agent->is_mobile()

根据用户代理是否是一个已知的移动设备，返回 TRUE/FALSE (boolean)

if ($this->agent->is_mobile('iphone'))
{
    $this->load->view('iphone/home');
}
else if ($this->agent->is_mobile())
{
    $this->load->view('mobile/home');
}
else
{
    $this->load->view('web/home');
}

$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
最后修改: 2011-02-01 02:11:44

上一个主题: URI 类 · 页首 · 用户指南首页 · 下一个主题: XML-RPC 类


XML-RPC 和 XML-RPC 服务器类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 服务扮演着交通警察的角色，等待进入的请求，并将它们转到恰当的函数进行处理。

要创建自己的 XML-RPC 服务器，包括在接受请求的控制器中初始化 XML-RPC 服务器类，然后设置一个指向映射数组以便收到的请求可以被发送到恰当的类与方法来处理。

下面用一个例子来说明：

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

上面的例子中有一个包含两个服务器允许的特定请求方法的数组。这些被允许的方法在数组的左边，当收到其中任何一个方法时，它会被立刻映射到数组右边所列出的类与方法。

'Object'是一个特殊的键，它是你传递的类的实例，这个键是必要的，尤其是当你映射到的方法不是 Codeigniter 超类的一部分。

换句话说，如果 XML-RPC 客户端发送一个请求到 new_post 方法，你的服务器会加载 My_blog 类并调用 new_entry 函数。如果这个请求是到 update_post 方法的，那么你的服务器会加载 My_blog 类并调用 update_entry 函数。

上面例子中的函数名是任意的。你可以决定这些函数在你的服务器上叫什么名字，如果你使用的是标准的 API，比如：Blogger 或者 MetaWeblog 的 API，你必须使用标准的函数名。

这里还有两个附加的配置项，可以在服务器类初始化时配置使用。debug 设为 TRUE 以便调试，xss_clean 可被设置为 FALSE 以避免数据被安全类库的 xss_clean 函数过滤。

处理服务器请求

当 XML-RPC 服务器收到请求并加载类与方法来处理时，服务器会传递一个包含客户端发送数据的对象到指定的方法。

在上面的例子中，如果请求的是 new_post 方法，服务器请求的类与方法会像这样：

class My_blog extends CI_Controller {

    function new_post($request)
    {

    }
}

$request 变量是一个由服务端汇集的对象，包含由 XML-RPC 客户端发送来的数据。使用该对象可以让你访问到 request parameters 以便处理请求。请求处理完成后，发送一个 Response 返回给客户端。

下面是一个较为实际的例子，使用 Blogger 的 API。Blogger API 中的一个方法是 getUserInfo()，使用该方法 XML-RPC 客户端可以发送用户名和密码到服务器，在服务器返回的数据会包含该特定用户的信息（昵称，用户 ID，Email 地址等等）。下面是处理函数可能的样子：

class My_blog extends CI_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);
    }
}

注意：

output_parameters() 函数会检索一个由相应客户端发送的索引过的请求参数数组。上面的例子中输出参数将会是用户名和密码。

如果客户端发送的用户名和密码无效的话，错误信息会通过 send_error_message() 函数返回。

如果操作成功，客户端会收到包含用户信息的反馈数组。

格式化反馈信息

就像 Requests, Responses 必须被格式化为数组。然而不同于请求信息，反馈信息是只包含一个项的数组。该项可以是一个包含很多其他数组的的数组，但是只有一个主数组索引，下面是一个反馈信息大概的样子：

$response = array('Response data', 'array');

但是反馈信息通常包含多个分块信息。要做到这样，我们必须把各分块信息放到他们自己的数组中，这样主数组就始终只有一个数据项。这里是一个例子来展示如何达成这样的效果：

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

注意：上面的数组被格式化为 struct，这是反馈信息最常见的数据类型。

如同请求信息一样，反馈信息可以是七种数据类型中的一种，参见 数据类型 一节。

发送出错反馈

如果你需要发送给客户端一个出错反馈，你会使用到下面的代码：

return $this->xmlrpc->send_error_message('123', 'Requested data not available');

第一个参数是出错编号，第二个参数是出错信息。

创建你自己的客户端与服务端

为了帮助理解这些，让我们创建两个控制器来演示 XML-RPC 的客户端和服务端。你将用客户端来发送一个请求到服务端并从服务端收到一个反馈。

客户端

使用编辑器创建一个控制器，起名为 xmlrpc_client.php。在这个控制器中，粘贴以下的代码并保存到 applications/controllers/ 目录：

注意：在上面的代码中我们使用了 "url" 辅助函数，你可以在辅助函数页面找到更多信息。

服务端

使用编辑器创建一个控制器，起名为 xmlrpc_server.php。在这个控制器中，粘贴一下代码并保存到 applications/controllers/ 目录：

试试吧！

现在像下面的链接这样访问你的站点：

example.com/index.php/xmlrpc_client/

现在你应该能看到你发送到服务端的信息，并且被返回给了你。

在客户端，你发送了一条消息 ("How's is going?") 到服务端，随着一个请求发送到 "Greetings" 方法。服务端收到这个请求并映射到 "process" 函数，然后把反馈信息返回。

在请求参数中使用关联数组

如果你希望在你的方法参数中使用关联数组，那么你需要使用 struct 数据类型：

$request = array(
                 array(
                       // Param 0
                       array(
                             'name'=>'John'
                             ),
                             'struct'
                       ),
                       array(
                             // Param 1
                             array(
                                   'size'=>'large',
                                   'shape'=>'round'
                                   ),
                             'struct'
                       )
                 );
$this->xmlrpc->request($request);

你可以在服务端处理请求信息时检索关联数组。

$parameters = $request->output_parameters();
$name = $parameters['0']['name'];
$size = $parameters['1']['size'];
$size = $parameters['1']['shape'];

XML-RPC 函数参考

$this->xmlrpc->server()

设置发送给服务器端的XML-RPC的url和端口参数:

$this->xmlrpc->server('http://www.sometimes.com/pings.php', 80);

$this->xmlrpc->timeout()

设置一个超时时间（以秒计算）:

$this->xmlrpc->timeout(6);

$this->xmlrpc->method()

设置XML-RPC服务器接受的请求方法:

$this->xmlrpc->method('method');

Where method is the name of the method.

$this->xmlrpc->request()

设置发送给XML-RPC服务器的数组数据:

$request = array(array('My Photoblog', 'string'), 'http://www.yoursite.com/photoblog/');
$this->xmlrpc->request($request);

$this->xmlrpc->send_request()

请求发送函数. 函数使用之前设置的参数去发起请求XML-RPC服务，成功则返回布尔值TRUE，失败则返回布尔值.

$this->xmlrpc->set_debug(TRUE);

开始调试模式, 开启后，程序将输出错误、警告等信息，以帮助开发者更快的找到问题所在。

$this->xmlrpc->display_error()

当请求失败后，返回错误信息。

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, huanxiangwu, huboo, ianyang, shishirui, sydcurie, wanglinqiang
最后修改: 2014-06-12 17:57:10

上一个主题: User-Agent 类 · 页首 · 用户指南首页 · 下一个主题: Zip 编码类


Zip 编码类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

默认Zip文件会把第一个参数的完整文件夹路径保存到Zip文件里。如果你想忽略目标路径之前的文件夹结构，你可以传递 FALSE (布尔值) 到第二个参数。 例如:

$path = '/path/to/your/directory/';

$this->zip->read_dir($path, FALSE);

这将创建一个包括"directory"在内的ZIP文件, 所有的子文件夹被正确地保存在里面, 但是不包括此文件夹 /path/to/your.

$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, felee, Hex, lomatus, skey, xwjie, yinzhili, yygcom
最后修改: 2012-02-08 20:23:04

上一个主题: XML-RPC 类 · 页首 · 用户指南首页 · 下一个主题: 缓存类


缓存适配器 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 适配器 › 缓存适配器

缓存适配器

注：在2.0.3以前有bug，请下载最新版本的CI。

CodeIgniter提供了多种目前业界流行的快速动态缓存组件的封装类。除了基于纯文本的缓存（文件缓存）外，其他缓存组件均需对服务器环境进行正确配置才能使用，否则程序会抛出致命异常(Fatal Exception)错误。

目录

  • 用法举例
  • 函数速查

支持的缓存适配器

  • Alternative PHP Cache (APC) 缓存
  • 纯文本缓存
  • Memcached缓存
  • 虚拟缓存

用法举例

下面这个例子：首先加载缓存适配器，然后指定 APC 作为适配器优先使用的缓存实现，同时，我们指定文本缓存作为替代方案。这样，在一些服务器不支持APC的情况下（如国内的虚拟主机），我们可以使用替代方案保证程序正常运行。

$this->load->driver('cache', array('adapter' => 'apc', 'backup' => 'file'));

if ( ! $foo = $this->cache->get('foo'))
{
     echo 'Saving to the cache!<br />';
     $foo = 'foobarbaz!';

     // Save into the cache for 5 minutes
     $this->cache->save('foo', $foo, 300);
}

echo $foo;

译者注：为了便于理解上面的代码，我们不妨举个例子。缓存适配器，我们可以理解为一个“通电的插座”；而APC缓存，相当于我们希望插在插座上使用的空调；文本缓存我们可以理解与空调功能相同但效率却完全不同的电风扇。

Function Reference

is_supported(driver['string'])

如果你通过 $this->cache->get() 来访问缓存适配器，此函数将自动触发。但是，如果你希望有针对性的使用某个具体的缓存实现（如下例中的 APC），请确保调用此函数，用来检查服务器环境是否支持这种缓存类型。

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

get(id['string'])

此函数将尝试从缓存系统中获取指定的缓存项。如果缓存不存在，或者超过缓存期限，则返回 FALSE。

$foo = $this->cache->get('my_cached_item');

save(id['string'], data['mixed'], ttl['int'])

此函数尝试将一个缓存项存储到对应的缓存系统中。如果存储失败，则返回FALSE。

第三个参数（可选项）指定了缓存的存活时间，默认为60秒。

$this->cache->save('cache_item_id', 'data_to_cache');

delete(id['string'])

此函数尝试从缓存系统中删除某个指定的缓存项。如果删除失败，则返回FALSE。

$this->cache->delete('cache_item_id');

clean()

此函数用来清空所有缓存。如果清空失败，则返回 FALSE.

$this->cache->clean();

cache_info()

此函数将返回所有缓存信息.

var_dump($this->cache->cache_info());

get_metadata(id['string'])

此函数将返回缓存系统中指定缓存项的详细信息。

var_dump($this->cache->get_metadata('my_cached_item'));

Drivers

Alternative PHP Cache (APC) 缓存

以上列举的所有方法可直接访问，不需传递特定的适配器实现给适配器加载器，如下：

$this->load->driver('cache');
$this->cache->apc->save('foo', 'bar', 10);

For more information on APC, please see http://php.net/apc

基于文件的缓存

不同于从输出类（Output Class）缓存, 基于文件的缓存可以对view页面分块缓存。不过使用时需要小心，应该通过对程序进行评测，以确保由于磁盘I/O增加所导致的性能下降相对于缓存所带来的性能提升是值得的。

以上列举的所有方法可直接访问，不需传递特定的适配器实现给适配器加载器，如下：

$this->load->driver('cache');
$this->cache->file->save('foo', 'bar', 10);

Memcached 缓存

使用分布式 Memcached 服务器 可以通过配置文件： memcached.php 来配置,该文件在 application/config/ 目录下.

以上列举的所有方法可直接访问，不需传递特定的适配器实现给适配器加载器，如下：

$this->load->driver('cache');
$this->cache->memcached->save('foo', 'bar', 10);

若想了解更多关于 Memcached的信息, 请参考 http://php.net/memcached

虚拟缓存（Dummy Cache）

虚拟缓存是一种总是被忽略的后台缓存。它不存储数据，但是若有的环境不支持你选择的缓存机制时，它可以让你的缓存代码能正常的执行。

翻译贡献者: amos, cnsaturn, Hex, LSvKing, qixingyue, tangjianft, wdlth, zxuqian, 曜日晨阳
最后修改: 2013-03-19 02:37:26

上一个主题: Zip 编码类 · 页首 · 用户指南首页 · 下一个主题: 数据库类库


数据库类库 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

数据库类

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

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

翻译贡献者: canglan, Drice, Hex
最后修改: 2012-02-05 22:51:46

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


数组辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

elements()

Lets you fetch a number of items from an array. The function tests whether each of the array indices is set. If an index does not exist it is set to FALSE, or whatever you've specified as the default value via the third parameter. Example:

试译：该函数从一个数组中取得若干元素。该函数测试（传入）数组的每个键值是否在（目标）数组中已定义；如果一个键值不存在，该键值所对应的值将被置为FALSE，或者你可以通过传入的第3个参数来指定默认的值。例如：

$array = array(
    'color' => 'red',
    'shape' => 'round',
    'radius' => '10',
    'diameter' => '20'
);

$my_shape = elements(array('color', 'shape', 'height'), $array);

The above will return the following array:

试译：上面的程序将返回下面的数组：

array(
    'color' => 'red',
    'shape' => 'round',
    'height' => FALSE
);

You can set the third parameter to any default value you like:

试译：你可以将第3个参数设为任何你想要的默认值：

$my_shape = elements(array('color', 'shape', 'height'), $array, NULL);

The above will return the following array:

试译：上面的程序将返回下面的数组：

array(
    'color' => 'red',
    'shape' => 'round',
    'height' => NULL
);

This is useful when sending the $_POST array to one of your Models. This prevents users from sending additional POST data to be entered into your tables:

试译：这（种方法）在将 $_POST 数组传入你的模型时非常有用。通过这种方式可以防止用户发送的额外的 POST 数据进入你的数据表：

$this->load->model('post_model');

$this->post_model->update(elements(array('id', 'title', 'content'), $_POST));

This ensures that only the id, title and content fields are sent to be updated.

试译：这样保证了只有 id, title 和 content 字段被发送以进行更新。

翻译贡献者: canglan, Hex, zhaosusen
最后修改: 2012-02-05 23:45:13

上一个主题: Javascript 类 · 页首 · 用户指南首页 · 下一个主题: CAPTCHA 辅助函数


验证码辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 验证码辅助函数

CAPTCHA 辅助函数

验证码辅助函数用来生成图片验证码

加载辅助函数

用下面的代码加载验证码辅助函数:

$this->load->helper('captcha');

可用的函数如下：

create_captcha($data)

根据你指定的一系列参数创建验证码图像, 返回值是一个包含此图像数据的数组.

[array]
(
  'image' => IMAGE TAG
  'time' => TIMESTAMP (毫秒)
  'word' => CAPTCHA WORD
)

"image"是实际存在image标记: <img src="http://example.com/captcha/12345.jpg" width="140" height="50" />

这里的"time"是一个毫秒级的时间戳，作为图片文件名（不包含扩展名）. 就像这样: 1139612155.3422

"word"是验证码, 如果不提供, 将是一个随机字符串.

使用验证码辅助函数：

加载后你可以向这样产生一个验证码:

$vals = array(
    'word' => 'Random word',
    'img_path' => './captcha/',
    'img_url' => 'http://example.com/captcha/',
    'font_path' => './path/to/fonts/texb.ttf',
    'img_width' => '150',
    'img_height' => 30,
    'expiration' => 7200
    );

$cap = create_captcha($vals);
echo $cap['image'];
  • 验证码辅助函数必须需要GD库.
  • 只有 img_path 和 img_url 参数是必须的.
  • 如果"word"未提供, 将自动产生一个ASCII字符串. 你也可以使用自己的词库，从里面随机挑选.
  • 如果未提供TRUE TYPE字体的路径, 将会使用GD自带的字体.
  • "captcha" 目录必须可写(666, or 777)
  • "expiration" (秒) 指定了验证码图片的超时删除时间. 默认是2小时.

配合数据库

为了在提交表单时用到验证，你需要将create_captcha()生成的结果保存到数据库。这样，当用户提交表单时，你就可以验证数据库里是否有此验证码或是否过期。

这是一个数据表的例子:

CREATE TABLE captcha (
 captcha_id bigint(13) unsigned NOT NULL auto_increment,
 captcha_time int(10) unsigned NOT NULL,
 ip_address varchar(16) default '0' NOT NULL,
 word varchar(20) NOT NULL,
 PRIMARY KEY `captcha_id` (`captcha_id`),
 KEY `word` (`word`)
);

这是一个使用数据库的例子. 一个带验证码的页面显示如下:

$this->load->helper('captcha');
$vals = array(
    'img_path' => './captcha/',
    'img_url' => 'http://example.com/captcha/'
    );

$cap = create_captcha($vals);

$data = array(
    'captcha_time' => $cap['time'],
    'ip_address' => $this->input->ip_address(),
    'word' => $cap['word']
    );

$query = $this->db->insert_string('captcha', $data);
$this->db->query($query);

echo '提交下面的验证码:';
echo $cap['image'];
echo '<input type="text" name="captcha" value="" />';

然后页面提交后如下处理:

// 首先删除旧的验证码
$expiration = time()-7200; // 2小时限制
$this->db->query("DELETE FROM captcha WHERE captcha_time < ".$expiration);

// 然后再看是否有验证码存在:
$sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND captcha_time > ?";
$binds = array($_POST['captcha'], $this->input->ip_address(), $expiration);
$query = $this->db->query($sql, $binds);
$row = $query->row();

if ($row->count == 0)
{
    echo "你必须提交图像上显示的验证码";
}

翻译贡献者: CosyBoy, Hex, LSvKing, 杜建宇
最后修改: 2012-02-05 23:50:26

上一个主题: 数组辅助函数 · 页首 · 用户指南首页 · 下一个主题: Cookie 辅助函数


Cookie 辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › Cookie 辅助函数

Cookie Helper

Cookie Helper 中包含了多个cookie辅助函数.

装载这个 helper

这个 helper 可以通过下面的方法来装载:

$this->load->helper('cookie');

下面这种方法同样可以:

set_cookie()

这个辅助函数给你一种优雅的体验来设置浏览器的cookie。 参考 Input 类的用途描述， 这个辅助函数可以这样调用 $this->input->set_cookie().

get_cookie()

这个辅助函数给你一种优雅的体验来获取浏览器的cookie。参考 Input 类的用途描述, 这个辅助函数可以这样调用：$this->input->cookie().

delete_cookie()

可以让你删除一个cookie,除非你设置了一个自定义的路径或者其他变量，否则只要给出cookie的名字就行了:

delete_cookie("name");

这个函数与set_cookie()函数比较像, 除了它没有值和超时参数. 你可以把一个数组作为第一个参数提交，也可以像下面这样，设置独立的参数.

delete_cookie($name, $domain, $path, $prefix)

翻译贡献者: 498621, billycui, Hex, pipi95, qixingyue, tonera, 李虎头
最后修改: 2013-09-10 12:01:05

上一个主题: CAPTCHA 辅助函数 · 页首 · 用户指南首页 · 下一个主题: 日期辅助函数


日期辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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+00:00
DATE_RFC822 | RFC 822 | Sun, 14 Aug 05 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
最后修改: 2011-02-01 00:10:12

上一个主题: Cookie 辅助函数 · 页首 · 用户指南首页 · 下一个主题: 目录辅助函数


目录辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 目录辅助函数

目录辅助函数

目录辅助函数文件包含处理目录的函数。

载入这个辅助函数

请使用如下代码载入这个辅助函数：

$this->load->helper('directory');

以下函数可以使用：

directory_map('source directory')

这个函数将读取第一个参数所给出的路径的目录，并且返回该目录所包含文件的数据。示例如下：

$map = directory_map('./mydirectory/');

注意: 路径总是相对于你的index.php文件。

如果目录含有子文件夹，也将被列出。你可以使用第二个参数（整数）来控制递归的深度。如果深度为 1，则只列出根目录：

$map = directory_map('./mydirectory/', 1);

默认情况下，返回的数组中不会包括那些隐藏文件。为了覆盖此行为(即显示隐藏的文件--译者加)，你可以设置第三个参数为 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, slqingqing, sydcurie, yinzhili
最后修改: 2013-08-01 10:42:49

上一个主题: 日期辅助函数 · 页首 · 用户指南首页 · 下一个主题: 下载辅助函数


下载辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 辅助函数


Email 辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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, odayou
最后修改: 2013-04-25 17:48:04

上一个主题: 下载辅助函数 · 页首 · 用户指南首页 · 下一个主题: 文件辅助函数


文件辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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/', $top_level_only = TRUE)

获取path/to/directory/目录下的所有文件的文件名，文件大小，日期，文件权限等，并将这些内容保存到返回的数组当中。Sub-folders contained within the specified path are only read if forced by sending the second parameter, $top_level_only to FALSE, as this can be an intensive operation.

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
最后修改: 2011-02-01 00:18:20

上一个主题: 目录辅助函数 · 页首 · 用户指南首页 · 下一个主题: 表单辅助函数


表单辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 表单辅助函数

表单辅助函数

表单辅助函数文件包含那些帮助你使用表单的函数。

载入辅助函数

用下面的代码载入该辅助函数：

$this->load->helper('form');

下列函数才可用：

form_open()

创建一个开始form标签，相对于你的配置文档中的基础URL。允许你添加一些form属性和一些隐藏表单，并且他会基于你的 config.php 文件里设置的编码，自动生成 accept-charset 这个属性。

使用这个函数而不是直接硬编码HTML的主要的优势是使你的程序可以方便的转换，如果你的URL变化的话。

下面是一个例子：

echo form_open('email/send');

上面的例子会创建一个form提交至你的基础URL加上"email/send" URI片段，像这样：

<form method="post" accept-charset="utf-8" action="http://example.com/index.php/email/send" />

添加一些属性

可以在第二个参数里传递一个关联数组来达到这一目的, 像这样：

$attributes = array('class' => 'email', 'id' => 'myform');

echo form_open('email/send', $attributes);

上面的例子会创建一个这样的form标签：

<form method="post" accept-charset="utf-8" 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" accept-charset="utf-8" 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()

这个函数和上面的form_open()函数完全一样，不同之处在于它多了一个multipart属性。如果你要制作一个上传文件的表单，这个属性是必须的。

form_hidden()

可以使你创建一个隐藏输入栏。你可以输入name和value来创建一个：

echo 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()

该函数可以生成标准的复选列表。第一个参数给出表单项的名称；第二个参数用一个关联数组给出该表单项的全部可选项列表；第三个参数规定哪几项是默认已选取的。这些参数的用法跟上面的form_dropdown()完全一样。当然，由于是复选的，在处理传值的时候，我们要使用数组的语法。数组语法的例子：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 form_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="<?php echo set_value('quantity', '0'); ?>" 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, IT不倒翁, longjianghu, pw_2012, soaringup, soyota, thankwsx, yinzhili, zehee
最后修改: 2013-03-18 12:55:01

上一个主题: 文件辅助函数 · 页首 · 用户指南首页 · 下一个主题: HTML 辅助函数


HTML 辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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>

Additionally, in order to add attributes to the heading tag such as HTML classes, ids or inline styles, a third parameter is available.

echo heading('Welcome!', 3, 'class="pink"')

The above code produces: <h3 class="pink">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" alt="" />

此外， 关联数组也能够被作为参数传递到 img() 函数中， 用来实现对所有属性和值的完全控制。如果没指定 alt 属性，则 CodeIgniter 将产生一个空字符串。

$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=utf-8" />

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=utf-8" />

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
最后修改: 2012-02-05 23:58:58

上一个主题: 表单辅助函数 · 页首 · 用户指南首页 · 下一个主题: 路径辅助函数


Inflector 辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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.6 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

第二个可选的参数允许你设置结果的精确度。

echo byte_format(45678, 2); // Returns 44.61 KB

提示: 这个函数生成的文本（译注：文本单位）可以在下面的语言文件里找到: language/<your_lang>/number_lang.php

翻译贡献者: Hex, IT不倒翁, sankai, tonera
最后修改: 2011-06-04 18:40:21

上一个主题: Inflector 辅助函数 · 页首 · 用户指南首页 · 下一个主题: 路径辅助函数


路径辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 安全辅助函数

安全辅助函数

这个安全辅助函数文件包含一系列和安全相关的函数。

加载这个辅助函数

辅助函数可以使用如下代码进行加载:

$this->load->helper('security');

可以使用下面的函数:

xss_clean()

这个函数提供了 XSS 过滤，其实它是输入类的一个别名，关于更多的信息可以到那里去查看。

sanitize_filename()

此函数对目录遍历提供保护. 其实它是 安全类（下$this->security->sanitize_filename() 译者注）的一个别名. 更多信息可以到那里去查看.

do_hash()

允许你创建SHA1或者MD5加密. 可以参考如下例子:

$str = do_hash($str); // SHA1

$str = do_hash($str, 'md5'); // MD5

注： 该函数原名为dohash(), 已弃用。现在改为do_hash().

strip_image_tags()

这个函数可以删除图片的一些不必要字符，目的是让图片的url以文本的形式存在,提高了安全性.

$string = strip_image_tags($string);

encode_php_tags()

这个函数可以把PHP脚本标签强制转成实体对象. Note: 如果你使用了XSS过滤函数的话，会自动转换.

$string = encode_php_tags($string);

翻译贡献者: felee, Hex, zehee, zhupeng
最后修改: 2013-03-18 13:01:49

上一个主题: 路径辅助函数 · 页首 · 用户指南首页 · 下一个主题: 表情辅助函数


表情辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 表情辅助函数

表情辅助函数

这个表情文件包含一系列管理表情的函数.

加载表情辅助函数

可以使用下面的代码加载此辅助函数:

$this->load->helper('smiley');

总体来看

这些笑脸表情是用普通的文本来描述的,像 :-) 然后再将他们转换成真正的表情 smile!

这里显示了许多表情图片，当你点击图片的时候，它们就会被插入到一个表单区域中.比如，你有一个允许用户评论并且可以插入表情的的博客，你的访问用户可以点击满意的表情图片，然后在javascript脚本的帮助下插入到相应的表单区域.

可点击的表情

这里有个案例将教给你如何在表单的旁边创建可以点击的各种表情.首先你需要下载并安装表情包,然后再建一个控制器和相应的视图作为描述文件.

重点提示：开始之前,请下载表情图片然后把它们放在可以公开访问的服务器上.这个辅助函数采用数组的形式替换各种表情,在目录 application/config/smileys.php 中可以查看

控制器

在你的application/controllers/目录中创建一个文件命名为smileys.php 然后加入下面的代码.

重点提示:修改你的表情url在函数get_clickable_smileys()的参数中，url指向你的smiley路径.

可以看到添加表情的时候我们使用的是Table Class.

在你的application/views/文件夹下,创建一个名字为smiley_view.php的文件，然后加入下面的代码:

当你创建完控制器和视图之后，就可以显示你的表情了 http://localhost/index.php/smileys/

字段别名

当修改视图的时候，会牵扯到控制器中的id字段，带来不便。为了解决这一问题，你可以在视图中给表情一个别名，并将其映射到id字段。

$image_array = get_smiley_links("http://localhost/images/smileys/", "comment_textarea_alias");

将别名映射到id字段, 传递他们两个到smiley_js函数:

$image_array = smiley_js("comment_textarea_alias", "comments");

函数参考

get_clickable_smileys()

返回一个已经绑定了可点击表情的数组。你必须提供表情文件夹的 URL，还有表单域的 ID 或者表单域的别名。

$image_array = get_smiley_links("http://localhost/images/smileys/", "comment");

Note: Usage of this function without the second parameter, in combination with js_insert_smiley has been deprecated.

smiley_js()

生成的 JavaScript 可以让图片点击后插入到表单域中。如果你在生成表情链接的时候提供了一个别名来代替id，你需要在函数中传入别名和相应的form id， 此函数被设计为应放在你web页面的<head>区域

<?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://localhost/images/smileys/");

echo $str;

翻译贡献者: felee, Hex, icebird, keeweihan, zehee, zhupeng
最后修改: 2014-06-10 13:50:32

上一个主题: 安全辅助函数 · 页首 · 用户指南首页 · 下一个主题: 字符串辅助函数


字符串辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 字符串辅助函数

字符串辅助函数

该字符串辅助函数为你提供对字符串类型的各种函数。

装载字符串辅助函数

采用如下方式装载该辅助函数：

$this->load->helper('string');

可用函数如下：

random_string()

根据你所指定的类型和长度产生一个随机字符串。可用于生成密码串或随机字串。

第一个参数指定字符串类型，第二个参数指定其长度。以下为可选字符串类型：

alpha, alunum, numeric, nozero, unique, md5, encrypt 和 sha1
  • alpha: 含有大小写字母
  • alnum: 含有大小写字母以及数字。
  • numeric: 数字字符串。
  • nozero: 不含零的数字字符串。
  • unique: 用 MD5 和 uniqid()加密的字符串。注意：第二个长度参数在这种类型无效。均返回一个32位长度的字符串。
  • sha1: 使用安全辅助函数中的do_hash()生成的随机数加密值。

范例：

echo random_string('alnum', 16);

increment_string()

通过附加一个可以增加的数生成一个字符串。Increments a string by appending a number to it or increasing the number. Useful for creating "copies" or a file or duplicating database content which has unique titles or slugs.

范例:

echo increment_string('file', '_'); // "file_1"
echo increment_string('file', '-', 2); // "file-2"
echo increment_string('file-4'); // "file-5"

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, popcorner
最后修改: 2014-06-05 11:29:39

上一个主题: 表情辅助函数 · 页首 · 用户指南首页 · 下一个主题: 文本辅助函数


文本辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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码.

convert_accented_characters()

Transliterates high ASCII characters to low ASCII equivalents, useful when non-English characters need to be used where only standard ASCII characters are safely used, for instance, in URLs.

$string = convert_accented_characters($string);

This function uses a companion config file application/config/foreign_chars.php to define the to and from array for transliteration.

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

ellipsize()

过滤字符串中的标签，在指定的最大长度处切割字符串，并插入一个省略号。

第一个参数是要被省略处理的字符串，第二个参数是目标字符串中字符的数目。第三个参数是省略号在目标字符串的位置，值为0 - 1，从左到右。例如，值为1时，省略号位于目标字符串的右端，值为.5时，位于中间，而值为0时位于左端。

第四个参数是可选的，用于指明使用的省略符号类型，默认使用 … 。

$str = 'this_string_is_entirely_too_long_and_might_break_my_design.jpg';

echo ellipsize($str, 32, .5); 输出: this_string_is_e…ak_my_design.jpg

翻译贡献者: Hex, hk_yuhe, kkorange, kntism, yinzhili
最后修改: 2011-03-08 00:56:17

上一个主题: 字符串辅助函数 · 页首 · 用户指南首页 · 下一个主题: 排版辅助函数


排版辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 排版辅助函数

排版辅助函数

这个排版辅助函数文件里的函数能够让你按照相关词性对文本的格局进行排版。

载入这个辅助函数

请使用如下代码载入这个辅助函数：

$this->load->helper('typography');

以下函数可以使用：

auto_typography()

格式化文本，使其在语义和排版上是正确的HTML。更多信息请参考 排版类 。

例子:

$string = auto_typography($string);

注意: 排版格式可能会增加处理器的负荷，特别是当你有大量的内容需要被处理时。 如果选择使用这个函数的话，你可能需要考虑缓存你的页面。

nl2br_except_pre()

如果换行不在标记符 <pre> 里的话，都会被转换成 <br /> 标记符。这个函数除了会忽略标记符<pre> 以外，和PHP自带函数nl2br()是相等的。

例子:

$string = nl2br_except_pre($string);

翻译贡献者: aykirk, Hex, hk_yuhe
最后修改: 2011-03-08 20:47:55

上一个主题: 文本辅助函数 · 页首 · 用户指南首页 · 下一个主题: URL 辅助函数


URL 辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › URL 辅助函数

URL 辅助函数

URL 辅助函数文件包含一些在处理 URL 中很有用的函数

加载辅助函数

本辅助函数通过如下代码加载:

$this->load->helper('url');

可用函数如下:

site_url()

返回站点的URL, 如果在config.php 文件中指定了base_url会返回指定的值，否则自动获取。 当你将URI段作为参数传给这个函数时，index.php 文件名 (或者是你在config中自定义的 index_page 文件名) 会被加到URL后面, 而且会加上你在config中定义的 url_suffix 后缀。

无论什么时候需要生成 URL ，都鼓励您使用该函数, 这样当您的根 URL 改变的时候更具有可移植性。[注：根 URL 指 config.php 中指定的 base_url 和 index_page--IT不倒翁]

做为参数传递给该函数的 URI 段可以是一个字符串，也可以是一个数组. 下面是一个字符串的例子:

echo site_url("news/local/123");

上面的例子将返回: http://example.com/index.php/news/local/123

注意：如果config中开启了enable_query_strings,则连接符由/改为?，上面的url会返回这样：

http://example.com/index.php?news/local/123

所以这里要注意，如果你开启了get传值的话，请注意这里的变化。

这是一个以数组形式传递 URI 段的例子:

$segments = array('news', 'local', '123');

echo site_url($segments);

base_url()

返回在 config.php 中设定的 base_url. 例:

echo base_url();

这个函数和site_url返回相同，只是 index_page 和 url_suffix 不再被追加。

和site_url函数一样, 做为参数传递给该函数的 URI 段可以是一个字符串，也可以是一个数组. 下面是一个字符串的例子:

echo base_url("blog/post/123");

上面的例子将返回: http://example.com/blog/post/123

这个函数非常有用,不像site_url()那样，你可以用它指定文件的路径，像是image路径或者css路径，例如：

echo base_url("images/icons/edit.png");

上面的例子将输出像这样的结果: http://example.com/images/icons/edit.png

current_url()

返回当前正在查看的页面的完整URL(包括段)。

uri_string()

返回任何包含了此函数的页面的URI段。比如说，要是你的URL是这样的:

http://some-site.com/blog/comments/123

此函数将会返回:

/blog/comments/123

注：我测试的结果：

blog/comments/123

index_page()

返回在 config.php 中设定的 index_page. 例:

echo index_page();

anchor()

创建基于你的本地站点URL的标准链接地址：【原翻译为锚链接，不妥。该函数实际上是用来快速生成<a>标签链接用的-zehee】

<a href="http://example.com">Click Here</a> //echo anchor('','Click Here','');

它有三个可选参数:

anchor(uri segments, text, attributes)

第一个参数包含你想附加到URL的任何段.像上面的site_url() 函数一样,段可以是字符串或数组.

注意: 如果你创建在应用程序内部的链接没有包含基本URL(http://...),这个参数会从你配置文件信息中自动加载。只需要写上你的 URL 分段即可。

第二个参数是你想给链接的内容（<a>标签中间的内容）.如果让它为空,将会由URL替代.

第三个参数包含一组你想附加给链接的属性.这些属性可以是简单的字符串或相关的数组.

这里有一些例子:

echo anchor('news/local/123', 'My News', 'title="News title"');

输出(链接名字'My News'): <a href="http://example.com/index.php/news/local/123" title="News title">My News</a>

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

第2个参数指定单词之间的分隔符. 默认使用破折号'-'.

$title = "What's wrong with CSS?";

$url_title = url_title($title, '_');

// 输出: Whats_wrong_with_CSS

第3个参数决定了是否强制转换为小写.默认情况下不会.参数类型为布尔值 TRUE/FALSE:

$title = "What's wrong with CSS?";

$url_title = url_title($title, '_', TRUE);

// Produces: whats_wrong_with_css

prep_url()

在URL中没有http://的情况下,这个函数可以附加上.像这样把URL字串传递给函数:

$url = "example.com";

$url = prep_url($url);

redirect()

通过发送HTTP头，命令客户端转向到您指定的URL。您既可以指定一个完整的URL，也可以对于站内内容，指定基于网站根目录的相对URL。本函数会自动根据您的配置文件，构造出完整的URL。

你可以设定第二个参数为 location 定位操作(默认)或者 refresh 刷新操作。定位操作比刷新操作执行速度快，但是在Windows服务器上有时会报错。可选的第3个参数允许你发送一个特定的HTTP请求返回码 - 举例来说这可以用来创建303请求重定向来服务于搜索引擎. 默认的请求返回码是302(临时重定向). 第3个参数只使用于'location'重定向, 而不是用于'refresh'. 范例:

//注意！！一定不要忘了加载 $this->load->helper('url');

if ($logged_in == FALSE)
{
     redirect('/login/form/', 'refresh');
}

// with 301 redirect
redirect('/article/13', 'location', 301);

注意：由于此函数需要处理header头文件，因此它必须在向客户端输出任何内容之前调用。
注意：如果您想对HTTP头做更细致的设置，您可以使用输出类的 set_header() 函数。

翻译贡献者: Deloz, dren_a, Hex, IT不倒翁, kkorange, linfj, LSvKing, mp5baby, mynameisjian, nardo, shamiao, tinsn, yeto, yinzhili, zehee, 大漠沙尘, 杜建宇
最后修改: 2014-05-19 12:49:00

上一个主题: 排版辅助函数 · 页首 · 用户指南首页 · 下一个主题: XML 辅助函数


XML 辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › XML 辅助函数

XML 辅助函数

xml助手函数文件包含了一些辅助处理xml数据的函数

加载该辅助函数

本辅助函数通过如下代码加载:

$this->load->helper('xml');

可用函数如下:

xml_convert('string')

以一个字符串(string)作为输入并且转换下列xml保留字符成为实体(entities):

连字号: &
小于和大于号: < >
单引号和双引号: ' "
破折号: -

该函数将忽略 & 如果他们是存在的字符实体的一部分。例如:

$string = xml_convert($string);

翻译贡献者: baiyuxiong, fdasf, Hex, weide, zhupeng
最后修改: 2010-01-04 13:32:41

上一个主题: URL 辅助函数 · 页首 · 用户指南首页


帮助文档CSS样式图片资源 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 目录

帮助文档CSS样式图片资源

页首


Active Record 模式 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 (MySQL语法. 其他数据库在语法上略有不同)

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

你会注意到上面的函数由一个变量$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()，这是已经过时的用法，现已从代码中移除 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

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

如果你需要指定 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(), 后者已经过时，现已从代码中移除 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. 如果你不想使用百分号(%)，你可以给第三个可选的参数传递一个'none'。 $this->db->like('title', 'match', 'none');
    // Produces: 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(), 后者已经过时，现已从代码中移除 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(), 后者已经过时，现已从代码中移除 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' AND 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(), 后者已经过时，现已从代码中移除 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')

第一个参数包含表名，第二个是一个对象。

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

$this->db->insert_batch();

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

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

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

//生成： INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')

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

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

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

生成一条update命令是以你提供的数据为基础的，并执行查询。你可以传递一个数组或对象的参数给update_batch()函数。下面是一个使用一个数组作为参数的示例：Generates an update string based on the data you supply, and runs the query. You can either pass an array or an object to the function. Here is an example using an array:

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

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

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

参数1:表名 参数2:如上所示的二维数组 参数3:键名.

提示: 所有的值都会自动进行安全性过滤.

删除数据

$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() 函数。

说明：delete方法貌似现在没有办法接收排序参数

假设我想删除早期的用户登录日志信息，我的语法可能会是根据登录时间正序排列，然后跟上limit已经有的总日志条数减去想保留的条数，delete方法没有这个参数用来接收，那么我只能直接使用query传递我的sql了

$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 TABLE 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, group_by, having, order_by, set

翻译贡献者: atans, aykirk, Drice, Fanbin, guapibai, Hex, houlianshan, huanxiangwu, imjie, k7gxn56, localtest, loiynet, longjianghu, ripen, thankwsx, yinzhili, zhangminghua218
最后修改: 2014-01-26 23:35:03

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


数据库缓存类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

数据库缓存类

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

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

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

激活缓存

激活缓存需要三步：

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

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

缓存如何工作？

当页面被浏览时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).

CI把每次查询的结果放置在自己的缓存文件里。根据你的控制器函数，缓存文件集将被进一步组织到子目录中。准确的话，子目录的名称由你的URI的前两段（控件器类名和函数名）决定

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.

例如，假设你有一个控制器blog和一个comments函数，这个函数包括三个查询。缓存系统将创建一个叫做blog+comments的目录并在这个目录里创建三个缓存文件。

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.

当你根据URI上的信息动态查询时（例如使用分页），每次查询的实例将创建自己的缓存文件。因此，经过很多次查询后，缓存文件的个数可能比你查询的次数还多。

管理您的缓存文件

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

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

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

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

  • 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'); 注意，手册上写的是 $this->db->cache_delete('blog', 'comments');但根据实际测试应该在控制器名字前加斜杠'/'才能正确执行。

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

$this->db->cache_delete_all()

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

$this->db->cache_delete_all();

翻译贡献者: airyland, baiyuxiong, Drice, Hex, iptton, mchipengfei, soyota, yz20sui, 笼中
最后修改: 2011-12-10 18:58:38

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


自定义函数调用 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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

数据库配置

CodeIgniter 有一个配置文件让你存放数据库连接值（username:用户名，password:密码，database name:数据库名，等等..）. 该配置文件位于 application/config/database.php. 你也可以通过放置不同的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";
$db['default']['swap_pre'] = "";
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

我们使用多维数组的原因是为了让你随意的存储多个连接值的设置。举例：如果你运行多个环境（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";
$db['test']['swap_pre'] = "";
$db['test']['autoinit'] = TRUE;
$db['test']['stricton'] = FALSE;

那么，告诉系统使用"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 - 与数据库通信时所使用的字符规则。

    提示: 就MYSQL或MYSQLi数据库而言，如果服务器运行环境PHP版本小于5.2.3、MYSQL版本小于5.0.7，那么该项设置仅被用来备份（由数据库维护类DB Forge所创建查询）。如果使用多字节字符集并且使用低版本PHP环境中不兼容的mysql_real_escape_string()函数，它将使网站更容易受到SQL注入的危险。

  • swap_pre - 替换默认的dbprefix表前缀，该项设置对于分布式应用是非常有用的，你可以在查询中使用由最终用户定制的表前缀。

    • 曜日晨阳注: 如果设置了 $db['default']['dbprefix'] 的值 同时也设置了 $db['default']['swap_pre'] 的值，则会将查询代码中和$db['default']['swap_pre'] 的值一致的字符替换成 $db['default']['dbprefix'] 的值，如果没有设置 $db['default']['swap_pre'] 值，就直接在数据库表名前面加上 $db['default']['dbprefix'] 值。

  • autoinit - 当数据库类库(database library)被载入的时候是否需要自动连接数据库，如果设置为FALSE，将在首次查询前进行连接。
  • stricton - TRUE/FALSE (boolean) - 是否强制使用 "Strict Mode" 连接, 在开发程序时，使用 strict SQL 是一个好习惯。
  • port - 数据库端口号. 要使用这个值，你应该添加一行代码到数据库配置数组。$db['default']['port'] = 5432;

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

翻译贡献者: amos, chenshenghan, Drice, Hex, pipi95, tanqimin, thankwsx, tinsn, yinzhili, zehee, 曜日晨阳
最后修改: 2013-03-19 05:07:44

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


连接 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 连接

连接你的数据库

有两种方法连接数据库：

自动连接

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

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

手动连接

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

$this->load->database();

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

可用的参数

  1. 数据库连接值，用数组或DSN字符串传递。
  2. 是否返回连接ID，TRUE/FALSE (boolean),默认值为FALSE (参阅下面的“连接多数据库”)。
  3. 是否启用 Active Record 类,TRUE/FALSE (boolean),默认值为 NULL。如有疑问，请查看/system/core/Loader.php的database()方法

手动连接到一个数据库

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

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

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

当你的dbdriver值为mysqli来进行远程连接时，切记要指定一个参数Port为远程mysql端口

连接多数据库

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

$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...

译注：要连接多个数据库请先设置 config/database.php 中的 $db['xxxxxx']['pconnect'] = FALSE; 这是 mysql_pconnect() 造成的问题，和 CI 无关。

重新连接 / 保持连接有效

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

$this->db->reconnect();

手动关闭连接

虽然CodeIgniter 可以智能的管理并自动关闭数据库连接，你仍可以用下面的方法显式的关闭掉。

$this->db->close();

翻译贡献者: Fanbin, Hex, lishen2, phper08, qixingyue, szlinz, thankwsx, wangjunjie871111, xian366, yinzhili, zehee, zfm1988, 笼中
最后修改: 2013-09-08 15:52:16

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


数据库例子代码 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

CodeIgniter 中国首页 › 用户指南首页 › 数据库类 › 字段元数据

字段数据

$this->db->list_fields()

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

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

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

$fields = $this->db->list_fields('table_name');

foreach ($fields as $field)
{
echo $field;
}
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, Drice, Hex, hui314, loiynet
最后修改: 2012-10-25 17:10:40

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


数据库维护类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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/true: 为字段生成自动增量标记。注意，字段类型必须支持自动增量标记，如整型。

$fields = array(
                        'blog_id' => array(
                                                 'type' => 'INT',
                                                 'constraint' => 5,
                                                 'unsigned' => TRUE,
                                                 'auto_increment' => TRUE
                                          ),
                        'blog_title' => array(
                                                 'type' => 'VARCHAR',
                                                 'constraint' => '100',
                                          ),
                        'blog_author' => array(
                                                 'type' =>'VARCHAR',
                                                 'constraint' => '100',
                                                 'default' => 'King of Town',
                                          ),
                        'blog_description' => array(
                                                 'type' => 'TEXT',
                                                 'null' => TRUE,
                                          ),
                );

字段定义后，使用$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`)

译者注：此处存在BUG!经验证，以上代码创建的是两个单独的非主键，而不是一个多列的非主键。有关此BUG的解决方案，详见CI中国论坛！

创建表

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

$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

翻译贡献者: crazyfriday, Hex, ianyang, yeto, yinzhili, 笼中
最后修改: 2013-02-14 14:07:53

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


查询辅助函数 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

查询辅助函数

$this->db->insert_id()

这个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...):

输出系统使用的数据库平台(MySQL, MS SQL, Postgres……)

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, IT不倒翁, loiynet, sexy22
最后修改: 2012-10-25 17:00:51

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


查询 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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) 以表示查询成功与失败. 它将不会返回查询数据集，无法设置查询计时器(设置环境变量)，无法编译绑定数据，不能够存储查询诊断信息。 简单地说，他是一个用于提交查询的函数，对于大多数用户而言并不会使用到它。

Working with Database prefixes manually

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

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

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

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

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

保护标识符

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

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

Although Active Record will try its best to properly quote any field and table names that you feed it, note that it is NOT designed to work with arbitrary user input. DO NOT feed it with unsanitized user data.

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

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

转义查询

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

  1. $this->db->escape() 这个函数将会确定数据类型，以便仅对字符串类型数据进行转义。并且，它也会自动把数据用单引号括起来，所以你不必手动添加单引号，用法如下： $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
最后修改: 2014-06-10 13:40:54

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


查询结果 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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()函数，该字符串代表着某个类为每一个result对象进行实例化 （注意：该类必须已经被加载）。

$query = $this->db->query("SELECT * FROM users;");

foreach ($query->result('User') as $row)
{
   echo $row->name; // call attributes
   echo $row->reverse_name(); // or methods defined on the 'User' class
}

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

如果传入的参数超出行索引，则返回第一行(索引为0)数据

你也可以添加一个字符串参数，它是一个类在row()函数下实例化的名字：

$query = $this->db->query("SELECT * FROM users LIMIT 1;");

$query->row(0, 'User')
echo $row->name; // call attributes
echo $row->reverse_name(); // or methods defined on the 'User' class

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

如果传入的参数超出行索引，则返回第一行(索引为0)数据

除此以外, 我们还可以使用下面的方法通过游标的方式获取记录：

$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, loiynet, wangjunjie871111
最后修改: 2012-10-25 16:51:16

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


数据库表数据 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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().

翻译贡献者: Drice, Hex, iptton, yinzhili
最后修改: 2010-10-22 11:07:30

上一个主题: 字段元数据 · 页首 · 用户指南首页 · 下一个主题: 数据库表元数据


数据库工具类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

有时候判断一个特定的数据库是否存在，是非常有用的功能。返回一个布尔值 TRUE/FALSE. 使用范例:

if ($this->dbutil->database_exists('database_name'))
{
   // some code...
}

注意: 将 database_name 替换为你想要查找的数据库名称。这个函数是区分大小写的。

$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
最后修改: 2012-02-05 23:03:30

上一个主题: 数据库工厂类 · 页首 · 用户指南首页 · 下一个主题: Javascript 类


从 1.1 升级到 1.2 最终版 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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

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


从 1.5.3 升级到 1.5.4 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

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


从 1.5.4 升级到 1.6.0 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

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


从 1.6.0 升级到 1.6.1 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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

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


从 1.6.2 升级到 1.6.3 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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
最后修改: 2011-02-01 01:10:57

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


从 1.7.0 升级到 1.7.1 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

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


从 1.7.1 升级到 1.7.2 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

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


从 1.7.2 升级到 1.7.3 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

从 1.7.2 升级到 1.7.3

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

第 1 步: 升级你的 CodeIgniter 文件

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

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

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

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

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

翻译贡献者: Hex
最后修改: 2010-12-07 13:20:53

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


从 1.7.3 升级到 2.0.0 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

从 1.7.3 升级到 2.0.0

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

第 1 步: 升级你的 CodeIgniter 文件

替换你的“system”目录下的所有文件，除了你的application目录。

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

第 2 步：在必要的地方调整get_dir_file_info()函数

出于兼容性的考虑，2.0.0版将get_dir_file_info()函数改为无返回值，这个在文件辅助函数中。在CodeIgniter中，出于兼容性而使用无返回值的改变是极其稀少的，但这次我们感觉是正确的，因为它使得创建安全的服务器运行输出变得简单。如果你需要 同时输出子目录及其以下目录的文件信息，请更改调用，设置第二个参数$top_level_only为FALSE：

get_dir_file_info('/path/to/directory', FALSE);

第 3 步：将你的插件转换成辅助函数

2.0.0版删除了插件系统，因为它的功能与辅助函数完全一样，但是它们缺乏扩展性。你需要将你的插件的文件名从“文件名_pi.php”改为“文件名_helper.php”，并且移动到你的helpers目录，然后更改所有的调用 $this->load->plugin('foo'); 为 $this->load->helper('foo');

第 4 步：升级存储的已加密数据

说明：如果你的应用程序没有使用加密类库，没有保存永久加密数据，或者在一个不支持Mcrypt的环境，你可以跳过此步。

加密类库进行了数量众多的更新，一些在加密强度方面和一些在执行方面，因此不可避免地导致了该类库前期版本的加密数据再也无法被解密。为了帮助转换，我们添加了一个新方法encode_from_legacy()，它将使用原来的算法解密数据并返回一个使用升级的算法重新加密后的数据。这样你可以轻松而快速地大量更新你的应用程序中的旧的加密数据。

请在加密类库的文档中阅读如何使用这个方法。

第 5 步：删除对兼容性辅助函数的调用

兼容性辅助函数已经从CodeIgniter核心中删除。其中的所有方法都已被PHP原生支持。

第 6 步：升级类的继承方式

现在所有的核心类都使用了“CI_”前缀。请分别升级模型和控制器为继承CI_Model和CI_Controller。

第 7 步：升级对父类构造函数的调用

现在所有的原生CodeIgniter类都使用了PHP 5的构造函数形式“__construct()”。请更改继承类的代码为调用“parent::__construct()”。

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

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

翻译贡献者: bottom, Hex
最后修改: 2013-10-29 13:51:20

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


从 2.0.0 升级到 2.0.1 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

Upgrading from 2.0.0 to 2.0.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 all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.

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

Step 2: Replace config/mimes.php

This config file has been updated to contain more mime types, please copy it to application/config/mimes.php.

Step 3: Check for forms posting to default controller

The default behavior for form_open() when called with no parameters used to be to post to the default controller, but it will now just leave an empty action="" meaning the form will submit to the current URL. If submitting to the default controller was the expected behavior it will need to be changed from:

echo form_open(); //<form action="" method="post" accept-charset="utf-8">

to use either a / or base_url():

echo form_open('/'); //<form action="http://example.com/index.php/" method="post" accept-charset="utf-8">
echo form_open(base_url()); //<form action="http://example.com/" method="post" accept-charset="utf-8">

翻译贡献者: Hex
最后修改: 2012-02-05 16:10:28

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


从 2.0.1 升级到 2.0.2 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

Upgrading from 2.0.1 to 2.0.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 all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.

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

Step 2: Remove loading calls for the Security Library

Security has been moved to the core and is now always loaded automatically. Make sure you remove any loading calls as they will result in PHP errors.

Step 3: Move MY_Security

If you are overriding or extending the Security library, you will need to move it to application/core.

csrf_token_name and csrf_hash have changed to protected class properties. Please use security->get_csrf_hash() and security->get_csrf_token_name() to access those values.

翻译贡献者: Hex
最后修改: 2012-02-05 16:12:19

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


从 2.0.2 升级到 2.0.3 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

Upgrading from 2.0.2 to 2.0.3

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 all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.

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

Step 2: 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 3: Replace config/user_agents.php

This config file has been updated to contain more user agent types, please copy it to application/config/user_agents.php.

Step 4: Change references of the EXT constant to ".php"

Note: The EXT Constant has been marked as deprecated, but has not been removed from the application. You are encouraged to make the changes sooner rather than later.

Step 5: Remove APPPATH.'third_party' from autoload.php

Open application/autoload.php, and look for the following:

$autoload['packages'] = array(APPPATH.'third_party');

If you have not chosen to load any additional packages, that line can be changed to:

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

Which should provide for nominal performance gains if not autoloading packages.

Update Sessions Database Tables

If you are using database sessions with the CI Session Library, please update your ci_sessions database table as follows:

CREATE INDEX last_activity_idx ON ci_sessions(last_activity); ALTER TABLE ci_sessions MODIFY user_agent VARCHAR(120);

翻译贡献者: Hex
最后修改: 2012-02-05 16:13:27

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


从 2.0.3 升级到 2.1.0 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

从 2.0.3 升级到 2.1.0

在升级之前，您应该通过替换index.php为静态文件来关闭您的站点。

第 1 步：更新您的 CodeIgniter 文件

替换您的“system”目录下的所有文件和目录，同时替换您的index.php文件。如果您的index.php文件有任何修改，您就需要修改新文件。If any modifications were made to your index.php they will need to be made fresh in this new one.

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

第 2 步：替换 config/user_agents.php

这个配置文件已经更新，其中包含了更多的用户代理类型，请将其复制到application/config/user_agents.php。

翻译贡献者: bottom, Hex
最后修改: 2012-05-07 14:22:51

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


从 2.1.0 升级到 2.1.1 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

Upgrading from 2.1.0 to 2.1.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 all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.

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

Step 2: Replace config/mimes.php

This config file has been updated to contain more user mime-types, please copy it to application/config/mimes.php.

Step 3: Update your IP address tables:

This upgrade adds support for IPv6 IP addresses. In order to store them, you need to enlarge your ip_address columns to 45 characters. For example, CodeIgniter's session table will need to change:

ALTER TABLE ci_sessions CHANGE ip_address ip_address varchar(45) default '0' NOT NULL

翻译贡献者: Hex
最后修改: 2012-06-18 18:24:30

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


从 2.1.1 升级到 2.1.2 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

Upgrading from 2.1.1 to 2.1.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 all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.

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

翻译贡献者: Hex
最后修改: 2013-03-22 07:46:53

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


从 2.1.2 升级到 2.1.3 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

Upgrading from 2.1.2 to 2.1.3

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 all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.

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

翻译贡献者: Hex
最后修改: 2013-03-22 07:47:57

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


从 2.1.3 升级到 2.1.4 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

Upgrading from 2.1.3 to 2.1.4

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 all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.

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

翻译贡献者: Hex
最后修改: 2013-07-11 10:14:19

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


从 2.1.4 升级到 2.2.0 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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

Upgrading from 2.1.4 to 2.2.0

Note: The Encryption Class now requires the Mcrypt extension. If you were previously using the Encrypt Class without Mcrypt this is a breaking change, you must install the Mcrypt extension in order to upgrade. For information on installing Mcrypt please see the PHP documentation.

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 all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.

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

翻译贡献者: Hex
最后修改: 2014-06-10 13:57:36

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


从 Beta 1.0 升级到 Beta 1.1 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

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 中文手册|用户手册|用户指南|Wiki文档

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 类