2

result_array()codeigniter から n クエリ オブジェクトで関数を呼び出すという問題があります。

   $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());

2 番目のlist_fields()関数は常に配列サイズ 0 を返し、最初の関数はフィールド名の正しいリストを返します。

list_fields() 関数が 1 つしかない最後の例では、配列のサイズはゼロです。

この問題に関するガイダンスは大歓迎です。list_fields()を読んだ後、関数にアクセスできるようにする必要がありますresult_array()

コードの最初のブロックの結果は次のとおりです。

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

ご協力ありがとうございました

4

1 に答える 1

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は public であるため、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);

これを行う正しい方法は、実際にはデータベース ドライバーで修正することです。このプルリクエストを参照してください:-)

于 2013-01-28T23:14:23.427 に答える