先报个歉,题目有点大了,好像标题党的嫌疑,只是为了把大家叫进来讨论一下数据的insert与update流程非常相似,接收数据,检验数据,操作数据库,但是很多时候这两个及其统一的过程却没法统一,非得两个文件两个流程来走,弄得心里一直为这个地方纠结着。经过多年的间隔进化,前两天做的一个地方感觉在数据检验这个地方统一的不错了,于是发出来,和大家讨论讨论,顺便问问招聘的行情。废话不多说,直接上代码:拿一篇文章举例,比如数据表中有以下几个字段title,content,dateline_modify,dateline_add
<?php class base { private $error=array(); public function set_error($msg) { $error[]=$msg; return false; } public function error() { return end($error); } } //对不起,我不喜欢大写字母,包括类名,请不要在这方面讨论 class blog extends base { public function add($data) { $tmp=$this->check($data,'add'); if($tmp===false) { return false; //return $this->set_error( $this->error() );效果一样的 } //insert数据库 } public function mod($data) { $tmp=$this->check($data,'mod'); if($tmp===false) { return false; //return $this->set_error( $this->error() );效果一样的 } //update数据库 } /*检验数据并把数据修正成可以插入数据库的*/ public function check($data,$type) { $needed_add=array( 'title','content' );//添加时候必须有的数据 $field_all=array( 'title','content','dateline_modify','dateline_add' ); if($type=='add') { foreach($needed_add as $value) { if( !isset($data[$value]) ) { return $this->set_error($value."不能为空"); } } } $tmp=array(); foreach($data as $key=>$value) { if( in_array($key,$field_all) ) { $re=$this->check_one_by_one($key,$data,$type); if($re===false) { return $this->error(); } $tmp[$key]=$re; } } return $tmp; } public function check_one_by_one($key,$data,$type) { $value=$data[$key];//为什么不直接传value?因为很多数据是根据其他列计算出来的。 switch($key) { case 'title': //用u模式符可以直接操作utf8字符,省的自己去写utf8的strlen,substr类的函数了 if( !preg_replace('!.{1,20}!us',$data[$key]) ) { return $this->set_error("标题超长"); } return htmlspecialchars($value,ENT_QUOTES); //break?我也想过,不过怎么看都像画蛇添足,语法控们可以自己添加 case 'content': //最长为200个文字,u模式截取 $value=preg_replace("!^(.{0,200}).*$us!","//1",$value); //对$value的安全处理, return addslashes($value); case 'dateline_add': return ($type=='add'?time():$value); case 'dateline_mod': return ($type=='mod'?time():$value); default: return $this->set_error('错误哦'); } } } $data=$_POST; $blog=new blog(); $re=$blog->add($data); //$re=$blog->update($data); ?>
发在ppc后管理员回复说我说的不太明白,我感觉我也把简单问题说复杂了。
我的意思很简单,就是尽可能的把添加和修改两个功能统一成一个过程