php实现多字段unique验证,ThinkPHP数据自动验证中unique的缺陷

ThinkPHP可以为Model添加$_validate属性,使得在使用create方法创建数据对象时能自动对数据进行验证,详细看这里。

这其中有个unique的方法,即是验证指定栏的数据在表中是否唯一。向数据表里插入“唯一”字段时可以自动判断并且提示错误,但ThinkPHP这个功能有个缺陷,导致这个unique验证基本上只能在添加数据的时候使用,不能在编辑数据的时候用。

unique验证的源码在ThinkPHP/Lib/Think/Core/model.class.php第944行,对unique验证时就是查找整个数据表这一栏这个值是否存在,这样做在添加数据时没问题,但如果在编辑状态下就有问题了。例如编辑一个用户名和密码,现在不修改用户名只修改密码,因为用户名要进行唯一验证,此时这个用户名没有修改,数据表上是有这个用户名的(就是在编辑的这行数据),于是就提示已存在此数据,无法保存。

我想解决的办法可以是:在验证的时候判断是否传进了此表主键的值,例如判断是否传进了$_POST[“admin_id”],如果传进了,对搜索到的数据提取admin_id判断是否相等,相等则不存在unique错误,不相等才出现错误。在这么核心的地方调用$_POST似乎破坏结构,那可以改改$_validate传递的参数。还不熟悉ThinkPHP,就不动手改了。

目前在我的应用中是只在新增数据时检测unique,编辑时不检测,如果编辑时unique的栏有重复了,再在save()时判断是否插入成功和提示,暂时是这样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThinkPHP3.2 ,可以通过使用 `validate` 方法来对模型进行验证。如果需要对多个字段进行组合验证,可以通过在验证使用 `confirm` 规则来实现。具体步骤如下: 1. 创建一个验证器类,例如 `UserValidate`,并在其定义验证规则。例如,如果需要对用户名和密码进行组合验证,可以在验证添加以下规则: ```php protected $rule = [ 'username' => 'require', 'password' => 'require|confirm:confirm_password' ]; protected $message = [ 'username.require' => '用户名不能为空', 'password.require' => '密码不能为空', 'password.confirm' => '两次输入的密码不一致' ]; ``` 上面的规则,`confirm` 规则会自动校验当前字段和另一个字段的值是否相等,另一个字段名默认为当前字段名加上 `_confirm` 后缀,也可以通过传递参数来指定其他字段名。 2. 在模型使用该验证器进行验证。例如,在用户模型添加以下方法: ```php public function addUser($username, $password, $confirmPassword) { $data = [ 'username' => $username, 'password' => $password, 'confirm_password' => $confirmPassword ]; $validate = new UserValidate(); if (!$validate->check($data)) { return $validate->getError(); } // 验证通过,执行添加用户的操作 // ... } ``` 在上面的方法,首先将需要验证字段封装为一个数组,然后通过调用 `check` 方法来进行验证。如果验证不通过,则返回错误信息。 通过上面的步骤,就可以在 ThinkPHP3.2 实现字段组合验证了。希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值