2013-01-12 16 views
6

私はforexample次のコードを持っている:FALSEとなって「無効なパラメータ番号」エラーにPDO :: ATTR_EMULATE_PREPARESを変更

$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(); 

このコードは、私がFALSEPDO::ATTR_EMULATE_PREPARESを設定​​から例外がスローされます。次のメッセージは、例外オブジェクトに含まれている:

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

は、対応するマニュアルを読むしかし、これまでの問題を実現することができませんでした。

答えて

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); 
+1

ヘッド...ありがとうございました。 –

+0

一言...時にはphpが信念を超えてばかげている...とにかくあなたの答えをありがとう。あなたは正しいです! – StefanNch

関連する問題