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 を使用すると、配列に要素が 1 つしかない場合にクエリが機能しますが、配列に複数の要素が含まれている場合は結果が返されません。

実行メソッドがパラメーターに対して何かをしている可能性はありますか?

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 に答える