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

Langage PHP Discussion :

[POO] Prob. POO: $this->$fieldname[$i]


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut [POO] Prob. POO: $this->$fieldname[$i]
    Bonjour,

    En fait, j'ai une classe DB qui me permet d'accèder de manière générale à ma base de donnée (mysql). J'ai ensuite une classe Account qui hérite de DB. C'est un objet qui contient notamment autant de variables qu'il y a de champs dans la table account, les variables ayant les mêmes noms que les champs. J'espères avoir été plus ou moins clair, un exemple suivra.

    Mon but est de charger dans un objet Account les champs d'une entrée de la table account, pour en fait passer de la BDD à un objet (façon maison bien sûr).

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    class DB
    {
    ...
    	function fetch()
    	{
    		if ($this->dbFetch == 'array')
    			return mysql_fetch_array($this->dbResult, MYSQL_ASSOC);
    		else
    			return mysql_fetch_object($this->dbResult);
    	}
     
    	function fill()
    	{
    		$object = $this->fetch();
    		$numfields = mysql_num_fields($this->dbResult);
     
    		// on récupère les noms des champs de la table
    		for ($i = 0; $i < $numfields; $i++)
    			$fieldname[$i] = mysql_field_name($this->dbResult, $i);
     
    		for ($i = 0; $i < $numfields; $i++)
    			$this->$fieldname[$i] = $object->$fieldname[$i];    // prob ?
    	}
    ...
    }
     
    class Account extends DB
    {
    	var $uid;
    	var $login;
    	var $mail;
    	var $pass;
    	var $country;
    	var $city;
    	var $lastseen;
    	var $ip;
     
    	var $query;
     
    	function Account($uid = 0)
    	{
    		$this->{get_parent_class($this)}();
     
    		if ($uid) $this->load($uid);
    	}
     
    	function load($uid)
    	{
    		$this->query = sprintf('SELECT * FROM '.TBL_ACCOUNT.' WHERE uid=`%s`',
    			$this->clean($uid));
     
    		$this->fill();
    	}
    }
     
    CREATE TABLE account (
      uid int(11) NOT NULL default '0',
      login varchar(15) NOT NULL default '',
      mail varchar(128) NOT NULL default '',
      pass varchar(32) NOT NULL default '',
      country varchar(32) NOT NULL default '',
      city varchar(32) NOT NULL default '',
      lastseen datetime NOT NULL default '0000-00-00 00:00:00',
      ip tinyint(20) NOT NULL default '0',
      PRIMARY KEY  (uid)
    ) TYPE=MyISAM;
     
    $account = new Account(0);
    echo $account->login.' from '.$account->country;
    Vous avez donc ce qui nous intéresse de la classe DB, la classe Account dans son entiereté (pour le moment..), la structure de la table account, et ce que j'exécutes.

    Pas d'erreurs, juste : "from".. Les membres de la classe Account sont donc vides. Pourtant, il me semble que $this->$fieldname[$i] = $object->$fieldname[$i]; est permis, non ?

    Merci d'avance !!

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Bonjour,

    Ce n'est plutôt ceci

    <?php
    $this
    ->fieldname[$i] = $object->fieldname[$i];
    ?>
    Colorez votre code PHP sur les forums grâce à Developpez.com

  3. #3
    Membre éclairé
    Avatar de kankrelune
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 763
    Points : 858
    Points
    858
    Par défaut
    Je ne pense pas que tu ais structuré ton code comme il faut...

    Plutot que de faire hériter ta class Account utilise le singleton...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->{get_parent_class($this)}();


    C'est quoi ça... tu es censé savoir quelle est la class parente de ta class... donc... .. .

    ensuite...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if ($uid) $this->load($uid);
     
    ...
     
    ..
     
    .
     
    $account = new Account(0);
    echo $account->login.' from '.$account->country;
    Ton exemple ne risque pas de marcher car tu veux charger l'uid 0 mais 0 vaut false pour une comparaison non typée... donc... .. .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function Account($uid = false)
    {
    	parent::DB();
     
            if ($uid !== false) 
    		$this->load($uid);
    }
    Sinon ta méthode fill risque plus de mettre le bordel qu'autre chose et puis ce n'est pas le role de ta classe db de réécrire dans les attributs d'une autre classe... qui plus est tu n'execute aucune requete avant de l'utiliser...

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    class DB
    {
    ...
    
          function &getInstance()
          {
                static $_db_singleInstance = null;
                
                if(!is_object($_db_singleInstance))
                 $_db_singleInstance =& new DB();
                
                return $_db_singleInstance;
          }
          
          function numRows($result = '')
          {
                if(empty($result))
                      $result = $this->dbResult;
                
                return mysql_num_rows($result);
          }
          
          function fetch($result = '',$object = false)
          {
                if(empty($result))
                      $result = $this->dbResult;
                
                if ($object)
                      return mysql_fetch_object($result);
                            else
                                  return mysql_fetch_array($result, MYSQL_ASSOC);
          }
    ...
    }
    
    class Account
    {
          var $_userInfos;
          var $_db;
          
          function Account($uid = false)
          {
                $this->_db = DB::getInstance();
                $this->resetInfos();
                
                if ($uid !== false) 
                      $this->load($uid);
          }
          
          function resetInfos()
          {
                $this->_userInfos = array(
                                                    'uid'             => 0,
                                                    'login'       => '',
                                                    'mail'             => '',
                                                    'pass'             => '',
                                                    'country'       => '',
                                                    'city'             => '',
                                                    'lastseen'       => '',
                                                    'ip'             => ''
                                              );
          }
          
          function load($uid)
          {
                $this->_db->query('SELECT * FROM '.TBL_ACCOUNT.' WHERE uid='.(int)$uid);
                
                if($this->_db->numRows() == 0)
                            {
                                        $this->resetInfos();
                      return false;
                }
    
                foreach($this->fetch() as $info => $value)
                      $this->setInfo($info,$value);
                
                return true;
          }
          
          function setInfo($info,$value)
          {
                if(!isset($this->_userInfos[$info]))
                      return false;
                
                $this->_userInfos[$info] = $value;
                
                return true;
          }
    }
    
    
    $account = new Account(0);
    echo $account->login.' from '.$account->country;
    
    C'est à fignoler mais ceci me parait plus rationel comme approche... .. .

    @ tchaOo°

Discussions similaires

  1. [POO] classes et "$this" ?
    Par benmat dans le forum Langage
    Réponses: 1
    Dernier message: 13/09/2006, 21h42
  2. [POO] Probleme avec $this
    Par cubepiege dans le forum Langage
    Réponses: 5
    Dernier message: 01/03/2006, 15h39
  3. [POO] Prob avec une méthode de classe
    Par Ludo75 dans le forum Langage
    Réponses: 9
    Dernier message: 06/02/2006, 22h37
  4. [POO] [PROB] [Class] Formulaire
    Par Yoshio dans le forum Langage
    Réponses: 6
    Dernier message: 01/10/2005, 15h04
  5. [POO] Modèle objet: this inutilisable dans certains cas?
    Par vlord dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 13/08/2005, 10h41

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