1

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

执行方法是否可能对参数做一些事情?

4

1 回答 1

2

您可以使用从每个数组元素array_map()创建表达式,然后将结果用作胶水:FIND_IN_SET()implode()' OR '

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);
于 2013-01-01T13:44:52.960 回答