Tp5.1 validate bug

浏览:152 发布日期:2019/05/10 分类:ThinkPHP5专区 关键字: validater unique bug
验证rule是unique的时候,如果待验证的数据中有主键,生成的表达式应该是 <>
Validate的unique函数在生成map去数据库查询的时候,因为采用了老版本的表达式的where格式 ,如 ['name'=>'123', 'id'=>['neq',1]]的情况下,在调用model(Query)的时候会报表达式解析错误。
我根据情况改了一下,试了一下问题已经修复,希望能帮到大家    public function unique($value, $rule, $data, $field)
    {
        if (is_string($rule)) {
            $rule = explode(',', $rule);
        }

        if (false !== strpos($rule[0], '\\')) {
            // 指定模型类
            $db = new $rule[0];
        } else {
            try {
                $db = Container::get('app')->model($rule[0]);
            } catch (ClassNotFoundException $e) {
                $db = Db::name($rule[0]);
            }
        }

        $key = isset($rule[1]) ? $rule[1] : $field;

        if (strpos($key, '^')) {
            // 支持多个字段验证
            $fields = explode('^', $key);
            foreach ($fields as $key) {
//                $map[$key] = $data[$key];             # bug源码
                $map[] = [$key, "=", $data[$key]];      # 修改后的代码
            }
        } elseif (strpos($key, '=')) {
//            parse_str($key, $map);                    # bug源码
            $tmp = [];                                  # 修改后的代码 start
            parse_str($key, $tmp);
            foreach ($tmp as $key2=>$value2)
            {
                $map[] =[$key2, "=", $value2];
            }                                           # 修改后的代码 end
        } else {
//            $map[$key] = $data[$field];               # bug源码
            $map[] = [$key, "=", $data[$key]];          # 修改后的代码

        }

        $pk = strval(isset($rule[3]) ? $rule[3] : $db->getPk());

        if (isset($rule[2])) {
//            $map[$pk] = ['neq', $rule[2]];            # bug源码
            $map[] = [$pk, '<>', $rule[2]];             # 修改后的代码
        } elseif (isset($data[$pk])) {
//            $map[$pk] = ['neq', $data[$pk]];          # bug源码
            $map[] = [$pk, '<>', $data[$pk]];           # 修改后的代码
        }
        if ($db->where($map)->field($pk)->find()) {
            return false;
        }
        return true;
    }
最佳答案
评论( 相关
后面还有条评论,点击查看>>