Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 1427 → Rev 1428

/trunk/services/modules/0.1/images/VotesImage.php
79,6 → 79,7
if ($resultat == false) {
throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
} else {
self::updateStats($this->bdd, $ressources[0],$parametres['protocole']);
RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_CREATION_OK);
}
}
102,10 → 103,33
if ($resultat == false) {
throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
} else {
self::updateStats($this->bdd, $ressources[0],$parametres['protocole']);
RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_OK);
}
}
static function updateStats($db, $id_image, $id_proto) {
$id_image = intval($id_image);
$id_proto = intval($id_proto);
if(!$id_image || !$id_proto) throw new Exception("Ne peut mettre à jour les statistiques de vote",
RestServeur::HTTP_CODE_ERREUR);
/* REPLACE ... SELECT: réinitalise les champs non-défini (MySQL 5.1)
REPLACE ... SET a=b, c=d: idem ou plusieurs requête
Du coup il faut récupérer les données actuelles mais REPLACE ne le permet pas
(http://dev.mysql.com/doc/refman/5.5/en/replace.html :
You cannot refer to values from the current row and use them in the new row.)
D'où INSERT ... ON DUPLICATE KEY UPDATE. Notons que VALUES() récupère la valeur
*associée* au champ passé en paramètre, c'est à dire VALUES(moyenne) == divo.moyenne */
$db->requeter(sprintf('INSERT INTO del_image_stat (ce_image, ce_protocole, moyenne, nb_votes)'.
' SELECT ce_image, ce_protocole, AVG(valeur) AS moyenne, COUNT(valeur) AS nb_votes'.
' FROM del_image_vote divo'.
' WHERE ce_image = %d AND ce_protocole = %d GROUP BY ce_image, ce_protocole'.
' ON DUPLICATE KEY UPDATE moyenne = VALUES(moyenne), nb_votes = VALUES(nb_votes)',
$id_image, $id_proto));
 
}
 
/*-------------------------------------------------------------------------------
CONFIGURATION DU SERVICE
--------------------------------------------------------------------------------*/