Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Nouveau Membre du Club
    Inscrit en
    novembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : novembre 2006
    Messages : 72
    Points : 30
    Points
    30

    Par défaut et connexion à une base de données dans une fonction

    Bonjour,
    Je me suis intéressé que très récemment à la PDO et je me retrouve devant une interrogation qui, malgré mes recherches, m'apparait encore assez obscure.

    J'utilise par exemple une page qui va contenir ceci (en gros) :

    Code :
    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
    <?php
     
    class SymptomeDAO 
    	{
     
        /**
         * Retourne la liste des symptomes
         * @return
         */
        function getListeSymptomes() {     
    			try
    			{
    			$bdd = new PDO('mysql:host=localhost;dbname=xxx', 'root', 'xxx');
    			$bdd->exec('SET NAMES utf8');
    			}
    			catch (Exception $e)
    			{
            	die('Erreur : ' . $e->getMessage());
    			}
     
                $q = ...requete puis suite de la méthode;
     
     
        /**
         * Retourne un symptome à partir de son code
         * @param code
         * @return
         */
     public function getSymptomeParCode($code) {        
                try
    			{
    			$bdd = new PDO('mysql:host=localhost;dbname=xxx', 'root', 'xxx');
    			$bdd->exec('SET NAMES utf8');
    			}
    			catch (Exception $e)
    			{
            	die('Erreur : ' . $e->getMessage());
    			}
     
    			$q = requete puis suite méthode;
     
     
    }
    ?>
    J'ai 2 questions dans mon exemple : la première est de savoir si la déclaration de l'attribut avant la méthode est obligatoire/vital/facultatif... J'ai lu un peu tout et n'importe quoi et surtout, des choses qui se contredisent.
    Alors plutôt en :
    Code :
    public function getSymptomeParCode($code) {
    ou simplement :
    Code :
    function getSymptomeParCode($code) {
    suffit.
    Merci d'éclairer ma lanterne.

    Et mon gros point noir vient dans l'accès à la DB en elle-même. Je trouve "très moche" de déclarer, pour chaque méthode de la class, les paramètres de connexion.
    N'existe-t-il donc pas, un genre de "super variable" qui pourrait contenir ceci :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try
                {
                $bdd = new PDO('mysql:host=localhost;dbname=name_DB', 'root', 'password');
                $bdd->exec('SET NAMES utf8');
                }
                catch (Exception $e)
                {
                die('Erreur : ' . $e->getMessage());
                }
    et que je rappellerais à chaque fois. Ce serait beaucoup plus propre et permettrait de ne pas avoir "x" modifications à effectuer en cas de changement des paramètres de la DB.

    Alors excusez moi par avance si ces questions vous semblent un peu idiotes mais en ce moment, elles retardent un peu l'avancée de mon projet car je n'ose trop poursuivre en restant dans le noir.

    Merci de votre aide donc

  2. #2
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2012
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2012
    Messages : 765
    Points : 1 375
    Points
    1 375

    Par défaut

    Bonjour,

    Bonne lecture ( lis les commentaire ! ) :
    Code :
    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
    <?php
     
    class SymptomeDAO{
    	/* Ici on déclare les attributs en private (privé) il ne sont alors accéssible qu'à l'interieur de la classe,
    	 * Si tu essaye d'y accéder par exemple par $test->bdd qui est l'objet déclaré en dehors de la classe tu aura une violation de droits sur ta classe,
    	 * les attributs sont toujours déclarés en private,c'est le principe de de l'encapsulation,
    	 * tes fonctions sont généralement déclarer public pour pouvoir y accéder en dehors de la classe, comme dans l'exemple, mais il est possible que tu ne donne pas accès à des fonction qui ne seront alors "appelable" que par les fonction de ta classe elles seront alors déclarées en private,
    	 * $test->getSymptomeParCode(); qui te permet de lancer une requête,
    	 * pour cet objet tu a donc un attribut bdd qui sera réutilisé à chaque fois sans avoir besoin de te reconnecter,
    	 * un attribut requête qui récupère le résultat de l'appel de la fonction prepare() de $bdd,
    	 * et l'attribut resultat qui permet de traiter ce résultat obtenu avec la requête,
    	 * la fonction __construct est OBLIGATOIRE elle sert a initialiser tes attributs à l'instanciation de ton objet,
    	 * elle te permet de donner une valeur de départ à tes variables, dans l'exemple je leur donne la valeur vide pour les chaines de caractère,
    	 * et me connecte à mysql pour l'attribut $bdd, tu pourrait très bien lui donner la valeur vide et créer une fonction de connexion à la BDD qui reçoit l'adresse du serveur et autres paramètres,
    	 * ou alors donner au constructeur des paramètres comme une fonction normal et quand tu instanciera un objet tu envoi les paramètres au constructeur :
    	 * $test = new SymptomeDAO('localhost', 'test', 'user', 'pwd');
    	 * et dans ton constructeur :
    	 * public function __construct($host, $dbName, $user, $mdp){
    	 *     $this->bdd = new PDO('mysql:host=' . $host . ';dbname=' . $dbName, $user, $mdp);
    	 * }
    	 * La dernière chose importante dans ta class tu est obliger d'utiliser $this->nomAttribut pour utiliser les attributs local à ta classe,
    	 * pour la POO je te renvoi au excelent cours disponible sur le site pour en apprendre plus !
    	 */
    	private $bdd, $resultat, $requete;
     
    	public function __construct(){
    		try
    		{
    			$this->bdd = new PDO('mysql:host=localhost;dbname=inforacle', 'inforacle', 'inforacle');
    		}
    		catch (Exception $e)
    		{
           		die('Erreur : ' . $e->getMessage());
    		}
     
    		$this->resultat = "";
    		$this->requete = "";
    	}
     
    	public function getSymptomeParCode($code){
     
    		$this->requete = $this->bdd->prepare($code);
    		$this->requete->execute();
     
    		while( $this->resultat = $this->requete->fetch() ){
    			echo $this->resultat['nomCompte'];
    		}
    	}
    }
     
    	$test = new SymptomeDAO();
     
    	$test->getSymptomeParCode('SELECT * from utilisateurs');
     
    ?>
    fait attention ce code est minime, de plus si tu instancie 30 objets tu aura 30 connections à mysql différentes, donc le mieux serait de déclarer en dehors de ta classe un objet $connection qui serait un objet PDO connecté à ta BDD puis de l'envoyer au contructeur de ta class SymptomeDAO qui initialisera ton attribut
    Code :
    $this->bdd = $connection;
    tandis que $connection est la connection à la BDD déclarée en DEHORS de ta classe, donc tu aura une connections à la BDD que tu donnera à chaque objet que tu instanciera.

  3. #3
    Nouveau Membre du Club
    Inscrit en
    novembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : novembre 2006
    Messages : 72
    Points : 30
    Points
    30

    Par défaut

    Merci beaucoup pour le temps que tu as passé à regarder mon problème.
    Je vais donc lire tout cela et je pense pouvoir m'en sortir. Ma lecture rapide en diagonale m'a déjà donné des pistes sur mes erreurs.
    Merci à toi

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •