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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    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

  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 : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    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)

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

+ 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