代码之家  ›  专栏  ›  技术社区  ›  user2511599

Yii2 SqlDataProvider有条件地设置参数

  •  1
  • user2511599  · 技术社区  · 7 年前

    我在SqlDataProvider中有一个巨大的SQL查询。我使用的是这样的简单过滤(这样的做法不好吗?)

    !empty($_GET['Search']['A']) ? $A = $_GET['Search']['A'] : $A = "%%";
    
    $dataProvider = new SqlDataProvider([
        'sql' => '
            SELECT * FROM ...
            WHERE
            A LIKE :A',
    
        'params' => [
            ':A' => $A,
        ],
    

    它正在工作,但我想使用高级版本:

    !empty($_GET['Search']['B']) ? $B = "AND B LIKE \'%" . $_GET['Search']['B'] . "%\'" : $B = "";
    
    $dataProvider = new SqlDataProvider([
        'sql' => '
            SELECT * FROM ...
            WHERE
            A LIKE :A
            :B',
    
        'params' => [
            ':A' => $A,
            ':B' => $B,
        ],
    

    但它不起作用,因为最终SQL查询在开始和结束时总是有一个单引号,在值周围有一个双引号: 'AND B LIKE ''%something%''' 有没有可能在不使完整查询有条件的情况下实现这样的功能?(因为我想像这样多次使用它,这将导致数千行长的命令集,这是我想要避免的)提前谢谢!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Feisty Otter    7 年前

    首先,是的,你不应该直接访问 $_GET 数组,而使用 Yii::$app->request->get('some_param') . 其次,我认为参数化查询是为需要转义的单个值而发明的,而不是为有条件地修改SQL语句而发明的,所以我不知道如何丢弃强制引号。

    关于动态更改查询的整个想法,我将考虑编写一个简单的函数,该函数根据传递的请求参数构造并返回SqlDataProvider实例。我认为,通过这种方式,您将保留非常需要的模块化,并避免任何肮脏的黑客攻击。

    推荐文章