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 :

Question sur l'utilisation de $this


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut Question sur l'utilisation de $this
    Bonjour,

    J'ai codé une classe gérant les connexions à ma bdd, et une autre classe permettant de faire mes requêtes.

    Ma classe cDatabase:
    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
    <?php if (!defined('ROOT_DIR')) die('Vous ne pouvez pas accéder à ce fichier directement!');
     
    	class cDatabase {
    		private static $pg_instance = NULL;
    		private static $db_host = NULL;
    		private static $db_port = NULL;
    		private static $db_name = NULL;
    		private static $db_user = NULL;
    		private static $db_pass = NULL;
     
    		/**
    		 * Constructeur
    		 * @name __contruct
    		 */
    		public function __construct($db_host,$db_port,$db_name,$db_user,$db_pass) {
    			$this->db_host = $db_host;
    			$this->db_port = $db_port;
    			$this->db_name = $db_name;
    			$this->db_user = $db_user;
    			$this->db_pass = $db_pass;
    		}
     
    		/**
    		 * Afin de protéger l'instance créer
    		 *  @name __clone
    		 */
    		private function __clone(){}
     
    		/**
    		 * Connexion à la base de données Postgres
    		 * @name pgConnect
    		 *
    		 * @return $pg_instance
    		 */
    		public static function pgConnect() {
    			if (! defined('PG_DB_CHARSET')) define('PG_DB_CHARSET', DEFAULT_DB_CHARSET);
     
    			if (!self::$pg_instance) {
    				try {
    					self::$pg_instance = new PDO(
    							'pgsql:host=' . $this->db_host . ';port=' . $this->db_port . ';dbname=' . $this->db_name . ';user=' . $this->db_user . ';password=' . $this->db_pass . ''
    					);
    					self::$pg_instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    				} catch (PDOException $e) {
    					echo '['.$e->code.']: ' . $e->getMessage();
    				}
    			}
    			return self::$pg_instance;
    		}
     
    		/**
    		 * Exécution d'une requête sur la base Postgres
    		 * @name pgQuery
    		 *
    		 * @return ressource
    		 */
    		public static function pgQuery($query) {
    			if (self::$my_instance) {
    				try {
    					return $sth = self::$pg_instance->query($query);
    				} catch (PDOException $e) {
    					throw new Exception('['.$e->getCode().']: ' . $e->getMessage() );
    				}
    			} else {
    				throw new Exception("[ERR] Impossible d'exécuter la requête sur la base de données");
    			}
    		}
     
    		/**
    		 * Déconnexion de la base Postgres
    		 * @name pgDisconnect
    		 *
    		 * @return boolean
    		 */
    		public static function pgDisconnect() {
    			if (self::$pg_instance) {
    				try {
    					self::$pg_instance = null;
    					return true;
    				} catch (PDOException $e) {
    					echo '['.$e->code.']: ' . $e->getMessage();
    				}
    			}
    		}
    	}
     
    ?>
    Et la classe cDbmanage:
    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
    <?php if (!defined('ROOT_DIR')) die('Vous ne pouvez pas accéder à ce fichier directement!');
     
    	class cDbManage {
     
    		public function checkLogin($_POST) {
    			$login = cTools::protect($_POST['username']);
    			$password = md5(cTools::protect($_POST['password']));
     
    			if (empty($login) || empty($password)) return false;
     
    			try {
    				$query = "select userid,CONCAT_WS(' ',name,surname) as name from users
    					where login='$login' AND pass='$password'";
     
    				$dbh = new cDatabase("adresseip","port","dbname","user","pass");
    				$dbh->pgConnect();
    				$PgRes = $dbh->pgQuery($query);
     
    				foreach($MyRes as $row) {
    					$_SESSION['authid'] = $row['userid'];
    					$_SESSION['auth'] = $row['name'];
    				}
     
    				$dbh->pgDisconnect();
    			} catch (Exception $e) {
    				throw new Exception($e->getMessage());
    			}
    		}
    	}
     
    ?>
    Et l'appel à la méthode checkLogin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cDbManage::checkLogin($_POST);
    Et il me renvoi l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Using $this when not in object context in /VAR/applis/apache2/www/dbr/class/cDatabase.php on line ...
    Je ne comprends pas ce que je fais de mal. J'appelle une fonction publique qui elle fait la vérification de login et renseigne les variables d'environnements.

    Auriez-vous une idée ?

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    A vue de nez, tu essayes de faire un Singleton.

    Tu ne peux pas utiliser $this à l'intérieur d'une méthode statique : $this référence l'instance de l'objet et une méthode statique peut être appelée sans instanciation.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Invité
    Invité(e)
    Par défaut


    Avant de te répondre j'ai 2 petites remarques un peu hors sujet :
    • Pourquoi, en 2013, coder ce que PDO_PGSQL fait nativement ?
    • Pourquoi gérer en PHP l'interdiction d'accès à tes scripts alors que ton serveur web, quel qu'il soit, fait ça beaucoup plus vite et de manière beaucoup plus sécurisée en mettant simplement tes scripts dans un répertoire inaccessible en HTTP ?


    Concernant ta question :
    • Maîtrises-tu bien la différence entre une méthode statique et une méthode membre ?
    • Tu appelles ta méthode membre checkLogin en mode statique (ce que PHP ne devrait pas te laisser faire, c'est un bug du langage), c'est donc normal que $this (l'objet courant) ne soit pas défini. Il faut que tu instancies ta classe (par exemple via un Singleton comme le suggère intelligemment @Celira) pour récupérer un objet sur lequel tu pourras appeler ta méthode membre avec $object->checkLogin().
    Dernière modification par FirePrawn ; 13/03/2013 à 11h38. Motif: Mise en forme

  4. #4
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    Merci pour les réponses

    Pour répondre aux questions dans l'ordre:

    Pourquoi, en 2013, coder ce que PDO_PGSQL fait nativement ?
    --> Pour coder une lib de connexion à différents SGBD uniformisée pour toutes
    les applications que je développe. Ca évite de m'éparpiller

    Pourquoi gérer en PHP l'interdiction d'accès à tes scripts alors que ton serveur web, quel qu'il soit, fait ça beaucoup plus vite et de manière beaucoup plus sécurisée en mettant simplement tes scripts dans un répertoire inaccessible en HTTP ?
    --> les fichiers sont effectivement déjà dans un répertoire 'classes'.
    C'est historique si j'ose dire. J'avais codé ça à l'époque ou les fichiers étaient tous dispo sur la même racine. Je ré-actualise mon code d'où mes questions, et je vais virer cette vérification.

    Concernant ta question :

    Maîtrises-tu bien la différence entre une méthode statique et une méthode membre ?
    --> non. J'apprends au fur et à mesure de mes besoins. Je ne suis pas développeur de formation, alors je fais ce que je peux pour comprendre mes erreurs, et c'est grâce à des personnes comme vous qui m'orientent dans a bonne direction que je m'en sors

    Tu appelles ta méthode membre checkLogin en mode statique (ce que PHP ne devrait pas te laisser faire, c'est un bug du langage), c'est donc normal que $this (l'objet courant) ne soit pas défini. Il faut que tu instancies ta classe (par exemple via un Singleton comme le suggère intelligemment @Celira) pour récupérer un objet sur lequel tu pourras appeler ta méthode membre avec $object->checkLogin().
    --> ok, compris, j'ajoute un construct

    Mais je vais aller lire la doc sur les singleton et les méthodes.

Discussions similaires

  1. Question sur l'utilisation de wget
    Par berry dans le forum Réseau
    Réponses: 7
    Dernier message: 24/05/2007, 22h46
  2. Question sur l'utilisation du popupMenu
    Par Jayceblaster dans le forum Delphi
    Réponses: 2
    Dernier message: 25/07/2006, 10h59
  3. question sur l'utilisation d'une listBox
    Par Mickey.jet dans le forum Delphi
    Réponses: 3
    Dernier message: 02/06/2006, 17h57
  4. Question sur l'utilisation du mot réservé static
    Par flash2590 dans le forum Langage
    Réponses: 4
    Dernier message: 10/04/2006, 00h20
  5. [Framework] Questions sur l'utilisation de spring
    Par mlequim dans le forum Spring
    Réponses: 10
    Dernier message: 01/02/2006, 15h27

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