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 :

Comment définir les codes d'accès à PDO ?


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2016
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2016
    Messages : 93
    Points : 95
    Points
    95
    Par défaut Comment définir les codes d'accès à PDO ?
    Bonjour,

    Comment faire pour ouvrir ses accès BD en PDO, sans devoir donner tous les paramètres de connexion dans tous les scripts ?
    Actuellement, j'accède à mes BD par PDO, puisque les fonctions mysql_* sont obsolètes.

    La connexion BD en PDO requiert trois paramètres, que je stocke dans des variables de session.
    En effet, je ne veux pas devoir les spécifier dans chaque script, chaque classe.

    Ainsi, j'ai défini un fichier login.php, qui contient les codes d'accès à ma BD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     @session_start();
     function login()
     {
      $_SESSION['playAdresse'] = 'localhost';
      $_SESSION['playSrvDbNam'] = 'maBd';
      $_SESSION['playSrvLogin'] = 'monLogin';
      $_SESSION['playSrvPassw'] = 'monMotDePasse';
     }
    ?>
    Ce script est invoqué dès la page d'entrée de mon application 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
    <?
     @session_start();
     if(!isset($_SESSION['playAdresse']))
     {
      require_once('../classes/login.php');
      login();
     }
     ?>
      <HTML>
       ... (contenu de ma page)
      </HTML>
     <?php
     ...
    ?>
    Ainsi, lorsque, dans une classe, je dois me connecter à une BD (ce que je ne fais quasi-jamais dans les scripts, qui sont de simples vues en MVC), j'invoque mes variables de session, pour créer mes PDO

    Dans mon constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->$bdd = new PDO ('mysql:host='.$_SESSION['playAdresse'].';dbname='.$_SESSION['playSrvDbNam'], $_SESSION['playSrvLogin'], $_SESSION['playSrvPassw']);
    Ensuite, je peux utiliser ma connexion $bdd, par exemple, dans une méthode de ma classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function getClients()
    {
     $codeSql = 'SELECT * FROM t_clients ORDER BY postal, nom WHERE magasin= ? ';
     $monQuery = $this->$bdd->prepare($codeSql);
     $monQuery->execute(array($this->id));
     $lesClients = $monQuery->fetchall(PDO::FETCH_ASSOC);
     $monQuery->closecursor();
     return($lesClients);
    }
    Bien que cela ne m'ait jamais posé problème, je me demande si, stocker les codes d'accès à la BD dans des variables de $_SESSION['...'] n'est pas dangereux, ou simplement risqué.
    Ne fût-ce que parce qu'elles sont stockées dans un cookie session, sur la machine du client.
    J'ai déjà regardé mon cookie session, dans Firefox, il est incompréhensible.
    Le risque me semble donc théorique.

    J'ai cherché du côté des define(), mais les define ne fonctionnent que pour le script en cours.
    Quel est le meilleur moyen de stocker, une bonne fois pour toutes, les codes d'accès à la BD, qu'on invoque dans tous les scripts de son application ?
    Dans un fichier de define() à inclure, qu'on doit ensuite inclure par un require_once('fichierLogin.php'); dans tous les scripts qui font des PDO ?
    Une constante, un global, un superglobal ?

    Merci de me donner la meilleure méthode, la plus sûre à vos yeux.
    Christian.

  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
    Déjà les données de sessions ne sont pas stockées sur le poste client ; celui-ci ne connait que l'id de la session. Les valeurs sont par défaut dans un fichier sur le serveur.

    Concernant ton problème, le plus simple est de mettre toute ta connexion dans un fichier que tu inclueras dans les pages qui en ont besoin.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre actif Avatar de bigltnt
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Points : 205
    Points
    205
    Par défaut
    Le mieux c'est d'avoir une fichier de configuration, peu importe le format (ini, yaml, php, ...) placé en dehors du répertoire web (pour qu'il ne soit pas accessible par un visiteur/robot. Par exemple "www/../resources/config.ini"). Ma recommandation ici serait le format ini car simple :

    /resources/config.ini :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    host=127.0.0.1
    dbname= maBd
    login= monLogin
    password= monMotDePasse
    Le code php pour le lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    // Constante pour définir le chemin vers le fichier de configuration
    define('CONFIG_FILE_PATH', __DIR__ . '/../resources/config.ini');
     
    // On utilise la fonction parse_ini_file pour récupérer la configuration dans un array php 
    $conf = parse_ini_file(CONFIG_FILE_PATH, false); 
     
    // On formate le dsn que l'on utilise pour construire la connection à la base de données
    $dsn = sprintf('mysql:host=%s;dbname=%s', $conf['host'], $conf['dbname']);
    $pdo = new \PDO($dsn, $conf['login'], $conf['password']);
    Ce code n'a pas été testé donc il peut y avoir quelques erreurs

  4. #4
    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
    Pour le même prix tu peux avoir tout en PHP et dans un seul fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $conf['host']='localhost';
    etc.
    $pdo = new PDO('mysql:host=' . $conf['host'] . ';dname=' . $conf['dbname'], $conf['login'], $conf['password']);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Moi j'ai d'une part un fichier de conf qui remplit des constantes selon le cas poste du développeur, serveur de développement et de test, serveur de prod et une classe de connexion à la BDD. Mes classes modèles étendent la classe de BDD ce qui me permet de récupérer l'id de la connexion.

    Extrait du fichier constantes.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
    include_once $_SERVER['DOCUMENT_ROOT'].'/pef/application/conf/config_locale.php';
     
    // Base MySQL pour l'application
    if (MODE_APPLI == 'prod')
    {
    	define('SERVEUR_MYSQL', 'srv_sql_prod.mon_domaine.fr'); // La BDD est séparée de l'application PHP en prod
    }
    else
    {
    	define('SERVEUR_MYSQL', 'localhost');
    }
     
    define('BDD_MYSQL', 'la_bdd');
    define('USER_MYSQL', 'le_user_mysql_de_l_appli'); 
    define('PWD_MYSQL', 'son_mot_de_passe');
    Extrait du fichier config_locale.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    define('MODE_APPLI', 'test_pl');
    Classe bddMysql.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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    class bddMysql
    {
    	private 
    		$Serveur, // Nom de la machine sur laquelle est située la base de données utilisée
    		$Bdd, // Nom de la base de données utilisée
    		$UserMysql, // Nom de l'utilisateur MySQL pour se connecter à la base de données
    		$Mdp, // Mot de passe de l'utilisateur MySQL
    		$Options, // Options à passer lors de la connexion à la base de données
    		$Result; // Résultat d'une requête
     
    	protected 
    		$Connexion; // Objet de connexion à la BDD
     
     
    	/** __construct
    	 * @abstract : Constructeur de la classe - initialise les paramètres
    	 * 
    	 */
    	public function __construct()
    	{
    		$this->Serveur = SERVEUR_MYSQL;
    		$this->Bdd = BDD_MYSQL;
    		$this->UserMysql = USER_MYSQL;
    		$this->Mdp = PWD_MYSQL;
     
    		// Options de connexion à activer par défaut
    		$this->Options = array(
    				PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,// Activation des exceptions PDO
    				PDO::ATTR_DEFAULT_FETCH_MODE 	=> PDO::FETCH_OBJ,// Change le fetch mode par défaut sur FETCH_OBJ ( fetch() retournera un objet simple )
    				PDO::MYSQL_ATTR_INIT_COMMAND    => "SET NAMES utf8" // MySQL au format utf8 
    		);
     
    		$dsn = 'mysql:host='.$this->Serveur.';dbname='.$this->Bdd; // Chaîne de connexion à la BDD
    		$errMsg = ''; // Message d'erreur de connexion éventuel
     
    		// Connexion à la BDD
    		try
    		{
    			$this->Connexion = new PDO($dsn, $this->UserMysql, $this->Mdp, $this->Options);
    		}
    		catch (PDOException $e)
    		{
    			$errMsg = 'Impossible de se connecter à la base de données !<br />';
    			$errMsg.= 'ERREUR PDO dans '.$e->getFile(). ' L.'.$e->getLine().' : '.$e->getMessage();
    			return $errMsg;
    		}
    	}
    }
    Exemple d'extrait d'une classe modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class utilisateur extends bddMysql
    {
     
    public function getUserByLogin($login)
    {
     // ...
    		try 
    		{
    			$prep = $this->Connexion->prepare($sql); // Connexion vient de bddMysql
    			$prep->bindValue(':login', $login, PDO::PARAM_STR);
    			$prep->execute();
     
    			$result = $prep->fetch();
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Citation Envoyé par CinePhil Voir le message
    Mes classes modèles étendent la classe de BDD ce qui me permet de récupérer l'id de la connexion.
    Ouch, ouch : l'héritage fonctionnel est une des pire chose en POO ^^

    En faisant ainsi tu perds ce qui fait la force de la POO, la notion de concept.
    Quand je vois class utilisateur extends bddMysql, ça pique.
    Tu es en train de dire que ton concept Utilisateur est une base de données alors que conceptuellement ce n'est pas du tout le cas.
    Je t'invite à lire le Principe de substitution de Liskov qui est un pilier de la modélisation objet.

  7. #7
    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
    Citation Envoyé par rawsrc Voir le message
    Quand je vois class utilisateur extends bddMysql, ça pique.
    Tu es en train de dire que ton concept Utilisateur est une base de données alors que conceptuellement ce n'est pas du tout le cas.
    Métaphoriquement, ça revient à écrire SalleDeBain extends Maison : une salle de bain n'a pas de propriétaire propre, pas d'adresse et pas de code d'entrée, même si les deux ont une porte d'entrée.

    Le fonctionnement classique serait d'avoir une classe Bdd avec une propriété connexion. Et pour les entités/tables, séparer la classe qui représente la table et la récupération en base.
    Si tu as une table utilisateur, tu vas avoir une classe Utilisateur avec des propriétés nom, prénom,... Mais la classe Utilisateur ne fait la récupération d'une liste d'Utilisateurs en base.
    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]

Discussions similaires

  1. Comment définir les droits d'accès d'un utilisateur ?
    Par Klemsy78 dans le forum Langage
    Réponses: 17
    Dernier message: 12/07/2015, 22h12
  2. Comment gérer les codes postaux sous access?
    Par Jac_S_69 dans le forum Access
    Réponses: 3
    Dernier message: 01/12/2005, 21h38
  3. Comment dééfinir les valeurs des abscisses en Time ?
    Par marsupilami34 dans le forum Langage
    Réponses: 1
    Dernier message: 29/09/2005, 15h50
  4. [TChart] Comment définir les marges d'un graphe ?
    Par marsupilami34 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 01/08/2005, 16h48

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