$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字段,那创建数据时会先将该字段设为空,然后再进行自动验证。是不是更妥当一些?
最佳答案