我遇到一个问题,我在codeigniter中调用n查询对象上的result_array()
函数:
$this->db->select(array('a','b','c'));
$query = $this->db->get('basic');
print_r($query->list_fields());
$test = $query->result_array();
print_r($query->list_fields());
当我运行此代码时,或者:
$query = $this->db->get('basic');
print_r($query->list_fields());
print_r($query->list_fields());
或:
$query = $this->db->get('basic');
$test = $query->result_array();
print_r($query->list_fields());
第二个list_fields()
函数总是返回一个数组大小为0,第一个返回正确的字段名列表。
在最后一个只有一个list_fields()函数的例子中,数组的大小为零。
非常感谢任何有关此事的指导。在阅读list_fields()
后,我需要result_array()
函数可访问。
以下是第一段代码的结果:
Array
(
[0] => site_id
[1] => institution
[2] => caller
[3] => call_complete
[4] => call_details
[5] => id
[6] => timestamp
)
Array
(
)
谢谢你的帮助
答案 0 :(得分:1)
这看起来是数据库驱动程序中的错误。例如,在CI_DB_mysqli_result
中:
public function list_fields()
{
$field_names = array();
while ($field = $this->result_id->fetch_field())
{
$field_names[] = $field->name;
}
return $field_names;
}
后续调用将返回array()
,因为while循环遍历所有字段并将指针留在列表的末尾。
但是,在结果类中,result_id
是公开的,因此您可以使用mysqli_result::field_seek:
$query = $this->db->get('basic');
var_dump($query->list_fields());
// this should be called before any call to list_fields()
$query->result_id->field_seek(0);
var_dump($query->list_fields());
然而,这是不好的做法,因为这只适用于mysqli;对于mysql,你需要这个:
mysql_field_seek($query->result_id, 0);
和mssql:
mssql_field_seek($query->result_id, 0);
执行此操作的正确方法是将其修复到数据库驱动程序中。见this pull request: - )