7

たとえば、次のコードがあります。

$dbStatement=$this->dbObject->prepare("SELECT AVG(quality) as quality,
                                              AVG(adequacy) as adequacy,
                                              AVG(friendliness) as friendliness,
                                              SUM(overall) as overall,
                                              SUM(completed) as completed,
                                              type
                                       FROM   (SELECT AVG(quality) as quality,
                                                      AVG(adequacy) as adequacy,
                                                      AVG(friendliness) as friendliness,
                                                      COUNT(id) as overall,
                                                      SUM(is_completed) as completed,
                                                      category_id, type
                                               FROM valuation a
                                               WHERE status       =1
                                                 AND type         =:01
                                                 AND ((type='employer' AND owner_id=:02)
                                                      OR (type='employee' AND winner_id=:02))
                                               GROUP BY category_id
                                               HAVING COUNT(id)<=:03) b
                                       GROUP BY type");
$dbStatement->bindParam(':01',$Type);
$dbStatement->bindParam(':02',$UserID);
$dbStatement->bindParam(':03',$Most);
$dbStatement->execute();

このコードは、に設定しexecute()たときに例外をスローします。次のメッセージが例外オブジェクトに含まれています。PDO::ATTR_EMULATE_PREPARESFALSE

SQLSTATE[HY093]: パラメーター番号が無効です

該当するマニュアルを読んでも、これまでのところ問題を認識できませんでした。

4

1 に答える 1

9

エラーは、プレースホルダーの繰り返しが原因です。同じパラメータをプレースホルダーにバインドしている場合でも、各プレースホルダーは一意である必要があります。

AND ((type='employer' AND owner_id=:02)
OR (type='employee' AND winner_id=:02))

する必要があります:

AND ((type='employer' AND owner_id=:02)
OR (type='employee' AND winner_id=:another02))

そしてそれにバインドします:

$dbStatement->bindParam(':01',$Type);
$dbStatement->bindParam(':02',$UserID);
$dbStatement->bindParam(':another02',$UserID);
$dbStatement->bindParam(':03',$Most);
于 2013-01-12T14:44:02.533 に答える