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 et Active Record


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 248
    Points : 231
    Points
    231
    Par défaut PDO et Active Record
    Bonjour,

    Je viens vous demander de l'aide car j'ai un sacré problème. Je me suis peut être attaqué à un trop gros poisson, mais j'ai quand même bien envie de le ferrer !

    J'essaye de mettre en place une classe Active Record depuis plusieurs jour mais j'ai un problème persistant.

    Voici le constructeur de ma classe Active Record
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    abstract class ActiveRecord {
     
    	public function __construct( $iId = '' ) {
     
    		if ( $iId != '' or $iId != 0) {
     
    			/* Mémorisation de la clé. */
    			$this -> key = $iId;
     
    			/* Ecriture de la requête. */
    			$sFields	= implode( ', ', array_keys( $this -> fields));	
    			$sQuery		= "SELECT {$sFields} FROM {$this -> table} WHERE {$this -> index} = '{$this -> key}' ";
     
    			/* Exécution de la requête. */
    			$oStatement	= Factory::get( $this -> driver) -> query( $sQuery);
     
    			/* Mémorisation des champs dans l'instance. */
    			$this -> fields = $oStatement -> fetch( PDO::FETCH_ASSOC );
    		}
    	}
    Jusqu'ici tout va bien...
    Mon problème se trouve là.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* Mémorisation des champs dans l'instance. */
    			$this -> fields = $oStatement -> fetch( PDO::FETCH_ASSOC );
    Lorsque la requête renvoie quelque chose, il n'y a pas de problème. Cependant lorsque le retour est vide. Je me retrouve avec $this -> fields de vide et donc la suite plante inévitablement avec les méthodes magiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public function __get( $sField) {
     
    		if ( ! array_key_exists( $sField, $this -> fields)) {
    			throw new ActiveRecordException( 'Dommage...' );
    		}
     
    		return $this -> fields[$sField];
    	}
     
    	public function __set( $sField, $mValue) {
     
    		if ( ! array_key_exists( $sField, $this -> fields)) {
    			throw new ActiveRecordException( 'Le champ n\'est pas valide !');
    		}
    		//var_dump($this -> fields);
     
    		$this -> fields[$sField] = $mValue;
    	}
    Une âme charitable serait-elle à même de m'aider dans cette situation très délicate ???

    Merci par avance !

  2. #2
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Le fix trivial consisterait à vérifier que le retour $oStatement->fetch() dans le constructeur n'est pas vide (autrement dit qu'il y a bien des éléments). L'assignation à $this->fields ne se ferait que s'il y a ces éléments.

    Mais il y a un problème conceptuel: quand on est dans ton constructeur et que l'on a précisé un $iId, alors l'objet créé devrait l'être complètement ou pas du tout. Si le row dans la table correspondante n'est pas trouvé, alors tu devrais lever une exception dans le constructeur pour annuler la création de l'objet plutôt que de faire comme si rien ne s'était passé. Sinon, à quoi peut s'attendre l'utilisateur ? Que feras tu d'un $this->key non null lors de save/update alors que l'id correspondant n'existe pas en base ?

    Conseil: essai de séparer la logique objet de la logique sql dans ta classe ActiveRecord. Quand tu voudras gérer le loading d'objets dépendants (one to one, many to many etc), ça va devenir ingérable si tu n'as pas un composant spécialisé pour créer les requêtes sql. Donc en gros, mettre tout ce qui touche à PDO dans un composant spécialisé

Discussions similaires

  1. Active Record Timestamps
    Par gentil dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 16/06/2008, 13h38
  2. [POO] Différence entre ORM et Active Record ?
    Par Jokaritaff dans le forum Langage
    Réponses: 6
    Dernier message: 25/05/2008, 16h10
  3. collection d'objet active record
    Par penguin50 dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 10/03/2008, 15h10
  4. Rake, Active Record et accent
    Par Matthieu L dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 19/12/2007, 02h29
  5. Réponses: 2
    Dernier message: 02/04/2007, 10h01

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