TP3.2 修改表字段函数

浏览:6028 发布日期:2014/12/14 分类:技术分享 关键字: php
修改表结构,是可以操作数据库管理工具来完成,但我写这个函数,是出于一种场景的考虑,才花了几个小时封装了一个函数。
数据表中常常会有一个表示类型的字段(type),而这个type也就几种可能,没必要建一个类型表,所以就以1、2、3等数字表示。
以这种方式的话,那势必要在表注释写明数字对应的含义。
然后也程序代码中加入关于type的配置项,方便全局使用。
以上都没有什么问题,但是后期type种类会有所增补。这样,就不得不改程序代码里的配置以及type字段的注释。
以我这么懒的个性,是不能忍受的。所以,封装了这个函数,这样,当修改了程序代码中的类型配置,再调用这个函数,就方便多了。
代码:/**
 * 修改表字段
 * @param string $table 表名
 * @param string $field 字段
 * @param string $value 值
 * @param string $column 类型
 * @return array 状态与消息
 * 例如:修改user表的uname字段的注释
 * 其他类型可根据 SHOW FULL COLUMNS  FROM $table_name 来理解
 * modify_column('user', 'uname', 'comment', '这是用户名');
 */
function modify_column($table, $field, $column, $value){

    $column = ucfirst($column);
    $Model = M($table);
    $columns = $Model->query("SHOW FULL COLUMNS FROM `__TABLE__`");
    if(empty($columns)){
        $error = array(-2, '数据表不存在'); goto FunErr;
    }
    
    $options = array_map('ucfirst',array_keys(current($columns)));
    if(!in_array($column, $options)){
        $error = array(-1, '非法列字段名'); goto FunErr;
    }

    foreach($columns as $row){
        //框架查询返回的$columns的键名都是小写,这里转换首字母大写
        foreach($row as $key => $val){
            $row['new'][ucfirst($key)] = $val;
        }
        $row = $row['new'];
        
        if($row['Field'] != $field) continue;
        $sql = "ALTER TABLE `__TABLE__`";
        if($column == 'Field'){
            $sql .= " CHANGE COLUMN `$field` `$value`";
        }else{
            $sql .= " MODIFY COLUMN `$field`";
            $row[$column] = $value;
        }

        $sql .= $row['Type'];
        if($row['Collation']) $sql .= ' COLLATE '. $row['Collation'];
        $sql .= ($row['Null'] == 'YES')? ' NULL' :' NOT NULL';
        if($row['Default']) $sql .= ' DEFAULT '. $row['Default'];
        if($row['Extra']) $sql .= ' ' . strtoupper($row['Extra']);
        if($row['Comment']) $sql .= ' COMMENT ' . $row['Comment'];
        break;
    }

    if($Model->execute($sql) === false){
        $error = array(-3, '修改失败'); goto FunErr;
    }
    $funStep = true;
    FunErr:
    if(empty($funStep)){
        $return = array('status'=>$error[0], 'info'=>$error['info']);
    }else{
        $return = array('status'=>1, 'info'=>'修改成功');
    }
    return $return;
}
最佳答案
评论( 相关
后面还有条评论,点击查看>>