希望改进create方法

浏览:979 发布日期:2014/03/21 分类:站务建议
在数据更新时,我希望指定更新某些字段,以修改密码为例吧,我当然可以很稳妥地这么干:$user=D('User');
$data['id']=$_SESSION['uid'];
$data['password']=$_POST['password'];
$data['repassword']=$_POST['repassword'];
if($user->create($data)){
      $user->save();
}else{
      $this->error($user->getError());
}
但是我想偷个懒,直接使用post的数据来创建数据对象:$user=D('User');
$_POST['id']=$_SESSION['uid'];
if($user->field('id,password,repassword')->create()){
      $user->save();
}else{
      $this->error($user->getError());
}
这种方法对于字段数量比较多的情况显然简化了很多
不过有个问题,这里的field方法的作用只是限定更新某些字段而不是指定更新某些字段,也就是说,在上面的例子里,如果post数据中不包含password字段(post的数据是不可信的),那自动验证的时候就不会对password字段进行验证(前提是我在验证规则里希望该字段存在就验证),这当然不是我想要的!
所以,能否把create方法里的这段代码 if(isset($fields)) {
            if(is_string($fields)) {
                $fields =   explode(',',$fields);
            }
            // 判断令牌验证字段
            if(C('TOKEN_ON'))   $fields[] = C('TOKEN_NAME');
            foreach ($data as $key=>$val){
                if(!in_array($key,$fields)) {
                    unset($data[$key]);
                }
            }
        }
修改成 if(isset($fields)) {
            if(is_string($fields)) {
                $fields =   explode(',',$fields);
            }
            // 判断令牌验证字段
            if(C('TOKEN_ON'))   $fields[] = C('TOKEN_NAME');
            $arr=array();
            foreach($fields as $key){
                  $arr[$key]=$data[$key];
            }
            $data=$arr;
        }
这样即使post来的数据没有password字段,那创建数据时会先将该字段设为空,然后再进行自动验证。
是不是更妥当一些?
最佳答案
评论( 相关
后面还有条评论,点击查看>>