Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 29-10-2009 16:06:35

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Incrémentation d'une valeur puis save() : ajoute +2 au lieu de +1

Bonjour,

C'est la 3eme fois que je rencontre ce problème.
Je tente d'incrémenter un champs de +1.

Code:

$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é ? big_smile

Merci pour votre aide.

Hors ligne

 

#2 29-10-2009 16:53:27

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Incrémentation d'une valeur puis save() : ajoute +2 au lieu de +1

essaye en 2 lignes pour voir si tu as tjrs le problème ?

Code:

$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 :

Code:

$db->query("update topic set hits=hits+1 where ce_qui_va_bien");

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#3 30-10-2009 15:15:46

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Incrémentation d'une valeur puis save() : ajoute +2 au lieu de +1

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.

Code:

[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 :

Code:

$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 :

Code:

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

Code:

$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 smile

Dernière modification par supertino7 (30-10-2009 15:25:04)

Hors ligne

 

#4 30-10-2009 16:01:05

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Incrémentation d'une valeur puis save() : ajoute +2 au lieu de +1

La différence entre nos 2 méthodes est celle là :
toi tu fais

Code:

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...)

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 smile ).
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


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#5 30-10-2009 16:45:39

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Incrémentation d'une valeur puis save() : ajoute +2 au lieu de +1

philippe a écrit:

La différence entre nos 2 méthodes est celle là :
toi tu fais

Code:

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 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 ?


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 smile ).
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

Code:

public function lireAction()
{
   $model = new Model_Topic();
   $topic = $model->getTopic($id_sujet)->toArray();
   ...
}

Models/Topic.php

Code:

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

Code:

class Model_DbTable_Topic extends Zend_Db_Table_Abstract
{
   protected $_name = 'topic';
}

Voila, il n'y a rien de plus élémentaire...

Hors ligne

 

#6 30-10-2009 17:16:20

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Incrémentation d'une valeur puis save() : ajoute +2 au lieu de +1

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 smile
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


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages