用户
 找回密码
 入住 CI 中国社区
搜索
查看: 6174|回复: 9
收起左侧

[已解决] $this->db->field_data()中的max_length不是该字段的长度?

[复制链接]
发表于 2010-11-11 15:33:59 | 显示全部楼层 |阅读模式
本帖最后由 julia 于 2010-11-11 15:35 编辑

希望通过CI获得字段设置的长度,但按照下面的例题所获得的并不是该字段的长度?也不是实际保存数据的长度?
http://codeigniter.com/user_guide/database/fields.html

请问如何在CI中获得数据库中某字段的长度?
mysql_field_len ( resource result, int field_offset ) //这是原始的获取长度,在CI中使用不畅。CI中提供的如上,也不完整?
发表于 2010-11-12 02:27:33 | 显示全部楼层
本帖最后由 qi_ruo 于 2010-11-12 03:07 编辑

http://codeigniter.com/forums/viewthread/154455/
max_length获取的是查询结果中某个字段长度最大的值,如果要获取某字段定义的长度,可以使用mysql_field_len()函数,修改system\database\drivers\mysql\mysql_result.php代码:
PHP复制代码
 
function field_data()
{
    $retval = array();
    $index = 0;
    while ($field = mysql_fetch_field($this->result_id))
    {
        $F = new stdClass();
        $F->name = $field->name;
        $F->type = $field->type;
        $F->default = $field->def;
        $F->max_length = $field->max_length;
        $F->primary_key = $field->primary_key;
        $F->len = mysql_field_len($this->result_id, $index++);
 
        $retval[] = $F;
    }
    return $retval;
}
 
复制代码

这样len属性返回的就是该字段的定义长度,如果某个字段的编码是utf8,如char(40),那么len=40*3=120,不知道有没更好的方法...
 楼主| 发表于 2010-11-14 12:29:03 | 显示全部楼层
谢谢!添加了这一行在system\database\drivers\mysql\mysql_result.php
$F->len = mysql_field_len($this->result_id, $index++);

可以获得需要的field_len

如果编码是utf8,如char(40)
len=len/3 可获得正确长度

-----------------------------------新问题,如何获得单独值表达式(不要循环取值)
例如:希望获得字段名=tiltle 的 len
$fields = $this->db->field_data($table);
echo $fields->len['title']; //该表达式不正确?
发表于 2010-11-15 00:22:56 | 显示全部楼层
本帖最后由 qi_ruo 于 2010-11-15 00:26 编辑

可以自己写个field_len函数
PHP复制代码
 
function field_len($field_name = '')
{
    $retval = array();
    $index = 0;
    while($field = mysql_fetch_field($this->result_id))
    {
        $retval[$field->name] = mysql_field_len($this->result_id, $index++);
    }
    if($field_name)
    {
        return $retval[$field_name];
    }
    else
    {
        return $retval;
    }
}
 
复制代码

使用:
$query = $this->db->query('select * from users limit 1');
$fields = $query->field_len();
echo $fields['username'];

或者
echo $query->field_len('username');
 楼主| 发表于 2010-11-15 05:34:23 | 显示全部楼层
谢谢!
现有的不可以直接取值吗?需要获得某几个字段的name, len, type
$fields = $this->db->field_data($table);
发表于 2010-11-15 09:16:05 | 显示全部楼层
fielddata()函数只能使用字段的偏移量来取,如:
$fields = $this->db->field_data('users');
echo $fields[1]->type;
echo $fields[1]->len;

如果要使用字段名来取值,可以把field_data()函数里的
$retval[] = $F; 改为 $retval[$field->name] = $F;
比如要取username字段的len和type
$fields = $this->db->field_data('users');
echo $fields['username']->type;
echo $fields['username']->len;

另外 如果要取某个域的最大长度max_length时, 不能使用$this->db->field_data('users');因为这个默认只取第一行,要这样写
$query = $this->db->query('select * from users');
$fields = $query->field_data();
echo $fields['username']->type;
echo $fields['username']->len;
echo $fields['username']->max_length;
 楼主| 发表于 2010-11-15 18:28:56 | 显示全部楼层
多谢!:)
你怎么如此熟悉CI?
参加了他们的开发吗?
 楼主| 发表于 2010-11-15 19:08:16 | 显示全部楼层
本帖最后由 julia 于 2010-11-16 04:14 编辑

因为要处理utf8,所以还要回到循环处理,然后再单独取值
--------------models
$fields = $this->db->field_data($table);
        foreach ($fields as $row){                  
                        if ($row->type=='string') $row->len = $row->len/3; //utf8
            $field[] = $row;
        }

$form_data = array( //请问这里如何写
                    'id'     => array('type'=>'input', 'size'=>20,'maxlength'=>$field['id']->len,'value'=>$value['id'],'name'=>'id','id'=>'id','readonly'=>'readonly' ),
            'name'   => array('type'=>'input', 'size'=>20,'maxlength'=>$field['name']->len,'value'=>$value['name'],'name'=>'name','id'=>'name' )
);
   
return $form_data;
 楼主| 发表于 2010-11-17 18:15:10 | 显示全部楼层
本帖最后由 julia 于 2010-11-18 10:08 编辑

解决了: $field['name']->len; :)  //$rows[$row->name] = $row;

---------------一点小问题,可以忽略
95 $retval[$field->name] = mysql_field_len($this->result_id, $index++);

出错提示: Message: Undefined variable: index

Filename: mysql/mysql_result.php

Line Number: 95
 楼主| 发表于 2010-11-27 14:56:58 | 显示全部楼层
---------------一点小问题,无法忽略啦!寻求解决
出错提示: Message: Undefined variable: index

Filename: mysql/mysql_result.php

Line Number: 95
$F->len = mysql_field_len($this->result_id, $index++);

本版积分规则