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 :

Problème avec une classe


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut Problème avec une classe
    Bonjour,

    J'essaye de créer un classe, celle-ci doit se connecter à une base de données puis afficher le contenu d'une table, seulement ma page je s'affiche pas, et pire, j'ai le droit à l'erreur HTTP 500 de IE.
    Je suis pas très fort en POO et j'aimerais avoir si possible vos remarques sur 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
     
    class Mycv{
     
    	private $dbhote = '',
    	private $dbbase = '',
    	private $dbuser = '',
    	private $dbpass = '',
    	private $dsn = '';	
    	private $dbh = '';
     
    	public function __construct($dbhote = 'localhost', $dbbase = 'test', $dbuser = 'root', $dbpass = '')
    	{
    		$this->dbhote = $Serveur;
    		$this->dbbase = $Bdd;
    		$this->dbuser = $Identifiant;
    		$this->dbpass = $Mdp;
    		$this->dsn = 'mysql:dbname=$this->dbbase;host=$this->dbhote';
    		$this->dbh = new PDO($this->dsn, $this->dbuser, $this->dbpass);
    	}
     
    	public function viewData(){
    		$sql = 'SELECT * FROM fic_opex_cla';
    		$res = $this->dbh->query($sql);
    		while($row = $res->fetch(PDO::FETCH_NUM)){
    			echo $row[1].'<br/>';
    		}
    	}
    }
     
    $test = new Mycv();
    $test->viewData();
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Les variables ne sont pas interpretées à l'interieur des guillemets simples.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->dsn = "mysql:dbname=$this->dbbase;host=$this->dbhote";

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut
    Cela me fait le mème problème en mettant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->dsn = 'mysql:dbname='.$this->dbbase.';host='.$this->dbhote;
    ou en mettant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->dsn = "mysql:dbname=$this->dbbase;host=$this->dbhote";
    Cela ne viendrait pas du fait que j'utilise les PDO à l'intérieur d'une classe ??? même si je ne pense pas.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut
    Tu dois remplacer les virgules par des points-virgules ou enlever les private à partir de ta seconde variable de déclarée.

    De plus ton constructeur possède dans son corps des variables qui ne sont définies nulle part: $Serveur, $Bdd, $Identifiant, $Mdp.

    Et il n'y a aucune utilité à mettre des variables private si c'est pour qu'elle soit affectée par des variables qui peuvent changer de l'extérieur.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut
    C'est bon, j'ai fais quelques petites corrections avec votre aide, et cela fonctionne, j'ai rajouté une variable et une fonction (en gras) qui doit calculer le nombre de résultat, mais cela n'affiche rien, mème pas d'erreur :

    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
    class Mycv{
    	public $dbhote = '';
    	public $dbbase = '';
    	public $dbuser = '';
    	public $dbpass = '';
    	public $dsn = '';	
    	public $dbh = '';
    	
    	public $nbres = 0;
    	
    	public function __construct($dbhote = 'localhost', $dbbase = 'test', $dbuser = 'root', $dbpass = '')
    	{
    		$this->dbhote = $dbhote;
    		$this->dbbase = $dbbase;
    		$this->dbuser = $dbuser;
    		$this->dbpass = $dbpass;
    		$this->dsn = "mysql:dbname=$this->dbbase;host=$this->dbhote";
    		$this->dbh = new PDO($this->dsn, $this->dbuser, $this->dbpass);
    	}
    	
    	public function viewData(){
    		$this->sql = 'SELECT * FROM fic_opex_cla';
    		$this->res = $this->dbh->query($this->sql);
    		while($this->row = $this->res->fetch(PDO::FETCH_NUM)){
    			echo $this->row[1].'<br/>';
    			++$this->nbres;
    		}
    	}
    	
    	public function nombreRes(){
    		return $this->nbres;
    	} 
    }
    
    $test = new Mycv();
    $test->viewData();
    $test->nombreRes();

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ta fonction en gras n'a pas d'echo.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut c'est encore pire
    Tes codes de connexion à ta BDD doivent à tout prix rester confidentiels. Donc ne SURTOUT PAS METTRE public pour tes variables de connexion au SGBD.

    Voici un code qui t'expliquera pourquoi ton premier code était inutile avec les variables private.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class ClassTest {
        private $_private='une variable privée';
     
        public function __construct($variable){
            $this->_private=$variable;
            echo 'la variable $_private est '. $variable .'<br/>';
        }
    }
    $oTest = new ClassTest('une variable publique');

    Comme tu peux le voir, il est possible de modifier la valeur de la variable $_private qui est private. Cela est une grosse erreur de conception.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut
    Comment faire pour les laisser confidentielles si même l'attribut "private" ne les protègent pas ?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut elle est confidentielle
    Elle est confidentielle dans le sens où on ne peut accéder directement de l'extérieur comme dans l'exemple ci-dessous
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class ClassTest {
        public $_public='une variable publique<br/>';
        private $_private='une variable privée<br/>';
     
        public function __construct(){
        }
    }
    $oTest = new ClassTest();
    echo $oTest->_public; // affiche la valeur de la variable $_public
    $oTest->_public='variable modifiée';
    echo $oTest->_public; // affiche la valeur modifiée de la variable $_public
     
    echo $oTest->_private; // arrête le script PHP et affiche un message d'erreur comme quoi il ne peut pas accéder à la variable
    $oTest->_private='variable modifiée';
    echo $oTest->_private;

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut
    En gros en mettant "private", la variable sera confidentielle mais pas trop quand mème...

  11. #11
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut
    Si elle sera confidentielle à condition que le développeur soit assez futé pour ne pas créer une faille de sécurité. Au final, la variable private assume tout à fait son rôle de ne pas être accessible directement de l'extérieur mais elle est modifiable de l'intérieur de la classe. Pour qu'il soit impossible de modifier tes codes de connexion, il faut les déclarer en constantes en non en variables privées ou alors être sûr de tes compétences en POO pour utiliser les variables privées.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut
    J'ai modifié en conséquence mon code, je les ai mise en constantes, par contre je ne suis pas sur le l'appel de la constante, car cela n'affiche plus rien.
    Un variable (privée, public ou protected) on l'appel avec $this->var mais une constante ? Pour ma part j'ai mis CONST_VAR :

    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
     
    class Mycv{
    	const CONST_DBHOTE = '';
    	const CONST_DBBASE = '';
    	const CONST_DBUSER = '';
    	const CONST_DBPASS = '';
    	const CONST_DSN = '';	
    	const CONST_DBH = '';
     
    	public $nbres = 0;
     
    	public function __construct(CONST_DBHOTE = 'clap0bdl.ntcla.cla.edfgdf.fr', CONST_DBBASE = 'opex_test', CONST_DBUSER = 'root', CONST_DBBASE = 'root')
    	{
    		CONST_DSN = "mysql:dbname=CONST_DBBASE;host=CONST_DBHOTE";
    		CONST_DBH = new PDO(CONST_DSN, CONST_DBUSER, CONST_DBPASS);
    	}
     
    	public function viewData(){
    		$this->sql = 'SELECT * FROM fic_opex_cla';
    		$this->res = CONST_DBH->query($this->sql);
    		while($this->row = $this->res->fetch(PDO::FETCH_NUM)){
    			for($i=1;$i<=15;$i++){
    				echo $this->row[$i].';';
    			}
    			echo '<br/>';
    			$this->nbres++;
    		}
    	}
     
    	public function nombreRes(){
    		echo $this->nbres;
    	} 
    }
     
    $test = new Mycv();
    $test->viewData();
    $test->nombreRes();

  13. #13
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut
    Evidemment que ça ne peut pas fonctionner puisqu'une constante ne peut être modifiée. Donc si tu définis une constante de la manière suivante

    const DBHOST = '';

    Celle-ci gardera la valeur de chaîne vide tout le long du programme
    Tu dois mettre:

    const $DBHOST='localhost';

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut
    Vi c'est pas faux, la j'ai fais une boulette J'ai corrigé, mais il doit encore y avoir un problème, pourtant tout est bien définit comme avant sauf que la ce sont des constantes.

    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
     
    class Mycv{
    	const CONST_DBHOTE = 'localhost';
    	const CONST_DBBASE = 'test';
    	const CONST_DBUSER = 'root';
    	const CONST_DBPASS = '';
    	const CONST_DSN = "mysql:dbname=CONST_DBBASE;host=CONST_DBHOTE";	
    	const CONST_DBH = new PDO(CONST_DSN, CONST_DBUSER, CONST_DBPASS);
     
    	public $nbres = 0;
     
    	public function __construct(){
    	}
     
    	public function viewData(){
    		$this->sql = 'SELECT * FROM fic_opex_cla';
    		$this->res = CONST_DBH->query($this->sql);
    		while($this->row = $this->res->fetch(PDO::FETCH_NUM)){
    			for($i=1;$i<=15;$i++){
    				echo $this->row[$i].';';
    			}
    			echo '<br/>';
    			$this->nbres++;
    		}
    	}
     
    	public function nombreRes(){
    		echo $this->nbres;
    	} 
    }
     
    $test = new Mycv();
    $test->viewData();
    $test->nombreRes();
    Par contre, j'ai une petite question, on parlait de confidentialité tout à l'heure, dans le cas des constantes, si je marque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo Mycv::CONST_DBHOTE;
    cela affichera : localhost . Donc la valeur n'est pas confidentiel, elle n'est juste pas modifiable.

  15. #15
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut
    D'où l'intérêt de les déclarer en private et non en const Ensuite à toi de ne pas faire d'erreur lors de la programmation. Cela viendra avec le temps...

Discussions similaires

  1. problème avec une classe générique
    Par bard123 dans le forum Langage
    Réponses: 4
    Dernier message: 27/06/2008, 11h09
  2. [POO] Problème avec une classe + requêtes sql
    Par mithrendil dans le forum Langage
    Réponses: 2
    Dernier message: 30/04/2007, 08h27
  3. Problème avec une classe générique
    Par Core8 dans le forum C++
    Réponses: 3
    Dernier message: 19/03/2007, 03h18
  4. Problème avec une classe ActionScript
    Par Patryk403 dans le forum Flash
    Réponses: 3
    Dernier message: 06/08/2006, 12h42
  5. Problème avec une classe... "without object"
    Par z980x dans le forum C++
    Réponses: 8
    Dernier message: 27/04/2006, 16h00

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