ランダムな数のパラメータをクエリに渡すにはどうすればよいですか?以下のコードブロックは、何が試みられたかを示しています。すべての失敗はbool(false)を表示しました。テストでは、IDを表すために3つの整数が使用されます。
アイテム1からのクエリは、pgAdminIIIで手動で実行され、成功しました。項目2と4のクエリがエコーされ、比較されました。それらは意図したとおりに近く見えますが、パラメーターは拘束力がありません。
SELECT column FROM table WHERE id = ANY('{1,2,3}'::int[]);
SELECT column FROM table WHERE id = ANY('{?,?,?}'::int[])
1)これは機能します。任意の句が1-Nの数値になることが望まれます。
$sql = "SELECT column FROM table WHERE id = ANY('{1,2,3}'::int[])";
$sth = $dbh->prepare($sql);
$sth->execute();
$result = $sth->fetch(PDO::FETCH_NUM);
echo var_dump($result);
$dbh = null;
2)これは失敗します:
$values = array(1,2,3);
$placeHolders = implode(',', array_fill(0, count($values), '?'));
$sql = sprintf("SELECT column FROM table WHERE id = ANY('{%s}'::int[])", $placeHolders);
$sth = $dbh->prepare($sql);
$sth->execute($values);
$result = $sth->fetch();
echo var_dump($result);
$dbh = null;
3)これは失敗します:
$values = array(':qwer' => 1, ':asdf' => 2, ':zxcv' => 3);
$sql = "SELECT colum FROM table WHERE id = ANY(\'{ :qwer , :asdf , :zxcv }\'::int[])"; //Below error caused if single quote not escaped.
$sth = $dbh->prepare($sql);
$sth->execute($values); // Invalid parameter number: :qwer if single quotes not escaped.
$result = $sth->fetch();
echo var_dump($result);
$dbh = null;
4)これは失敗します(パラメーターを明示的にバインドします):
$values = array(1,2,3);
$placeHolders = implode(',', array_fill(0, count($values), '?'));
$sql = sprintf("SELECT query FROM nc_reports WHERE id = ANY('{%s}'::int[])", $placeHolders);
$sth = $dbh->prepare($sql);
$i = 1;
foreach($values as $val)
{
//$sth->bindParam($i, $val, PDO::PARAM_INT);
$sth->bindValue($i, $val, PDO::PARAM_INT);
$i++;
}
$sth->execute();
$result = $sth->fetch();
echo var_dump($result);
$dbh = null;