IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

Ordre de traitement des fonctions [CakePHP]


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut Ordre de traitement des fonctions
    Bonjour,

    J'ai un comportement étrange dans l'exécution de mon programme.
    Le framework ou php, je ne sais pas trop, exécute les lectures et écritures dans un ordre incorrect.

    Pour expliquer, rien de mieux que l'exemple, (code simplifié à l’extrême, excusez les éventuelles erreurs de syntaxe) :

    Code situation avec problème : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        public function ajouterarticlepanier() {
                    $ligneEcrire = $this->Article->query('INSERT INTO panier (article) VALUES ('toto');
                    return $this->GetPanier());
        }
        public function GetPanier() {
            $total = $this->Article->query('SELECT COUNT(*) AS nb FROM panier');
            $nb = 0;
            if ($total) then {
                    $nb = total['nb'];
            }
            return $nb;
        }
    Code situation fonctionnelle : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        public function ajouterarticlepanier() {
                    $ligneEcrire = $this->Article->query('INSERT INTO panier (article) VALUES ('toto');
                    $total = $this->Article->query('SELECT COUNT(*) AS nb FROM panier');
                    $nb = 0;
                    if ($total) then {
                            $nb = total['nb'];
                    }
                    return $nb;
        }

    Dans le premier cas, la fonction ajouterarticlepanier me renvoie la valeur du "tour" précédent.
    C'est à dire
    • Au premier appel : 0 article
    • Au second appel : 1 article
    • au troisième appel : 2 articles


    Dans le second cas, la fonction ajouterarticlepanier me renvoie la bonne valeur.
    C'est à dire
    • Au premier appel : 1 article
    • Au second appel : 2 articles
    • au troisième appel : 3 articles


    Comment expliquez-vous cette différence, et surtout, comment forcer cake ou php a exécuter les requêtes dans l'ordre.

    Pistes déjà tentées
    • Timer de trois secondes entre l'insert et le l'appel de fonction : ne marche pas
    • $datasource->begin() et $datasource->commit() entourant la requête d'insertion : ne marche pas
    • BEGIN; et COMMIT; dans le code SQL appelé : ne marche pas.

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Je pense que ton erreur vient du cache, il suffit de lire la doc :

    query() ne respecte pas $Model->cacheQueries car cette fonctionnalité est par nature déconnectée de tout ce qui concerne l’appel du model. Pour éviter les appels au cache de requêtes, fournissez un second argument false, par exemple : query($query, $cachequeries = false).
    D'autre part, tu as une mauvaise manière d'utiliser le framework, et tu met à mal le modèle MVC, je ne sais pas si tu es dans dans un contrôleur ou un modèle étant donné que tu retournes une valeur (alors qu'un contrôleur doit retourner une vue) mais que pourtant tu ne fais pas appel directement à la méthode "query". En supposant que tu soit bien dans un contrôleur (celui de panier, c'est plus logique que celui d'article), trois lignes suffisent pour écrire l'ensemble de ton code (et en plus ton problème ne se pose pas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function ajouter_article_panier() {
            $this->Panier->create();
            $this->Panier->save(array(
                'nom' => 'toto'
            ));
             $this->set('nbArticlePanier', $this->Panier->find('count'));
        }
    L'utilisation de query doit vraiment être réservée aux requêtes très particulières et/ou très complexse, là où les méthodes proposées par Cake ne suffisent plus (mais c'est très rare d'en arriver là).
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    Merci Spartacusply, le paramètre , $cachequeries = false règle bien mon soucis.
    J'avais beau chercher dans la doc, je n'avais pas trouvé.

    Pour répondre à tes interrogations :
    • La requête qui me résume le panier est effectivement plus complexe que dans l'exemple (mais peut-être faisable par les framework).
    • Je suis bien dans un controler.
    • La fonction doit être appelable par Ajax, et par un appel REST fait dans un téléphone androïd ou iOS. L'encodage de la valeur renvoyée est traitée correctement ensuite.

    Et c'est vrai que je préfère faire une requête, avec un bon SQL que je maîtrise, plutôt que de risquer de me tromper en utilisant les fonctions du framework.

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ordre d'exécution des fonctions
    Par tom06440 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/10/2010, 15h16
  2. Réponses: 8
    Dernier message: 27/07/2010, 19h04
  3. Ordre de traitement des opérateurs sur un select
    Par tchoimars dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/05/2007, 18h42
  4. [D7]Ordre de traitement des commandes
    Par PBSDev dans le forum Langage
    Réponses: 1
    Dernier message: 06/02/2006, 15h05
  5. [XSL] ordre de traitement des apply-templates
    Par Invité dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 24/01/2006, 11h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo