我在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%'''
是否有可能实现这样的事情而不使完整的查询有条件? (因为我想像这样多次使用它,这会导致我想避免的数千行长命令集)提前谢谢你!
答案 0 :(得分:0)
首先,是的,您不应该直接访问$_GET
数组,而是使用Yii::$app->request->get('some_param')
。其次,我认为参数化查询是针对需要转义的单个值而发明的,而不是用于条件修改SQL语句,因此我无法丢弃强制引号。
关于动态更改查询的整个想法,我会考虑编写一个简单的函数,根据传递的请求参数构造并返回一个SqlDataProvider实例。这样,我认为,您将保留一个非常需要的模块化并避免任何肮脏的黑客攻击。