$this->db->field_data()中的max_length不是该字段的长度?
本帖最后由 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中提供的如上,也不完整? 本帖最后由 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代码:
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,不知道有没更好的方法... 谢谢!添加了这一行在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']; //该表达式不正确? 本帖最后由 qi_ruo 于 2010-11-15 00:26 编辑
可以自己写个field_len函数
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'); 谢谢!
现有的不可以直接取值吗?需要获得某几个字段的name, len, type
$fields = $this->db->field_data($table); fielddata()函数只能使用字段的偏移量来取,如:
$fields = $this->db->field_data('users');
echo $fields->type;
echo $fields->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; 多谢!:)
你怎么如此熟悉CI?
参加了他们的开发吗? 本帖最后由 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; 本帖最后由 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 ---------------一点小问题,无法忽略啦!寻求解决
出错提示: Message: Undefined variable: index
Filename: mysql/mysql_result.php
Line Number: 95
$F->len = mysql_field_len($this->result_id, $index++);
页:
[1]