生成查询结果

有几种方式生成查询结果:

结果数组

getResult()

这个方法返回 对象数组 类型的查询结果,或在失败时返回 一个空数组 。 典型的用法是使用 foreach 循环,像这样:

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

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

上面的方法是 getResultObject() 的别名。

如果你想返回一个二维数组,可以给第一个参数传字符串 ‘array’

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

foreach ($query->getResult('array') as $row)
{
    echo $row['title'];
    echo $row['name'];
    echo $row['body'];
}

上面的方法是 getResultArray() 的别名。

你也可以传字符串参数到 getResult() 方法,表示要为每个结果对象实例化的类

$query = $db->query("SELECT * FROM users;");

foreach ($query->getResult('User') as $user)
{
    echo $user->name; // 获取属性
    echo $user->reverseName(); // 或访问 'User' 类定义的方法
}

上面的方法是 getCustomResultObject() 的别名。

getResultArray()

这个方法返回一个纯数组的查询结果,查无结果时为空数组。 典型的用法是使用 foreach 循环,像这样:

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

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

单行结果

getRow()

这个方法返回一个单行结果,如果你的查询有多行结果,它仅返回第一条。 返回结果是一个 对象 。使用示例:

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

$row = $query->getRow();

if (isset($row))
{
    echo $row->title;
    echo $row->name;
    echo $row->body;
}

如果你想返回指定行的结果,可以在第一个参数里提供这个数字:

$row = $query->getRow(5);

你也可以传一个字符串到第二个参数,表示该结果实例化的对象类:

$query = $db->query("SELECT * FROM users LIMIT 1;");
$row = $query->getRow(0, 'User');

echo $row->name; // 获取属性
echo $row->reverse_name(); // 或访问 'User' 类定义的方法

getRowArray()

这个与上面的 row() 方法基本相同,区别是它返回的是一个数组。 示例:

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

$row = $query->getRowArray();

if (isset($row))
{
    echo $row['title'];
    echo $row['name'];
    echo $row['body'];
}

如果你想返回指定行的结果,可以在第一个参数里提供这个数字:

$row = $query->getRowArray(5);

另外,你可以用这些方法在结果集里做 前进/后退/首行/尾行 的游标操作:

$row = $query->getFirstRow()
$row = $query->getLastRow()
$row = $query->getNextRow()
$row = $query->getPreviousRow()

默认他们返回一个对象,除非第一个参数是字符串 “array” 才会返回数组:

$row = $query->getFirstRow(‘array’)
$row = $query->getLastRow(‘array’)
$row = $query->getNextRow(‘array’)
$row = $query->getPreviousRow(‘array’)

注解

以上所有方法都会把整个查询结果载入内存(预加载)。 请使用 getUnbufferedRow() 方法处理大型结果集。

getUnbufferedRow()

这个方法返回单个结果,不会像 row() 把整个结果预加载到内存里。 如果你的查询结果多于一个,它返回当前行并将内部数据指针向前移动。

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

while ($row = $query->getUnbufferedRow())
{
    echo $row->title;
    echo $row->name;
    echo $row->body;
}

你可以选择性的传参 ‘object’ (默认) 或 ‘array’ 来指定返回数据的类型:

$query->getUnbufferedRow();         // 对象
$query->getUnbufferedRow('object'); // 对象
$query->getUnbufferedRow('array');  // 关联数组

自定义结果对象

你可以用一个自定义的类实例作为返回结果,代替原来的 stdClass 对象或数组, getResult()getResultArray() 允许如此操作。 如果该类(文件)尚未加载到内存,自动加载器会尝试载入它。 对象的属性值会设置为数据库的返回数据,如果是非公开属性, 你需要提供一个 __set() 方法以允许他们被赋予值。

示例:

class User
{
        public $id;
        public $email;
        public $username;

        protected $last_login;

        public function lastLogin($format)
        {
                return $this->lastLogin->format($format);
        }

        public function __set($name, $value)
        {
                if ($name === 'lastLogin')
                {
                        $this->lastLogin = DateTime::createFromFormat('U', $value);
                }
        }

        public function __get($name)
        {
                if (isset($this->$name))
                {
                        return $this->$name;
                }
        }
}

除了下面列出的两个方法之外,这些方法也可以指定类名 返回类实例的结果集: getFirstRow(), getLastRow(), getNextRow()getPreviousRow()

getCustomResultObject()

以要求的类实例数组的形式返回整个结果集。 唯一的参数是要实例化的类的名称。

示例:

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

$rows = $query->getCustomResultObject('User');

foreach ($rows as $row)
{
        echo $row->id;
        echo $row->email;
        echo $row->last_login('Y-m-d');
}

getCustomRowObject()

以要求的类实例形式返回单个结果,第一个参数是它在结果集里的序号, 第二个参数是要实例化的类的名称。

示例:

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

$row = $query->getCustomRowObject(0, 'User');

if (isset($row))
{
        echo $row->email;                 // 获取属性
        echo $row->last_login('Y-m-d');   // 或访问 'User' 类定义的方法
}

你也可以用 getRow() 方法达到相同效果。

示例:

$row = $query->getCustomRowObject(0, 'User');

结果处理辅助方法

getFieldCount()

返回查询结果的字段个数(列数),确保你是使用查询结果对象调用此方法:

$query = $db->query('SELECT * FROM my_table');

echo $query->getFieldCount();

getFieldNames()

返回查询结果的字段名(列名)的数组,确保你是使用查询结果对象调用此方法:

