$ query-> result_array()擦掉list_fields()数据

时间:2013-01-28 22:46:46

标签: php codeigniter

我遇到一个问题,我在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
    (
    )

谢谢你的帮助

1 个答案:

答案 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: - )