Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/03/2011, 15h24   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 33
Points : 12
Points : 12
Par défaut connexion persistante (ou non) et paramètres de connexion

Bonjour,

Je récupéré les paramètres de connexion à la base de donnée de clients lors du login de ceux-ci en interrogeant une table mysql "maitresse" ou ils sont stockés sous forme cryptée. C'est à dire : j'interroge la table maitresse pour identifier le client, si son login/mdp sont bons, je récupère les DSN, USER, PWD pour se connecter à une autre base ou sont stockées les données à traiter.
Dans mon script d'identification, je ferme alors la connexion à la première base pour me connecter à la deuxième. J'essaie ainsi d'assurer un minimum de sécurité en ne faisant pas apparaître les identifiants de chaque clients en clair et en ne les inscrivant pas en session.

Ensuite j'aimerai conserver cette connexion à la base pour l'utiliser de script en script. Est-ce possible sans fournir à nouveau les paramètres de connexion du client ?

J'ai commencé avec un singleton d'une classe PDO, mais j'ai des connaissances limitées en développement objet et je me demande si cela est possible, si je ne fais pas fausse route...
berlo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 15h54   #2
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
dans apache configuré pour les processus et les processus légés, chaque execution de php est indépendante l'une de l'autre. Je veux dire que chaque appel de ressource (image, html, flux rss...) est traité de façon indépendante à chaque fois. Donc

bon maintenant les connexions persistantes. La connexion persistante est, si j'ai bien compris, une sorte de mutualisation de la session ouverte d'un script à l'autre, faite au niveau du pilote. Du coup si ton serveur est suffisement chargé tu conserveras la même connexion vers la bdd pour générer plusieurs page.

L'avantage c'est que ça permet de bien utiliser le cache et en lecture on doit s'y retrouver. Par contre en écriture, comme les requetes de tous les visiteurs vont passer par la même session (au sens oracle) ou la même connexion il est possible que la base ait plus de mal pour s'y retrouver dans de très rares cas.
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 19h30   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 33
Points : 12
Points : 12
merci pour ta réponse.

C'est surtout le fait d'établir une connexion sans fournir à nouveau les paramètres de connexion qui m’intéresse surtout. J'ai cru comprendre qu'il fallait mieux passer par une connexion persistante et un singleton PDO. Après il y a peut-être d'autre méthode, mais si ça va plus vite en lecture ça me va bien, car c'est essentiellement de la consultation que je veux faire.

Par contre, concrètement je n'arrive pas à le réaliser pour l'instant.

J'utilise la class de JM Lecarpentier

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
 
/**
 * Singleton fournissant la connexion à la base de données.
 * @author Jean-Marc Lecarpentier
 */
 
class Outils_Bd {
  /* pour être sûr qu'il n'y a qu'une et une seule instance */
  private static $instance;
 
  /* le lien de connexion BD (objet PDO) */
  protected $connexion;
 
  /* constructeur privé qui initialise la connexion*/
  private function __construct() {
    /* création d'un objet PDO avec les constantes définies dans la configuration */
    $this->connexion = new PDO(PDO_DSN, USER, PASSWD);
    /* mettre Exception comme mode d'erreur */
      $this->connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  }
 
  /* clonage impossible */
  private function __clone() {}
 
  /**
   * Accéder à l'UNIQUE instance de la classe
   */
  static public function getInstance() {
    if (! (self::$instance instanceof self)) {
      self::$instance = new self();
    }
    return self::$instance;
  }
 
  /**
   * Accesseur de la connexion
   */
  public function getConnexion() {
    return $this->connexion;
  }
}
?>
Ma grosse interrogation réside dans les constantes "(PDO_DSN, USER, PASSWD)" qui chez moi ne le sont pas justement. Comment faire pour conserver la connexion sans les donner à chaque script ?
berlo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 19h43   #4
Membre Expert
 
Inscription : septembre 2010
Messages : 1 240
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 240
Points : 1 562
Points : 1 562
Citation:
Envoyé par berlo44 Voir le message
Ma grosse interrogation réside dans les constantes "(PDO_DSN, USER, PASSWD)" qui chez moi ne le sont pas justement. Comment faire pour conserver la connexion sans les donner à chaque script ?
Tu peux utiliser le multiton, exemple:
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
 
