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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2016
    Messages
    95
    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 : 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
    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 confirmé Avatar de bigltnt
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    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
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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.

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