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 :

PDO::FETCH_CLASS : could not call class constructor [PDO]


Sujet :

PHP & Base de données

  1. #1
    Invité
    Invité(e)
    Par défaut PDO::FETCH_CLASS : could not call class constructor
    Salut,

    J'essaie de me familiariser avec PDO.
    Je voudraisutiliser FETCH_CLASS pour récupérer mes enregistrements sous forme d'objets.

    J'ai une classe Realisation qui possède les propriétés correspondantes à mes noms de champs de la table.

    MAIS, je veux que cette classe puisse être instanciée "à la main" sans passer par PDO et qui pour cela comporte un constructeur.

    Mon problème :
    Si ma classe possède un constructeur, PDO produit une erreur lors de la tentative d'instanciation, sinon, tout va bien, mon instanciation se fait et je peux utiliser l'objet.

    Voici l'erreur en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SQLSTATE[HY000]: General error: could not call class constructor
    #0 /Users/sbooob/Sites/proj/srcprod.com/class/RealisationHandler.php(0): PDOStatement->fetch()
    #1 /Users/sbooob/Sites/proj/srcprod.com/class/RealisationHandler.php(63): RealisationHandler->getFromDB(Object(PDO), 'SELECT * FROM a...')
    #2 {main}Error : request "SELECT * FROM anciens_Ancien;" failed.
    J'ai cherché plus d'infos sur cette erreur, impossible d'en savoir plus, le code d'erreur et celui d'une erreur générale...

    Comment utiliser ma classe réalisation comportant un constructeur avec PDO::FETCH_CLASS ?

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Salut,

    1 - Il faut que tes attributs soient publics pour que PDO renseigne correctement ta classe.

    2 - Pour le problème du constructeur, peut-être pourrait tu spécifier en argument unique un tableau de valeur initialisé à la valeur null, et gérer ce cas dans le constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Test
    {
        public function __construct($args=null) {
            if (!is_null($args)) {
                // appel direct =>traitement du tableau $args
            }
        }
    }
    Pour un traitement plus lourd mais plus propre, tu as cet excellent tuto : http://julien-pauli.developpez.com/t...objets-metiers
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour la rapidité de la réponse.

    Je viens d'essayer, mais toujours pas... Mon constructeur (pour les tests) n'a pas d'arguments, j'appelle donc PDOStatement::setFetchMode avec seulement 2 paramètres (le troisième étant un tableau contenant les paramètres). J'ai aussi essayé en lui passant un tableau de paramètres, avec ta solution, toujours rien.

    Pour ce qui est des propriétés, elles sont en private, mais j'ai un système de setters avec la méthode magique __set qui fait la même chose. En public, ça ne change rien.

    Une autre idée ?

    Encore merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    Après de nouveaux tests, pas mal de bizzareries :
    • C'est ma méthode magique __set, qui empêche la construction de l'objet (alors je ne vois pas du tout pourquoi le __set empêche le __construct mais bon...). Si je l'enlève tout vas bien.
    • Avec mes propriétés en private, sans le __set qui permet en temps normal de contourner le private, PDO assigne correctement mes propriétés.


    Donc nouveau problème : Comment utiliser PDO::FETCH_CLASS avec une classe possédant une méthode __set ?

  5. #5
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par sbooob Voir le message
    Avec mes propriétés en private, sans le __set qui permet en temps normal de contourner le private, PDO assigne correctement mes propriétés.
    étonnant

    Tu es sûr ? (var_dump de l'objet résultant)
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ben du coup plus tant...

    var_dump($rea) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    object(Realisation)#4 (26) {
      ["id":"Realisation":private]=>string(1) "1"
      ["nom":"Realisation":private]=>string(7) "Bianchi"
      ["prenom":"Realisation":private]=>string(7) "Tristan"
      ["surnom":"Realisation":private]=>string(5) "Elvis"
      ["sexe":"Realisation":private]=>string(1) "H"
    ...
    Mais echo '"', $this->nom, '"' :
    C'est normal tout ça ? Ca semble affecté d'après la sortie de var_dump mais pas d'après le echo. À moins que je ne me trompe...

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Ca me chiffonne un peu cette histoire.
    Et si tu les passait en public pour voir la différence ?
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je suis un crétin...
    J'avais mis echo $this->nom hors de l'objet...
    Les variables sont affichées donc, que ce soit en privé ou en public.

    Mais toujours aucune idée de comment m'en sortir avec mon __set.

  9. #9
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    De toutes façons, le __set est une solution pour les fainéants.

    Si on prend des variables privées avec accesseurs, c'est parce que ces variables nécessitent des validations et/ou des filtres spécifiques qui doivent être codés dans leurs accesseurs. Utiliser un __set juste pour faire un trim par exemple, c'est à mon avis passer à côté de la vraie raison d'être des variables privées.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  10. #10
    Invité
    Invité(e)
    Par défaut
    J'utilise les __set pour travailler comme en AS3 c'est à dire que quand je fais $maClasse->maProprietePrivee = 'maValeur', le __set m'appelle la fonction setMaProprietePrivee(), si elle existe (qui effectue le traitement spécifique à cette propriété) ou envoie une excpetion (La propriété maProprietePrivee n'est pas accessible...) si cette fonction n'existe pas.

    J'ai l'habitude d'AS3 où on peut faire des choses comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public function set maProprietePrivee(valeur){
        this.maProprietePrivee = valeur;
    }

  11. #11
    Invité
    Invité(e)
    Par défaut
    J'ai trouvé comment faire marcher tout ça :
    Il faut que tous les champs de la base de données existent dans la classe en tant que propriétés, sinon le __set est appelé et ça fait la méchante erreur citée plus haut.
    Ca parait logique mais comme j'étais en pleine découverte de PDO, je bossais sur une table qui n'a rien à voir avec le truc et je n'ai pas pris le temps de vérifier la correspondance.

    Sinon, pour les private, toujours aucune idée de pourquoi ils sont ignorés, mais ils le sont bel et bien lors du PDO::FETCH_CLASS, puisque le __set ne s'exécute pas.
    Par contre, après ils sont pris en compte tout à fait normalement.

    Résolu pour moi, la bizzarerie des private ne me dérange pas et n'est pas dans l'intitulé du post.

    Merci d'avoir pris le temps de m'aider.

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

Discussions similaires

  1. wsgen ant Could not find class file
    Par pcouas dans le forum Services Web
    Réponses: 1
    Dernier message: 28/07/2010, 12h44
  2. Réponses: 1
    Dernier message: 05/07/2010, 19h38
  3. Réponses: 2
    Dernier message: 08/01/2010, 15h26
  4. Réponses: 0
    Dernier message: 15/10/2009, 16h58
  5. (MARSHAL) Could not load class datamodel.Service"
    Par nargzul dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 15/07/2009, 19h19

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