我正在使用PDO来构建我的查询,这些查询依赖于FIND_IN_SET来选择某些行。集合的元素通过POST传递给服务器,查询构造如下:
SELECT * FROM table WHERE
(FIND_IN_SET('param1', column) > 0 OR FIND_IN_SET('param2', column) > 0)
从基本的角度来看,这是如何构建查询的。由于要在集合中查找的参数数量是动态的,因此查询的FIND_IN_SET部分是动态生成的:
$q = implode("', column)>0 OR FIND_IN_SET('", $array);
然后应用于查询,如下所示:
SELECT * FROM table WHERE
AND (FIND_IN_SET(:q, e.event_type)>0);
最终执行的查询为:
$countResult->execute(array(':q' => $q);
请注意,$ q可能采用以下形式:
"param1', column)>0 OR FIND_IN_SET('param2', column)>0 OR FIND_IN_SET('param3"
如果我不使用PDO,则查询会正确执行,但在使用PDO时,如果数组中只有一个元素,则查询有效,但当数组包含多个元素时,查询不会返回任何结果。
执行方法是否可能对参数执行某些操作?
答案 0 :(得分:2)
您可以使用array_map()
从每个数组元素创建FIND_IN_SET()
表达式,然后使用' OR '
implode()
结果作为粘合剂:
function fis($c) {
return function($k) {return "FIND_IN_SET(:$k, $c)";}
}
$arr = array(
'p1' => 'param1',
'p2' => 'param2'
);
$qry = $dbh->prepare('
SELECT *
FROM table
WHERE ('.implode(' OR ', array_map(fis('column'), array_keys($arr))).')
');
$qry->execute($arr);