class connect_bdd
{
        private static $instance = array();
 
        private function __construct($db_name)
        {
                require_once('fichier_des_donnees_de_connexion');
 
                // Permet de verifier que la base de donnees demandee existe
                if( !array_key_exists($db_name, $database) )
                        throw new Exception('[connect_bdd] given database name "'.$db_name.'" is not configured');
 
                mysql_select_db($database[$db_name], $connection);        
        }
 
        public static function getInstance($db_name)
        {
                // Si l'instance de connexion à la base de donnees n'existe pas, creation puis ajout à la liste des instances
                if( !array_key_exists($db_name, self::$instance) )
                {
                        self::$instance = new connect_bdd($dbname);
                }
 
                return self::$instance[$db_name];
        }        
}
 
connect_bdd::getInstance('db1');
connect_bdd::getInstance('db2');
connect_bdd::getInstance('db1');
Sinon attention avec les connexions persistantes car le fait qu'elles ne se ferment pas entre deux connexions augmente le risque de dépasser le nombre de connexions simultanées autorisées sur ton serveur.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 20h29   #5
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 33
Points : 12
Points : 12
merci je vais regarder cela, mais j'ai vraiment du mal à capter, ça patauge dur.
c'est un peu complexe pour un début en POO.

edit : dans l'exemple, il y'a un fichier des données de connexion quelque part en dur non ? on s'y réfère à chaque appel à la class ou non ?

D'autres points dont je ne suis pas sûr :
Il faut bien mettre l'objet en session ?
pour cela il faut le linéariser avec serialize(), mais comme ce n'est pas possible avec un objet pdo, il faut utiliser les fonctions magiques sleep() et wakeup() ?
j'ai bon ?
berlo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 22h49   #6
Membre Expert
 
Inscription : septembre 2010
Messages : 1 240
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 240
Points : 1 562
Points : 1 562
Citation:
Envoyé par berlo44 Voir le message
merci je vais regarder cela, mais j'ai vraiment du mal à capter, ça patauge dur.
c'est un peu complexe pour un début en POO.

edit : dans l'exemple, il y'a un fichier des données de connexion quelque part en dur non ? on s'y réfère à chaque appel à la class ou non ?
Oui (avec le require_once) ça centralise les données sensibles sur une seule page.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 08h56   #7
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 33
Points : 12
Points : 12
mince ! c'est ce que je veux éviter justement, en plus pour moi ces paramètres sont dans une table mysql comprenant les attributs de chaque membre/client.
Il n'y a donc pas moyen de faire une classe "connexion" ou la connexion est établie une fois au départ et ensuite on s'y réfère d'une façon ou d'une autre sans à avoir à donner les paramètres de connexion ?
berlo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 16h41   #8
Membre Expert
 
Inscription : septembre 2010
Messages : 1 240
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 240
Points : 1 562
Points : 1 562
Citation:
Envoyé par berlo44 Voir le message
mince ! c'est ce que je veux éviter justement, en plus pour moi ces paramètres sont dans une table mysql comprenant les attributs de chaque membre/client.
??? je vois pas très bien comment peut fonctionner ton système. Si les paramètres de connexion à la bdd sont dans une table, comment fais-tu pour te connecter à cette table pour obtenir les paramètres de connexion ?
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 19h12   #9
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 33
Points : 12
Points : 12
Il y a plusieurs bases ce n'est pas la même.

Dans la première table, si l'identification est bonne, je récupéré ("DSN","USER","PWD") pour me connecter à une autre base.
berlo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 12h10   #10
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 33
Points : 12
Points : 12
Ce n'est pas clair ce que j'ai écris ?

J'ai encore cherché, et vraiment je n'arrive pas à comprendre/savoir si on peut se référencer d'une manière ou d'une autre à un objet PDO créer au départ dans le script d'authentification sans à avoir à redonner les paramètres de connexion.

Sinon je peux faire passer ces paramètres dans les variables de session, mais ce n'est pas très sécurisant, non ?
berlo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h28.


 
 
 
 
Partenaires

Hébergement Web