thinkphp自动验证BUG问题
来源:互联网 发布:淘宝买手机没有发票 编辑:程序博客网 时间:2024/04/27 17:26
近日使用TP3.1版本的自动验证发现有BUG,主要表现为:自动验证update编辑更新的时候如果唯一字段没有变化也会报数据库重复错误提示
/*
最后第六个参数比较诡异
填1的时候,ADD验证SAVE都验证
填2的时候,ADD和SAVE都不进去验证
填3的时候,ADD验证SAVE都验证
create验证的时候第二个参数传递self::MODEL_UPDATE或者2时,
填1时,add验证save不验证,
填2时,add不验证save验证,
填3时,add验证save验证,
create验证的时候第二个参数传递self::MODEL_INSERT或者1时,
填1时,add验证save验证,
填2时,add不验证save不验证,
填3时,add验证save验证,
create验证的时候第二个参数传递self::MODEL_BOTH或者3时,
填1时,add不验证save不验证,
填2时,add不验证save不验证,
填3时,add验证save验证,
这些数据怎么来的可以参考核心代码Model.class.php中autoValidation方法的 if(empty($val[5]) || $val[5]== self::MODEL_BOTH || $val[5]== $type )这个判断,在918行左右。
$val[5]就是你传递进去的自动验证的第6个参数,$type就是create时传递进去的第二个参数如果不传他会自己判断判断方法可参考create方法的$type = $type?$type:(!empty($data[$this->getPk()])?self::MODEL_UPDATE:self::MODEL_INSERT);在749行左右。
*/
平时的写法却在只需要更新数据时自动验证的时候自动验证不验证的例子:
protected $_validate = array(
array('user_name', 'checkupdate', '该账号已关联嘉宾,一个账号只能关联一个嘉宾资料', 0,'callback',2),
);
//验证编辑
protected function checkupdate($data){
$id=trim($_POST['id']);
if($this->where("id!=".$id." and user_name='".trim($data)."'")->find()){
return false;
}else{
return true;
}
}
//编辑执行
public function update(){
$data['user_name']=trim($_POST['user_name']);
$data['pen_name']=trim($_POST['pen_name']);
$data['price']=trim($_POST['price']);
$data['guests_jj']=trim($_POST['guests_jj']);
$data['guests_info']=trim($_POST['guests_info']);
$data['status']=1;
$data['createtime']=time();
if( $this->create( $data ) ) {
return $this->where('id='.$_POST['id'])->save();
} else {
return $this->getError();
}
}
正确使用的例子,这样写后只会在更新的时候验证:
protected $_validate = array(
array('user_name', 'checkupdate', '该账号已关联嘉宾,一个账号只能关联一个嘉宾资料', 0,'callback',2),
);
//验证编辑
protected function checkupdate($data){
$id=trim($_POST['id']);
if($this->where("id!=".$id." and user_name='".trim($data)."'")->find()){
return false;
}else{
return true;
}
}
//编辑执行
public function update(){
$data['user_name']=trim($_POST['user_name']);
$data['pen_name']=trim($_POST['pen_name']);
$data['price']=trim($_POST['price']);
$data['guests_jj']=trim($_POST['guests_jj']);
$data['guests_info']=trim($_POST['guests_info']);
$data['status']=1;
$data['createtime']=time();
//此处紫色部分可用self :: MODEL_UPDATE或者2
if( $this->create( $data , self :: MODEL_UPDATE) ) {
return $this->where('id='.$_POST['id'])->save();
} else {
return $this->getError();
}
}
PS:造成这个BUG的原因是因为我们的数据$data中没有主键字段的存在,create是根据$data中的字段来判断是添加操作还是更新操作的,如果有主键字段他会认为是更新验证,没有主键字段就认为是添加验证。所以$data数组中有主键字段的就可以在create时不传第二个参数,上面自动验证第六个参数直接填2就可以达到所要的效果了
- thinkphp自动验证BUG问题
- thinkphp 自动验证
- thinkphp 验证 自动填充
- ThinkPHP 自动验证
- Thinkphp 自动验证
- thinkphp自动验证相关
- Thinkphp自动验证
- thinkphp自动验证
- ThinkPHP 自动验证
- ThinkPHP 自动验证
- thinkphp中的自动验证
- ThinkPHP中自动验证
- thinkPHP 自动验证
- thinkphp自动验证---$_validate
- Thinkphp 模型->自动验证
- thinkphp自动验证
- ThinkPHP自动验证
- 关于Thinkphp的自动验证create()函数的问题
- Linux环境下BufferedImage Graphics drawString写中文乱码的原因
- 浅析人脸检测之Haar分类器方法
- arcgis10中如何创建style文件?
- 干货:CentOS6.5_Nginx1.40_Php5.57_MySQL5.5.35编译安装全记录
- W5500评测第三弹:基于MEGA的智能家居无线转发监控主机
- thinkphp自动验证BUG问题
- QtCored4.dll 解决方法 提供这个文件所有qt版本
- 文件系统特性
- 远程桌面协议(RDP, Remote Desktop Protocol)
- acm--保留字符串中的整数
- ArcGIS使用字体文件制作符号库!
- Mingw+Eclipse使用mpfr
- C#的COM事件在C++和JAVA中触发和响应的实现
- 云计算类型和特点