swoft-cloud / swoft

🚀 PHP Microservice Full Coroutine Framework
https://swoft.org
Apache License 2.0
5.59k stars 786 forks source link

关于swoft/db里面whereIn的优化建议 #668

Closed ryanho2009 closed 5 years ago

ryanho2009 commented 5 years ago

swoft/db v1.1.26 Details

这里的whereIn后面如果传入一个空数组,会直接不带where条件,这个操作太危险,是否考虑像Thinkphp一样做成 in (''),或者直接抛出异常,现在这样如果做个update,whereIn传入了一个空数组那问题就大了

/**
     * where in 语句
     *
     * @param string $column
     * @param array  $values
     * @param string $connector
     *
     * @return QueryBuilder
     */
    public function whereIn(string $column, array $values, string $connector = self::LOGICAL_AND): self
    {
        if (!empty($values)) {
            $this->criteria($this->where, $column, $values, self::IN, $connector);
        }
        return $this;
    }
stelin commented 5 years ago

@ryanho2009 也有实际场景需要所有操作的,底层框架不好去验证谁对谁错

ryanho2009 commented 5 years ago

@ryanho2009 也有实际场景需要所有操作的,底层框架不好去验证谁对谁错

如果思路是不去验证对错,传入空数组也应该生成 where xx in () 这样的SQL语句吧,最终数据库抛出异常。直接去掉in这个条件也算去做了验证,直接会得到与预期截然不同的结果。所以我个人觉得这种情况应该要么直接抛异常 要么就让他符合预期匹配不到数据。

sakuraovq commented 5 years ago

@ryanho2009 2.0 不会有这个问题的 1.0 改不动了

sakuraovq commented 5 years ago
  $res =  User::whereIn('id',[])->update(['age'=>1]);
 sql = update `user` set `age` = 1 where 0 = 1
ryanho2009 commented 5 years ago

@ryanho2009 2.0 不会有这个问题的 1.0 改不动了

好的,了解了