-1

ランダムな数のパラメータをクエリに渡すにはどうすればよいですか?以下のコードブロックは、何が試みられたかを示しています。すべての失敗は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;
4

2 に答える 2

1

自分でクエリを生成してみてください。

$values = array(1,2,3);
// Generate the query
$params = substr(str_repeat("?,", sizeof($values)), 0, -1);

$sql = "SELECT query FROM nc_reports WHERE id IN ($params)";

$sth = $dbh->prepare($sql);

for ($i = 0; $i < sizeof($values); $i++)
{
    $sth->bindValue($i+1, $values[$i], PDO::PARAM_INT);
}
$sth->execute();
// Iterate over the results
while (($result = $sth->fetch()) !== FALSE) {
    echo var_dump($result);
}
$dbh = null;
于 2013-03-27T10:25:38.683 に答える
-2

@FoolishSeth:答えを教えてくれてありがとう。コードのフォーマットが原因で、最初は何が議論されているのか理解できませんでした。私はそれを機能させることができましたが、ANY(結果なし)またはIN(最初の結果のみ)を使用しませんでした。

実行とフェッチはループに移動され、$ values配列の各項目が個別に照会され、$results配列に追加されます。

$values = array(1,2,3);

$sql = "SELECT column FROM table WHERE id = ?";

$sth = $dbh->prepare($sql);

$result = array();

foreach($values as $key => $val)
{
    $sth->bindValue(1, $val, PDO::PARAM_INT);
    $sth->execute();
    $result[$key] = $sth->fetch(PDO::FETCH_NUM);
}

echo var_dump($result);

上記は、必要に応じて3つの行を返しました。大きな$values[]に対してこれをテストする機会はありませんでしたが、意図された少量のレコードでは、これは機能するはずです。

于 2013-03-27T05:40:57.780 に答える