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

PHP & Base de données Discussion :

et connexion à une base de données dans une fonction [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 72
    Points : 57
    Points
    57
    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 : 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
    <?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 : Sélectionner tout - Visualiser dans une fenêtre à part
    public function getSymptomeParCode($code) {
    ou simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    Bonne lecture ( lis les commentaire ! ) :
    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
    <?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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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.
    une réponse vous a permis d'avancer ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 72
    Points : 57
    Points
    57
    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.

Discussions similaires

  1. [MySQL] Remplacer une chaîne de caractères dans une base de données
    Par Furius dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 27/11/2013, 21h06
  2. [PHP 5.2] POO et connexion à une base de données dans une fonction
    Par tolwin dans le forum Langage
    Réponses: 5
    Dernier message: 09/11/2012, 11h39
  3. inserer les données d'une base de données dans une autres?
    Par enstein8 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 14/10/2011, 13h33
  4. Réponses: 1
    Dernier message: 07/04/2010, 23h50
  5. ouvrir la connexion dans une base de données d'une maniére asynchrone
    Par ouadie99 dans le forum Accès aux données
    Réponses: 3
    Dernier message: 18/03/2008, 14h03

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