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

PHP & Base de données Discussion :

Stocker un statement dans une class


Sujet :

PHP & Base de données

  1. #1
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut Stocker un statement dans une class
    Bonjour,

    J'ai dans une class une requete qui est assez régulièrement utilisée. Je souhaite donc la "préparer" de façon à la réutiliser au besoin.

    Dans la méthode qui utilise cette requete, je spécifie donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if($this->req_droit === false)
    			$this->req_droit = SPDO::getInstance()->prepare('select * from d_droit, d_grouper, d_pouvoir where upper(d_droit.nom_d_droit) like from user limit 1');
    La requete est donc censé être préparée à la 1er utilisation de la méthode, puis ne doit pas être repréparé les fois suivantes (SPDO est un sigleton de PDO)...

    $req_droit est bien sur définit comme variable privée de la class et initialisée à false.

    Pourtant, cette ligne me génère l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Exception thrown without a stack frame in Unknown on line 0
    Pour info, la requete en exemple ici n'est pas la vraie mais donne le même résultat. J'ai mis quelque chose de simple qui prouve que le problème ne vient pas de la requete en elle même, mais de la façon dont j'utilise mon statement dans la class...

    En vous remerciant par avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Salut,

    ok, pour ta préparation unique de la requete.

    Cependant,
    1 - C'est ou que sa plante ? Car là tu ne nous montres pas où sa plantes exactement, puisque la deuxième fois qu'il passe dans le if, il ne l'execute pas...
    2 - SPDO ne peut il pas, de lui même, maintenir le cache de préparation de tes requtes ? Avec par exemple une empreinte de la requete...
    3 - N'utiliserais tu pas un handler personnalisé pour la gestion des erreurs ?

    a plus

  3. #3
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    L'erreur se manifeste dès au niveau du execute() au moment du 1er passage dans la fonction (puisque commenté le if amène invariablement au même résultat).

    Pour le SPDO et le maintient du cache (qu'il est censé gérer un minimum tout seul), je ne sais pas si c'est aussi performant que de laisser mon statement alloué.

    Enfin, je n'utilise pas de handler pour le moment. Je me met tout juste a la poo sur php, et je n'ai pas encore essayé de l'implémenter.

    En attendant, merci d'avoir pris le temps de me répondre.

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 209
    Par défaut
    Bonjour,
    Les requêtes préparées m'ont souvent fait perdre patience...
    Lorsque une même requête est utilisée régulièrement je te conseille d'utiliser une procédure stockée.
    C'est plus facile à maintenir et très rapide car le serveur garde le code compilé.
    A+
    JL

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Citation Envoyé par comode Voir le message
    L'erreur se manifeste dès au niveau du execute() au moment du 1er passage dans la fonction (puisque commenté le if amène invariablement au même résultat).

    Pour le SPDO et le maintient du cache (qu'il est censé gérer un minimum tout seul), je ne sais pas si c'est aussi performant que de laisser mon statement alloué.

    Enfin, je n'utilise pas de handler pour le moment. Je me met tout juste a la poo sur php, et je n'ai pas encore essayé de l'implémenter.

    En attendant, merci d'avoir pris le temps de me répondre.
    Perso, mais je ne suis pas une référence, je ne maintiens pas mes requêtes préparées.
    J'estime que c'est à la couche PDO / driver sql de le faire.


    Après si quelqu'un peut infirmer ou confirmer que PDO fait ce job ce n'est pas plus mal.


    Maintenant par rapport à tes nouvelles infos, set req_droit à null dans le ctor et fais plutot un test sur
    if( $this->req_droit == NULL)
    Car PDO::prepare peut retourner false.


    d'ailleurs lorsque tu exécute avec PDOStatement::execute, tu dois prendre en compte ce cas. Comme pour fetchAll ect ect

    a plus

  6. #6
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    En fait, ce qui me surprend, c'est que tout indique que c'est le fait de stocker le statement en tant que propriété de class qui pose problème puisque le fait d'enlever le if ne change rien a l'affair...

    Dans tous les cas, j'ai résolu le problème en stockant le statement dans une variable simple et en renonçant à tester si la requete a déjà été préparé, même si j'aurais bien aimé comprendre qu'est-ce qui chiffonne Apache dans mon 1er exemple.

  7. #7
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 595
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 595
    Par défaut
    au moment d'utiliser "prepare" récupère les exceptions comme ça par exemple pour afficher les message d'erreur retourné par le serveur MySQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try {
        $this->req_droit = SPDO::getInstance()->prepare('select * from d_droit, d_grouper, d_pouvoir where upper(d_droit.nom_d_droit) like from user limit 1');        
    } catch (PDOException $e) {
        echo $e->getMessage();
    }

Discussions similaires

  1. AS3 stocker le nom d'une classe dans une chaine et l'instancier ?
    Par Lorenzo77 dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 15/03/2009, 22h43
  2. [C#2005] Stocker des variables dans une classe
    Par Herlece dans le forum Windows Forms
    Réponses: 7
    Dernier message: 13/10/2008, 10h30
  3. Thread dans une classe ?
    Par Sephi dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 07/03/2004, 18h16
  4. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42
  5. Comment stocker un ficher dans une table postgres
    Par josoft dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/06/2003, 16h41

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