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] Problème de classe : Variables empty ?


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Par défaut [POO] Problème de classe : Variables empty ?
    Bonjour je me présente au passage je suis Stéphane, étudiant en BTS Informatique de Gestion option Developpeur d'Application.

    Je suis codeur C# au départ mais là je m'improvise codeur PHP pour mon stage.

    Je travaille actuellement en PHP 5, je retraduirais mon code en PHP 4 pour des raisons internes à l'entreprise.

    J'essaye actuellement d'aborder les classes en PHP. J'ai souvent des problèmes dues à des propriétés dans mes classes dites empty.
    Je ne comprend pas puisque mon constructeur affecte toutes les propriétés.

    Ci dessous je vous montre mon code :
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    /*******************************************
    ********************************************
    ********************************************
    Cette classe est appellé par une autre classe par le biais d'un héritage.
    ********************************************
    ********************************************
    *******************************************/
    class mysql_fac_info
    {
    	protected $db_srv;
    	protected $db_port;
    	protected $db_login;
    	protected $db_password;
    	protected $db_name;
     
    	protected function mysql_fac_info($chosen_db)
    	{
    		// Début
    		switch ($chosen_db)
    		{
    			// Paramètres de connexion 1
    			case "lyo" : $db_srv="";/*$lyo_db_srv =*/
    						 $db_port="";/*$lyo_db_port =*/
    						 $db_login="";/*$lyo_db_login =*/
    						 $db_password="";/*$lyo_db_password=*/
    						 $db_name="";break;/*$lyo_db_name =*/
    			// Paramètres de connexion 2
     
    			case "crm" : $db_srv="";/*$crm_db_srv =*/
    						 $db_port="";/*$crm_db_port =*/
    						 $db_login="";/*$crm_db_login =*/
    						 $db_password="";/*$crm_db_password =*/
    						 $db_name="";break;/*$crm_db_name =*/
    			// Paramètres de connexion 3
     
    			case "fac" : $db_srv="localhost";/*$fac_db_srv =*/
    						 $db_port="3306";/*$fac_db_port =*/
    						 $db_login="root";/*$fac_db_login =*/
    						 $db_password="";/*$fac_db_password =*/
    						 $db_name="db_facturation_percallXV";break;/*$fac_db_name =*/
    			default : exit("Erreur de selection"); break;
    		}		
    		// Fin
    	}
     
    	protected function connect($query)
    	{
    		mysql_connect($db_srv.":".$db_port,$db_login,$db_password)
    		or die (mysql_error());
    		mysql_select_db($db_name)
    		or die (mysql_error());
    		$result=mysql_query($query)
    		or die (mysql_error());
    		mysql_close();
    		$result2 = mysql_fetch_array($result);
    		return ($result2);
    	}
     
    }
     
    class mysql extends mysql_fac_info
    {
    	// Propriétés
    	private $requete;
    	// Méthodes
     
    	// Constructeurs	
     
    	public function mysql($chosen_db, $request)
    	{
    		// Début		
    		$this->mysql_fac_info($chosen_db);
    		$requete=$this->list_of_request($request);
    		// Fin
    	}
     
    	// Autres Méthodes
     
    	protected function list_of_request($request)
    	{
    		switch ($request)
    		{
    			case "can_login" :  $requete = 'SELECT * FROM * WHERE';break;
    			case "can_access_panel" :  $requete = 'SELECT * FROM * *, * * WHERE *=* AND * = (
    		SELECT * FROM * WHERE * =*")';break;
    			default : exit; break;
     
    		}
    	}
     
    	public function username_login($username,$password)
    	{
    		// Début
    		$requete=$requete.' users_name="'.$username.'" users_password"'.$password.'"';
    		return($this->connect($requete));
    		// Fin
    	}
     
    	public function return_query()
    	{
    		// Début
    		$result=$this->connect($this->$requete);
    		$final_result = mysql_fetch_array($result);
    		return ($final_result);
    		// Fin
    	}
    }
    Voici les différents messages d'erreurs que j'ai obtenu :
    Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\Program Files\xampp\htdocs\dossier\admin\mysql_fac_info.php on line 51
    Access denied for user 'ODBC'@'localhost' (using password: NO)
    Le message ci dessous apparait après l'utilisation du pointeur "$this->"
    Fatal error: Cannot access empty property in C:\Program Files\xampp\htdocs\dossier\admin\mysql_fac_info.php on line 39
    Comme vous l'avez compris cette classe est appellé lors d'un héritage.

    La première classe assure la connexion à trois bases de données différentes, la deuxième classe assure toute la gestion des requêtes.
    Dites moi si je me trompe, mais puisque je fais hériter une classe à une autre je devrais avoir tous les accès que je souhaite sur elle y compris les valeurs contenues dans les propriétés.

    Cependant bien que mon constructeur dans cette classe mysql_info affecte les différentes informations aux variables, je ne peux avoir accès à celles ci dès que je lance ma méthode connect(), on dirait presque que mon constructeur n'affecte en fait aucune variable.

    Si il y a une notion que je n'ai pas compris, dites le moi car là j'avoue je sèche.

    Merci à vous d'avance
    En espérant vous avoir donné toutes les informations que vous souhaitez.

  2. #2
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    précise tes $this->devant les attributs comme pour les méthodes. C'est peut-être possible de changer ca dans la config si tu veux ne pas être obligé de les préciser.
    Bye

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Par défaut
    Citation Envoyé par Djakisback
    Salut,
    précise tes $this->devant les attributs comme pour les méthodes. C'est peut-être possible de changer ca dans la config si tu veux ne pas être obligé de les préciser.
    Bye
    normalement le pointeur est juste là pour préciser dans le cas d'une confusion possible dans mes souvenirs. Donc oué je suis d'accord avec toi, par contre je comprends pas pourquoi l'utilisation de pointeur implique un changement de type d'erreur et encore moins pourquoi mon constructeur ne fait pas son travail.

  4. #4
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Fais un var_dump() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $test = new mysql('fac', 'can_login');
    var_dump($test);
    Apparemment sans préciser sans le $this les variables sont locales à la méthode.

    Pour le coup de l'empty property t'as du faire une erreur de $ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $test->$db_srv;
    echo $test->db_srv;

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Par défaut
    Avec les $this :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $this->$db_srv="localhost";/*$fac_db_srv =*/
    $this->$db_port="3306";/*$fac_db_port =*/
    $this->$db_login="root";/*$fac_db_login =*/
    $this->$db_password="";/*$fac_db_password =*/
    $this->$db_name="db_facturation_percallXV";break;/*$fac_db_name =*/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Cannot access empty property in C:\Program Files\xampp\htdocs\PercallFacturation\admin\mysql_fac_info.php on line 39
    Pour le var_dump je ferais ça ce week end j'ai terminé mon temps de travail.

  6. #6
    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,

    Ton erreur provient probablement de cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public function return_query()
    	{
    		// Début
    		$result=$this->connect($this->$requete);
    		$final_result = mysql_fetch_array($result);
    		return ($final_result);
    		// Fin
    	}
    Dans le code souligné,gras,italique.... Tu demandeà PHP de rechercher une propriété dynamique, via l'utilisation de $requete.

    Imaginons que, $requete = toto, PHP interpretera l'appel ainsi $this->toto.

    Ce qui bien sur provoquera une erreur puisque ta classe ne possède pas l'attribut toto....

    Quand l'utilisté de $this, elle n'est pas optionnelle.
    Ce mot clef existe bien pour cibler un contexte il faut s'en servir.
    Comme en c#.

    bye

Discussions similaires

  1. [POO] Problèmes de classes
    Par akrogames dans le forum Langage
    Réponses: 3
    Dernier message: 18/02/2008, 16h15
  2. [POO] Problème de classes et héritage
    Par Kabanon dans le forum Langage
    Réponses: 1
    Dernier message: 25/10/2007, 12h37
  3. Réponses: 13
    Dernier message: 15/11/2005, 15h47
  4. Réponses: 3
    Dernier message: 12/10/2005, 09h23
  5. Réponses: 2
    Dernier message: 09/10/2005, 15h35

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