$query = $db->query('SELECT * FROM my_table');

    echo $query->getFieldNames();

freeResult()

它会释放查询结果占用的内存并删除资源ID。通常 PHP 会在脚本结束时自动释放内存, 然而,如果你在某个脚本里执行了很多查询,你也许想处理完每个查询后即刻释放内存, 以此减少内存消耗。

举例:

$query = $thisdb->query('SELECT title FROM my_table');

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

$query->freeResult();  // $query 的结果对象不再可用

$query2 = $db->query('SELECT name FROM some_table');

$row = $query2->getRow();
echo $row->name;
$query2->freeResult(); // $query2 的结果对象不再可用

dataSeek()

该方法设置一个内部指针,用来获取下一个结果行,它仅和 getUnbufferedRow() 一起使用才有作用。

它接受一个正整数值,默认是0,返回 TRUE 表示成功,FALSE 表示失败。

$query = $db->query('SELECT `field_name` FROM `table_name`');
$query->dataSeek(5); // Skip the first 5 rows
$row = $query->getUnbufferedRow();

注解

不是所有数据库驱动支持这个特性,(不支持的)会返回 FALSE。 最值得注意的是 - 你无法在 PDO 中使用它。

类库参考

CodeIgniter\Database\BaseResult
getResult([$type = 'object'])
参数:
  • $type (string) – 要求的结果类型 - array, object, 或 类名
返回:

包含查询到的行的数组

返回类型:

array

它是这几种方法的包装: getResultArray(), getResultObject()getCustomResultObject()

用法: 详见 结果数组.

getResultArray()
返回:包含查询到的行的数组
返回类型:array

返回查询结果行的数组,每行都是关联数组。

用法: 详见 结果数组.

getResultObject()
返回:包含查询到的行的数组
返回类型:array

返回查询结果行的数组,每行都是 stdClass 类的实例。

用法: 详见 结果数组.

getCustomResultObject($class_name)
参数:
  • $class_name (string) – 结果行的类实例名
返回:

包含查询到的行的数组

返回类型:

array

返回查询结果行的数组,每行都是指定类的实例。

getRow([$n = 0[, $type = 'object']])
参数:
  • $n (int) – 想要返回的结果行的序号
  • $type (string) – 要求的结果类型 - array, object, 或 类名
返回:

要求的行数据,不存在时返回 NULL

返回类型:

mixed

它是这几种方法的包装: getRowArray(), getRowObject()getCustomRowObject()

用法: 详见 单行结果.

getUnbufferedRow([$type = 'object'])
参数:
  • $type (string) – 要求的结果类型 - array, object, 或 类名
返回:

结果集的下一行,不存在时返回 NULL

返回类型:

mixed

按要求的格式返回结果集的下一行。

用法: 详见 单行结果.

getRowArray([$n = 0])
参数:
  • $n (int) – 想要返回的结果行的序号
返回:

要求的行数据,不存在时返回 NULL

返回类型:

array

返回结果行,格式为关联数组。

用法: 详见 单行结果.

getRowObject([$n = 0])
参数:
  • $n (int) – 想要返回的结果行的序号
返回:

要求的行数据,不存在时返回 NULL

返回类型:

stdClass

返回结果行,格式为 stdClass 的类实例。

用法: 详见 单行结果.

getCustomRowObject($n, $type)
参数:
  • $n (int) – 想要返回的结果行的序号
  • $class_name (string) – 结果行的类实例名
返回:

要求的行数据,不存在时返回 NULL

返回类型:

$type

返回结果行,格式为要求的的类实例。

dataSeek([$n = 0])
参数:
  • $n (int) – 即将返回的结果行的序号
返回:

TRUE 表示成功,FALSE 表示失败

返回类型:

bool

移动结果集的内部指针到指定位置。

用法: 详见 结果处理辅助方法.

setRow($key[, $value = NULL])
参数:
  • $key (mixed) – 列名或键值数组
  • $value (mixed) – 分配给列的值,$key 是单个字段名
返回类型:

void

为特定列分配值。

getNextRow([$type = 'object'])
参数:
  • $type (string) – 要求的结果类型 - array, object, 或 类名
返回:

结果集的下一行,不存在时返回 NULL

返回类型:

mixed

返回结果集的下一行。

getPreviousRow([$type = 'object'])
参数:
  • $type (string) – 要求的结果类型 - array, object, 或 类名
返回:

结果集的上一行,不存在时返回 NULL

返回类型:

mixed

返回结果集的上一行。

getFirstRow([$type = 'object'])
参数:
  • $type (string) – 要求的结果类型 - array, object, 或 类名
返回:

结果集的第一行,不存在时返回 NULL

返回类型:

mixed

返回结果集的第一行。

getLastRow([$type = 'object'])
参数:
  • $type (string) – 要求的结果类型 - array, object, 或 类名
返回:

结果集的最后一行,不存在时返回 NULL

返回类型:

mixed

返回结果集的最后一行。

getFieldCount()
返回:结果集中字段的个数
返回类型:int

返回结果集中字段的个数。

用法: 详见 `结果处理辅助函数`_.

getFieldNames()
returns:列名称的数组
rtype:array

返回一个包含结果集中字段名的数组。

getFieldData()
返回:包含字段元数据的数组
返回类型:array

生成一个包含字段元数据的 stdClass 对象的数组。

freeResult()
返回类型:void

释放一个结果集。

用法: 详见 `结果处理辅助函数`_.