1

我在 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%''' 是否可以在不使完整查询有条件的情况下实现这样的事情?(因为我想像这样多次使用它,这会导致数千行长的命令集我想避免)提前谢谢你!

4

1 回答 1

0

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

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

于 2017-12-11T19:55:45.300 回答