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] Classe SQL et Classe Membre


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 27
    Par défaut [POO] Classe SQL et Classe Membre
    Bonjour à tous,

    Je viens vous voir pour avoir votre avis sur 2 classes que j'ai codées (je patauge un peu dans la POO pour l'instant à vrai dire ).

    Ma première classe est une classe SQL et la deuxième une classe Membre (elles ne sont pas complète pour l'instant mais fonctionnent correctement).

    Voici mon fichier index.php :

    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
    <?php
    /*
    Nom :: index.php
    */
     
    function __autoload($class_name)
      {
        require_once './class/'.$class_name.'.class.php';
      }
     
    session_start();
     
    $sql = new SQL();
    $membre = new Membre($sql);
     
    if ( $membre->etat() )
      {
         echo $membre->pseudo; // simple exemple
      }
    else
      {
         // redirection vers une page de connection
      }
    ?>
    Voici ma classe SQL :

    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
    <?php
     
    class SQL // Classe SQL permettant de simplifier la connection à une BDD et toutes les opérations qui s'y rapportent
      {
        //-- Paramètres de connection à MySQL
        private $user = 'xxxx';
        private $password = 'xxxxx';
        private $database = 'xxxx';
        private $server = 'xxxx.xxxx.xxxxx';
     
        private $connection_id; // Vaut le link de la connection au serveur MySQL
        private $connecte = FALSE; // Etat de la connection
        private $message_erreur; // Message d'erreur à afficher en cas de problème
        private $resultat=array(); // Contient les résultats de toutes les requêtes
        private $erreur_base = 'Une erreur est survenue lors de l\'exécution de cette page. Si après le problème persiste, veuillez contacter le webmaster de ce site.'; // Message de base pour une erreur
        private $mysql_error_etat = TRUE; // Affiche ou non en plus du message d'erreur le mysql_error()
        private $mysql_error; // Contient le mysql_error()
     
        public $reussi = FALSE; // Résultat d'une fonction retournant un boléen 
     
     
     
         function __construct() // Fonction __construct() permettant de se connecter à la BDD
           {
              $this->connection_id = @mysql_connect($this->server,$this->user,$this->password); // On définit $this->connection_id comme link de la connection
     
              if ( $this->connection_id ) // Si la connection réussi
                {
                  if ( @mysql_select_db($this->database,$this->connection_id) ) // Si la sélection de la BDD réussi
                    {
                      $this->connecte = TRUE;
                      $this->reussi = TRUE;
                    }
                  else // Sinon
                    {
                      $this->connecte = FALSE;
                      $this->reussi = FALSE;
                      $this->message_erreur = 'La base sélectionnée est inaccessible';
                      $this->erreur(); // On affiche une erreur
                    }
                }
              else // Sinon
                {
                  $this->connecte = FALSE;
                  $this->reussi = FALSE;
                  $this->message_erreur = 'Impossible de se connecter au serveur MySQL';
                  $this->erreur(); // On affiche une erreur
                }
     
              return $this->reussi; // On retourne TRUE ou FALSE
            }
     
     
         public function erreur() // Fonction permettant l'affichage d'une erreur (l'avantage étant de pouvoir styliser celle-ci plus facilement)
           {
              if ( $this->mysql_error_etat ) // Si on décide d'afficher mysql_error()
                {
                  $fin_erreur = '<br /><br /><b>Erreur MySQL</b> : '.$this->mysql_error;
                }
             echo $this->message_erreur.$fin_erreur; // On affiche le message d'erreur
           }
     
     
         public function requete($requete,$i) // Fonction permettant d'exécuter une requête (il faut passer $i (un numéro) en paramètre)
           {
              if ( $this->connecte == TRUE ) // Si on est connecté à la BDD
                {
                  $this->resultat[$i] = @mysql_query($requete,$this->connection_id); // On exécute la requête que l'on place dans le tableau $this->resultat pour pouvoir la récupérer plus tard
                  if ( !$this->resultat[$i] ) // Si la requête échoue
                    {
                      $this->reussi = FALSE;
                      $this->message_erreur = $this->erreur_base;
                      $this->mysql_error = mysql_error($this->connection_id); // On place le mysql_error() correspondant dans $this->mysql_error
                      $this->erreur(); // On retourne une erreur
                    }
                  else // Sinon
                    {
                      $this->reussi = TRUE;
                    }
     
                  return $this->reussi; // On retourne TRUE ou FALSE
                }
           }
     
     
         public function fetch($i) // Fonction permettant d'organiser les données obtenues par un SELECT dans un array associatif
           {
              if ( $this->resultat[$i] ) // Si on trouve un résultat d'une requête correspondant à la clé $i dans le tableau $this->resultat
                {
                  return @mysql_fetch_assoc($this->resultat[$i]); // On retourne le array associatif correspondant
                }
           }
     
     
         public function nbre_res($i) // Fonction permettant de retourner le nombre de lignes obtenues par un SELECT
           {
              if ( $this->resultat[$i] ) // Si on trouve un résultat d'une requête correspondant à la clé $i dans le tableau $this->resultat
                {
                  return @mysql_num_rows($this->resultat[$i]); // On retourne le nombre de lignes correspondant
                }
           }
      }
    ?>
    Et voici enfin ma classe Membre :

    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    <?php
     
    class Membre // Classe Membre
      {
         public $id; // Id du membre
         public $pseudo; // Pseudo du membre
         public $email; // Email du membre
         public $niveau; // Niveau du membre
         public $etat = FALSE; // Etat (connecté ou non) du membre
         private $informations=array(); // Tableau de ses informations
         private $sql; // Récupère l'objet sql
     
     
         function __construct($sql) // Fonction __construct() s'exécutant à chaquel nouvel appel à la classe Membre (new Membre())
           {
             $this->sql = $sql; // Récupère l'objet sql
     
             if ( isset($_SESSION['id']) ) // Si le membre est déjà connecté
               {
                 $sql = $this->sql->requete("SELECT * FROM membres WHERE id='".$_SESSION['id']."'",1); // On exécute une requête (classe SQL) permettant de récupérer les infos du membre
                 $this->informations = $this->sql->fetch(1); // On récupère ses informations
     
                 $this->id = $this->informations['id']; // On update la variable id
                 $this->pseudo = $this->informations['pseudo']; // ...
                 $this->email = $this->informations['email']; // ...
                 $this->niveau = $this->informations['niveau']; // ...
                 $this->etat = TRUE; // Le membre est connecté
               }
             else // Sinon
               {
                 $this->etat = FALSE; // Le membre n'est pas connecté
               }
           }
     
     
         public function etat() // Fonction permettant de récupérer l'état d'un membre (inutile pour le moment puisque $this->etat est publique)
           {
             return $this->etat;
           }
     
     
         private function update_infos() // Fonction permettant d'update seulement depuis l'intérieur de la classe les infos du membre
           {
             $sql = $this->sql->requete("SELECT * FROM membres WHERE id = '".$this->id."'",1); // On sélectionne tous le membre ayant pour pseudo $pseudo et mdp hashé en sha1 $motdepasse
             $this->informations = $this->sql->fetch(1); // On récupère ses informations
     
             $this->id = $this->informations['id']; // On update la variable id
             $this->pseudo = $this->informations['pseudo']; // ...
             $this->email = $this->informations['email']; // ...
             $this->niveau = $this->informations['niveau']; // ...
             $this->etat = TRUE; // Le membre est connecté
           }
     
         public function connection($pseudo,$motdepasse) // Fonction permettant de connecter un membre
           {
             $sql = $this->sql->requete("SELECT * FROM membres WHERE pseudo = '".$pseudo."' && motdepasse = '".sha1($motdepasse)."'",1); // On sélectionne tous le membre ayant pour pseudo $pseudo et mdp hashé en sha1 $motdepasse
             $reussi = $this->sql->nbre_res(1);
             if ( $reussi == 1 ) // Si il y a un membre correspondant à ces informations
               {
                 $this->informations = $this->sql->fetch(1); // On récupère ses informations
     
                 $this->id = $this->informations['id']; // On update la variable id
                 $this->pseudo = $this->informations['pseudo']; // ...
                 $this->email = $this->informations['email']; // ...
                 $this->niveau = $this->informations['niveau']; // ...
                 $this->etat = TRUE; // Le membre est connecté
                 $_SESSION['id'] = $this->id;
               }
             return $this->etat; // On retourne TRUE ou FALSE
           }
     
     
         public function inscription($pseudo,$motdepasse,$email) // Fonction permettant l'inscription d'un membre
           {
             $sql = $this->sql->requete("INSERT INTO membres (id,pseudo,motdepasse,email) VALUES ('','".$pseudo."','".sha1($motdepasse)."','".$email."')",1); // On insère ses informations dans la BDD
             if ( $sql ) // Si tout s'est bien passé
               {
                 return TRUE; // On retourne TRUE
               }
             else
               {
                 return FALSE; // On retourne FALSE
               }
           }
     
     
         public function modification($modifications,$id) // Fonction permettant la modification des informations d'un membre à partir d'un array de la sorte : array('cle'=>'valeur','...');
           {
             $requete = 'UPDATE TABLE membres SET '; // Début de la requête
             $c=0;
             foreach($modifications as $cle=>$valeur) // On décompose l'array
               {
                  $c++;
                  $requete .= ( $c == 1 ) ? $cle.' = '.$valeur : ', '. $cle.' = '.$valeur; // Si c'est le premier passage on ne met pas de virgule devant, sinon oui
               }
             $requete .= ' WHERE id="'.$id.'"'; // Fin de la requête
             $sql = $this->sql->requete($requete);
             if ( $sql ) // Si tout s'est bien passé
               {
                 foreach($modifications as $cle=>$valeur) // On modifie les informations du membre dans la classe
                   {
                      $this->$cle = $valeur;
                      $this->informations[$cle] = $valeur;
                   }
                 return TRUE;
               }
             else
               {
                 return FALSE;
               }
           }
     
         public function deconnection() // Fonction permettant la déconnection du membre
           {
             unset($_SESSION);
             unset($this->informations);
             unset($this->pseudo);
             unset($this->email);
             unset($this->id);
             unset($this->niveau);
     
             session_destroy();
             $this->etat = FALSE;
           }
      }
    ?>


    Si vous souhaitez plus d'informations ou si j'ai oublié quelque chose, n'hésitez pas. J'aimerai avoir votre avis car comme ce sont des codes d'essai j'aimerai prendre des bonnes habitudes dès le début.

    Merci à vous !

  2. #2
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Bonjour,
    Dans ta classe étendue tu fais appel au parents d'une méthode, or tu le fais dans une série de méthode.

    Si tu étend une classe, tu peux hériter de tes méthodes si elle sont elles mêmes étendue, sinon tu doit y faire appel via $this.

    exemple, dans la classe Membre tu initialise la méthode __consrtruct()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        function __construct()
           {
             parent::connection();
             if ( isset($_SESSION['id']) )
               {
    or, la méthode connection n'est pas parents de la méthode __construct(), elle ne peut hériter de ses attributs.

    pour être correcte tu devrais faire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        function __construct()
           {
             $this->connection();
             if ( isset($_SESSION['id']) )
               {
    ou alors si tu veux utiliser :: il faut que les méthodes porte le même nom.

    Attention même si cela fonctionne comme toi tu fais, c'est parce que PHP est permissif.

    J'espère t'avoir un peu éclairer.

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 27
    Par défaut
    Merci pour tes conseils mais j'ai une petite question,

    Si j'utilise $this->connection, est-ce que ça ne va pas me renvoyer vers la fonction connection() de la classe Membre? Or moi je veux avoir accès à la fonction connection() de la classe SQL ...

    Merci à toi ;-)

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    En quoi un objet membre dérive d'un objet SQL ?
    Y'a mon avis aucun rapport entre les deux.

    Autant tu peux faire un objet mysql qui dérive de sql mais un objet membre , ca n'a aucun sens.

    Si tu souhaite utiliser ta classe sql dans ta classe membre il est plus logique de passer ton objet sql à membre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = new Sql(.....)
    $membre = new Membres($sql)
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 27
    Par défaut
    Je ne savais pas que c'était possible ! Merci à toi pour cette information, je rectifie le code aussi vite que possible ;-) Merci encore

    Code édité, j'attends encore vos critiques ^^'

  6. #6
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Je n'avais pas vu que tu avais nommer une méthode connection dans ta classe SQL.

    Ce qui confirme ce que je te disais, il vaut mieux étendre tes méthodes.


    Si tu fais comme grunk te le conseille, il ne sert à rien alors d'étendre tes classes, meis de faire deux classes distincte.

    L'idéal serais que tu repenses tes classes en gardant le même nom des méthodes que tu veux étendre .

    ex :

    class sql

    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
     
         public function __construct() // Fonction permettant de se connecter à la BDD
           {
              $this->connection_id = @mysql_connect($this->server,$this->user,$this->password); // On définit $this->connection_id comme link de la connection
     
              if ( $this->connection_id ) // Si la connection réussi
                {
                  if ( @mysql_select_db($this->database,$this->connection_id) ) // Si la sélection de la BDD réussi
                    {
                      $this->connecte = TRUE;
                      $this->reussi = TRUE;
                    }
                  else // Sinon
                    {
                      $this->connecte = FALSE;
                      $this->reussi = FALSE;
                      $this->message_erreur = 'La base sélectionnée est inaccessible';
                      $this->erreur(); // On affiche une erreur
                    }
                }
              else // Sinon
                {
                  $this->connecte = FALSE;
                  $this->reussi = FALSE;
                  $this->message_erreur = 'Impossible de se connecter au serveur MySQL';
                  $this->erreur(); // On affiche une erreur
                }
     
              return $this->reussi; // On retourne TRUE ou FALSE
            }
    classe membre
    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
     
     
         function __construct() // Fonction __construct() s'exécutant à chaquel nouvel appel à la classe Membre (new Membre())
           {
             parent::__construct(); // Fait appel à la fonction connection() de la classe SQL (parente) pour se connecter à MySQL
     
             if ( isset($_SESSION['id']) ) // Si le membre est déjà connecté
               {
                 $sql = parent::requete("SELECT * FROM membres WHERE id='".$_SESSION['id']."'",1); // On exécute une requête (classe SQL) permettant de récupérer les infos du membre
                 $this->informations = parent::fetch(1); // On récupère ses informations
     
                 $this->id = $this->informations['id']; // On update la variable id
                 $this->pseudo = $this->informations['pseudo']; // ...
                 $this->email = $this->informations['email']; // ...
                 $this->niveau = $this->informations['niveau']; // ...
                 $this->etat = TRUE; // Le membre est connecté
               }
             else // Sinon
               {
                 $this->etat = FALSE; // Le membre n'est pas connecté
               }
           }

Discussions similaires

  1. [PHP 5.0] classe extend de class sql
    Par Shandler dans le forum Langage
    Réponses: 5
    Dernier message: 15/09/2009, 10h26
  2. class pour table + class pour td = class td non fonctionnelle ?
    Par supergrey dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 28/05/2009, 08h13
  3. [POO] class SQL en variable globale pour de la POO
    Par comode dans le forum Langage
    Réponses: 6
    Dernier message: 17/04/2009, 20h56
  4. [POO] Problème avec une classe + requêtes sql
    Par mithrendil dans le forum Langage
    Réponses: 2
    Dernier message: 30/04/2007, 08h27
  5. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34

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