发新帖

[文档教程] 使用xiunoPHP判断字段是否存在

大白 12天前 181

在开发《大白链接》插件的时候,到1.5版本需要新增一个字段str,想法如下:

如果用户的 huux_os_link 表中没有str字段则创建这个字段。

于是我是这样设计的

//原设计
$arry = db_find_one('huux_os_link', array('str'=>''));
if(!$arry){
   $tablepre = $db->tablepre;
   $sql = "ALTER TABLE {$tablepre}huux_os_link ADD COLUMN str mediumtext NOT NULL ";
   $r = db_exec($sql);
   if($r === FALSE) {
      echo $errstr;
   } else {
   message(0, jump('升级成功,新增字段备注str', url("plugin-setting-huux_os_link"), 1));
   }
}

之后和群里的祥子探讨学习了下,确实有不对之处

例如:如果用户的huux_os_link表中没有数据也就是返回为空,那肯定也要执行if下面的语句,于是做了修改如下:

//原设计--修改后
$arry = db_find_one('huux_os_link', array('str'=>''));//在没有字段和数据的时候都返回false
if($arry!==false){
   $tablepre = $db->tablepre;
   $sql = "ALTER TABLE {$tablepre}huux_os_link ADD COLUMN str mediumtext NOT NULL ";
   $r = db_exec($sql);
   if($r === FALSE) {
      echo $errstr;
   } else {
   message(0, jump('升级成功,新增字段备注str', url("plugin-setting-huux_os_link"), 1));
   }
}

祥子的想法是既然这个返回可能为空或者可能为false,那么就让他在绝对不等于flase的时候执行。

经过测试,其实我们都错了。

因为:

$arry = db_find_one('huux_os_link', array('str'=>''));//在没有字段和数据的时候都返回false

而我想要的只是在没有字段的时候执行,和有没有数据没有关系啊!显然上面都不可行。


于是回归原点,深入研究后得到答案。

$tablepre = $db->tablepre;
$arr = db_sql_find("DESC {$tablepre}huux_os_link");
foreach($arr as $row) {$col_field[]=$row['Field'];}
if(!in_array('str', $col_field)){
    $sql = "ALTER TABLE {$tablepre}huux_os_link ADD COLUMN str mediumtext NOT NULL";
    $r = db_exec($sql);
    if($r === FALSE) {
	echo $errstr;
    } else {
	message(0, jump('升级成功,新增字段备注str', url("plugin-setting-huux_os_link"), 1));
     }
}

思想就是:查询这个表里面的所有字段,如果新的字段str不在字段数组内那就是不存在这个字段,那就向下执行创建操作。



写在最后:

其实原程序设计在使用上也没什么问题,只是思考没有全面,发现问题的时候看你自己是什么心态,得过且过还是要跟自己过不去?其实很多时候客户也根本不会发现其中的问题,因为他们也看不见,看见了也看不懂。如果想成为一名优秀的程序员我觉得必须要有“跟自己过不去”的精神,发现问题不吃不喝不睡也要把这件事弄明白,这就是探索精神。



上面的程序虽然是对的,但可能也不是最好的,欢迎大牛指点。


最新回复 (3)
沉默的眼睛 12天前
引用 1


参观者 12天前
引用 2
真的牛批
Alpha 12天前
引用 3
返回