使用PDO和FIND_IN_SET进行动态查询

时间:2013-01-01 13:23:43

标签: php mysql select

我正在使用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时,如果数组中只有一个元素,则查询有效,但当数组包含多个元素时,查询不会返回任何结果。

执行方法是否可能对参数执行某些操作?

1 个答案:

答案 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);