2013-01-12 8 views
6

Ho il seguente codice peresempio:Cambiato PDO :: ATTR_EMULATE_PREPARES false e ottenere l'errore "numero di parametro non valido"

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

Questo codice genera un'eccezione da execute() quando ho impostato PDO::ATTR_EMULATE_PREPARES-FALSE. Il seguente messaggio viene incluso nel oggetto eccezione:

SQLSTATE [HY093]: Parametro non valido numero

Impossibile realizzare il problema fino ad ora, anche se leggere i manuali corrispondenti.

risposta

9

L'errore è dovuto a ripetizione di un segnaposto. Ogni segnaposto deve essere unico, anche se si sta vincolando lo stesso parametro ad esso.

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

dovrebbe essere:

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

e quindi associare ad esso:

$dbStatement->bindParam(':01',$Type); 
$dbStatement->bindParam(':02',$UserID); 
$dbStatement->bindParam(':another02',$UserID); 
$dbStatement->bindParam(':03',$Most); 
+1

sbattere la testa in brickwall/risolto ... grazie. –

+0

Sigh ... a volte php è stupido oltre ogni immaginazione ... comunque grazie per la tua risposta. Hai ragione! – StefanNch