Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
C'est la 3eme fois que je rencontre ce problème.
Je tente d'incrémenter un champs de +1.
$topic = $table->fetchRow($select); // On incrémente le nb de vues $topic->hits = $topic->hits + 1; $topic->save();
A chaque fois, cela me rajoute +2 vues.
Y a quelquechose que j'ai pas capté ?
Merci pour votre aide.
Hors ligne
essaye en 2 lignes pour voir si tu as tjrs le problème ?
$hits = $topic->hits + 1; $topic->hits = $hits;
J'ai tendance à penser que tu lances ton code 2 fois, mais on ne sait jamais, comme ton $topic->hits c'est une fonction __get ou __set derrière, il pourrait y avoir une boulette...
Sinon, repasser par php, puis un fetch et une sauvegarde à chaque fois que quelqu'un consulte un topic, ça risque de plomber un peu tes perfs. Je te conseillerais plutôt un update du genre :
$db->query("update topic set hits=hits+1 where ce_qui_va_bien");
A+, Philippe
Hors ligne
Essayé en 2 lignes.
Et toujours la même chose. +2 au lieu de +1.
J'arrive vraiment pas à comprendre. Ce qui me semble bizarre, c'est que ça me le fait dans d'autres classes et modules de l'application, dés que j'applique un +1 puis un save(), ça se produit 2 fois.
J'utilise la Debugbar, j'ai bien la requête suivante qui n'apparait qu'une fois.
[0.56 ms] UPDATE `forums_messages` SET `hits` = ? WHERE (`forums_messages`.`id` = 11263)
J'ai essayé de dumper un peu de la manière suivante :
$topic = $table->fetchRow($select); Zend_Debug::dump($topic->hits); // On incrémente le nb de vues $hits = $topic->hits + 1; $topic->hits = $hits; Zend_Debug::dump($topic->hits); //$topic->save();
J'obtiens bien :
string(1) "2" int(3)
Bon les types ne sont pas les mêmes mais on obtient bien le bon nombre.
Donc le probleme se situe au niveau du save() ?
Sinon par rapport à ton conseil
$topic = $table->fetchRow($select); // On incrémente le nb de vues $hits = $topic->hits + 1; $topic->hits = $hits; $topic->save(); return $topic;
Je n'arrive pas à voir la différence avec ta matière de procéder ? En gros, j'extrais la news en objet Row, je la mets à jour, puis je save(), puis je retourne l'objet Row au controleur pour affichage.
Je n'ai pas trouvé de moyen de faire select et update en une seule requête.
Sinon je suis preneur
Dernière modification par supertino7 (30-10-2009 15:25:04)
Hors ligne
La différence entre nos 2 méthodes est celle là :
toi tu fais
SELECT hits FROM forums_messages WHERE (`forums_messages`.`id` = 11263); -- puis UPDATE `forums_messages` SET `hits` = ? WHERE (`forums_messages`.`id` = 11263);
Moi je fais une seule requête :
UPDATE `forums_messages` SET hits = hits+1 WHERE (`forums_messages`.`id` = 11263);
(si si, ça marche ce hits=hits+1 en SQL, je t'assure...)
Sinon pour ton histoire du +2... Je ne sais pas comment est faite ton appli, mais ça ne peut pas venir du save (si un save enregistrait n'importe quoi, on s'en serait rendu compte ).
Perso je suis persuadé que ton code est lancé 2 fois (où bien tu as un autre compteur à incrémenter et tu t'es trompé de nom de table ou une blague comme ça...).
A+, Philippe
Hors ligne
philippe a écrit:
La différence entre nos 2 méthodes est celle là :
toi tu faisCode:
SELECT hits FROM forums_messages WHERE (`forums_messages`.`id` = 11263); -- puis UPDATE `forums_messages` SET `hits` = ? WHERE (`forums_messages`.`id` = 11263);Moi je fais une seule requête :
Code:
UPDATE `forums_messages` SET hits = hits+1 WHERE (`forums_messages`.`id` = 11263);(si si, ça marche ce hits=hits+1 en SQL, je t'assure...)
Je sais bien pour le hits+1
Mais à moins que je n'ai pas compris ce que tu veux me faire comprendre, j'ai besoin du SELECT pour pouvoir afficher le topic au final... non ?
philippe a écrit:
Sinon pour ton histoire du +2... Je ne sais pas comment est faite ton appli, mais ça ne peut pas venir du save (si un save enregistrait n'importe quoi, on s'en serait rendu compte
).
Perso je suis persuadé que ton code est lancé 2 fois (où bien tu as un autre compteur à incrémenter et tu t'es trompé de nom de table ou une blague comme ça...).
A+, Philippe
Alors là, bah je ne vois vraiment pas.
Je suis une structure standard :
Controllers/
TopicController.php
Models/
Topic.php
DbTable/
Topic.php (extends Zend_Db_Table_Abstract)
Views
TopicController.php
public function lireAction() { $model = new Model_Topic(); $topic = $model->getTopic($id_sujet)->toArray(); ... }
Models/Topic.php
public function getTopic($id) { $table = new Model_DbTable_Topic(); $select = $table->select(); $select->where('id = ?', $id); $topic = $table->fetchRow($select); // On incrémente le nb de vues $hits = $topic->hits + 1; $topic->hits = $hits; $topic->save(); // Retour de $topic return $topic; }
Models/DbTable/Topic.php
class Model_DbTable_Topic extends Zend_Db_Table_Abstract { protected $_name = 'topic'; }
Voila, il n'y a rien de plus élémentaire...
Hors ligne
Je sais bien pour le hits+1 big_smile
Mais à moins que je n'ai pas compris ce que tu veux me faire comprendre, j'ai besoin du SELECT pour pouvoir afficher le topic au final... non ?
Hum... effectivement, vu comme ça, je dis plus rien, t'as raison
je pensais que tu incrémentais une table dont tu n'avais forcément besoin des données (typiquement quand on utilise un cache ).
Pour ton +2, je doute que ça vienne du code que tu envoies, tous me paraît bon. A mon avis il faut chercher ailleurs, un autre endroit où tu appelles $model->getTopic, ou bien un copier-coller de ton getTopic où tu as oublié de changer un nom de table, un truc planqué dans un plugin, un helper...
tu n'appelles pas getTopic pour vérifier tes ACL ou autre blague de ce genre...
Là je ne peux pas trop t'aider plus je pense...
A+, Philippe
Hors ligne
Pages: 1