数据表中常常会有一个表示类型的字段(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;
} 最佳答案