CodeIgniter:防止row_array()vs row()拼写错误?

时间:2011-09-29 13:26:24

标签: php codeigniter codeigniter-2

现在两次我在获取单行结果时错误地使用了row()而不是row_array()。通常,它会在没有任何警告消息的情况下取消选中。 15-30分钟后我终于发现了这个问题; doh doh!

有没有人对防止这种错误的方法有任何好的建议。对象格式不会抛出PHP警告,但是 - 当然 - 当您期望模型方法中的数组时,代码不起作用。

我不小心使用了:

if ($query->num_rows() > 0) {
    return $query->row();
}

应改为:

if ($query->num_rows() > 0) {
    return $query->row_array();
}

我考虑过覆盖row()数据库方法并添加一个log_message()语句,该语句至少让我知道(在调试级别上)我正在使用对象格式,而不是更典型的(对于我的代码)格式。

3 个答案:

答案 0 :(得分:1)

如何避免在 CodeIgniter 模型方法中出现数据类型错误?简单,声明方法的返回数据类型。

// returns null or an object
public function getFlatObject(int $id): ?object
{
    return $this->db->get_where("your_table", ['id' => $id])->row();
}

// unconditionally returns an array
public function getFlatArray(int $id): array
{
    return $this->db->get_where("your_table", ['id' => $id])->row_array();
}

如果您的返回数据与声明的类型不匹配(在 : 之后),那么 php 将为您生成错误。


让我们借此机会消除任何困惑...

  • 如果你调用 row()row_array() 并且你的 sql 逻辑提供了多行数据的可能性——那么你只会得到结果的第一行设置。

  • 如果您调用 row() 但结果集中没有行,您将获得 null 的返回值。

  • 如果您调用 row_array() 但结果集中没有行,您将收到一个空数组作为返回值。

  • 因此,row() 可能返回可迭代或不可迭代的数据类型;而 row_array() 总是可以安全地直接传递给迭代器(如 foreach()array_map())——它只是可能没有任何东西可以迭代。

答案 1 :(得分:0)

“防止”的唯一方法是再次学习文档,这样你就可以养成使用哪种功能的共同习惯。

您可以注意到,如果您要返回多个记录,请使用row_array(),对于单数记录,请使用{{1}功能。

请记住,不要加速输入代码,在继续之前逐步校对代码。

覆盖原始函数是不好的做法,使用row()函数在检索单数记录时很有用,所以不要这样做。

答案 2 :(得分:0)

row()返回对象类型,而row_array()返回array。 因此,在使用row_array时,最好在DB中解析行数据的数据。