# CodeIgniter 用户指南 版本 2.2.0

编辑文档、查看近期更改请 登录 或 注册 找回密码

搜索用户指南

查看原文

# 查询

## $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