动态参数JSON到PHP中的WHERE
我有一个JSON响应请求,希望生成一个变量$Where,这是JSON模式:动态参数JSON到PHP中的WHERE,php,sql,arrays,json,object,Php,Sql,Arrays,Json,Object,我有一个JSON响应请求,希望生成一个变量$Where,这是JSON模式: "filter": {"filters":[ {"logic":"and","filters":[ {"field":"NAMA","operator":"eq","value":"Rahmat"}, {"field":"NAMA","operator":"eq","value":"Rosadi"} ]},{"logic":"or","filters":[
"filter":
{"filters":[
{"logic":"and","filters":[
{"field":"NAMA","operator":"eq","value":"Rahmat"},
{"field":"NAMA","operator":"eq","value":"Rosadi"}
]},{"logic":"or","filters":[
{"field":"NIPK","operator":"eq","value":"1919191919"},
{"field":"NIPK","operator":"eq","value":"818181818181"}
]},{"logic":"and","filters":[
{"field":"JK","operator":"eq","value":"P"},
{"field":"JK","operator":"eq","value":"L"}
]}
],
"logic":"and"}
有谁能告诉我如何使这一模式成为单列PHP变量,如下所示:
$Where = "(NAMA = 'Rahmat' or NAMA = 'Rosadi') and (NIPK = '1919191919' or NIPK != '818181818181') and (JK='P' AND JK='L')"
对不起,我的英语不好。您可以将
过滤器
列表枚举到PHP数组中,将每个过滤器构建为SQL或值列表,然后使用内爆('OR',…)
将它们连接起来;并进一步内爆'and'子句列表中的数组
但是,这种方法失去了JSON设置所允许的灵活性;它可以扩展为或子句或单个子句的和-列表,也可以使用语法中的合并同一字段的或子句,但仅此而已
您可以使用从RPN表示法转换为代数的算法来寻找更强大(尽管更复杂)的方法
简单的版本是
$ops = array(
'eq' => '=',
'ne' => '!=',
'gt' => '>',
'lt' => '<',
'ge' => '>=',
'le' => '<=',
// CHECK THIS OUT, FIX & COMPLETE
);
$arr_Filters = array();
foreach($filters as $filter)
{
/* $filter is a set of subfilters:
{"logic":"and","filters":[
{"field":"NAMA","operator":"eq","value":"Rahmat"},
{"field":"NAMA","operator":"eq","value":"Rosadi"}
]},
which we see as:
*/
$logic = $filter['logic'];
$arr_Filter = array();
foreach($filter['filters'] as $fov)
{
$op_f = $fov['operator'];
$op = $ops[$op_f];
$value = /* FUNCTION TO SQL ESCAPE A VALUE */ $fov['value'];
$value = is_numeric($value) ? $value : "'".$value."'";
$arr_Filter[] = "$fov[field] $op $value";
}
$arr_Filters[] = '('.implode(' ' . $filter['logic'] . ' ', $arr_Filter).')';
}
$sql_filter = 'WHERE ' . implode(' AND ', $arr_Filters);
在foreach($filter['filters']as$fov)为foreach()提供的参数无效。
首先,这是无效的JSON。您可以使用验证JSON,然后尝试如果无法使其工作,请通过编辑将您尝试运行的代码添加到此问题。当我们看到你自己也付出了汗水时,帮助别人就容易多了,也令人愉快多了。
// ($ops omitted, same as above)
$arr_Filters = array();
foreach($filters->filter->filters as $filter)
{
/* $filter is a set of subfilters:
{"logic":"and","filters":[
{"field":"NAMA","operator":"eq","value":"Rahmat"},
{"field":"NAMA","operator":"eq","value":"Rosadi"}
]},
which we see as:
*/
$logic = $filter->logic;
$arr_Filter = array();
foreach($filter->filters as $fov)
{
$op_f = $fov->operator;
$op = $ops[$op_f];
$value = /* FUNCTION TO SQL ESCAPE A VALUE */ $fov->value;
$value = is_numeric($value) ? $value : "'".$value."'";
$arr_Filter[] = "{$fov->field} $op $value";
}
$arr_Filters[] = '('.implode(' ' . $filter->logic . ' ', $arr_Filter).')';
}
$sql_filter = 'WHERE ' . implode(' ' . $filters->filter->logic . ' ', $arr_Filters);