现在两次我在获取单行结果时错误地使用了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()语句,该语句至少让我知道(在调试级别上)我正在使用对象格式,而不是更典型的(对于我的代码)格式。
答案 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中解析行数据的数据。