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


$query->result_array() wipes away list_fields() data

我遇到了一个问题,我在代码点火器中调用了 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() 函数的最后一个示例中,数组的大小再次为零。

在此问题上的任何指导将不胜感激。我需要在阅读result_array()后可以访问list_fields()函数。

下面是第一个代码块的结果:

    Array
    (
        [0] => site_id
        [1] => institution
        [2] => caller
        [3] => call_complete
        [4] => call_details
        [5] => id
        [6] => timestamp
    )
    Array
    (
    )

谢谢你的帮助

这似乎是数据库驱动程序中的一个错误。例如,在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);

执行此操作的正确方法实际上是在数据库驱动程序中修复它。请参阅此拉取请求:-)