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 :

[PDO] classe de connexion et d'execution


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut [PDO] classe de connexion et d'execution
    Bonjour, j'ai codé la classe suivante me permettant via PDO de me connecter et d'exécuter des requetes MySQL (transactions) :

    Code php : 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
    56
    57
    58
    59
    60
    61
     
    define('SERVER', 'localhost');
    define('BASE', 'palmares');
    define('USER', 'root');
    define('PWD', '');
     
    class Test extends PDO{
     
    	private static $_connexion;
    	private static $_tabRequete = array();
     
    	public static function getInstance(){
     
    		if(!isset(self::$_connexion)){
    			try{
    				self::$_connexion = new PDO('mysql:host='.SERVER.';dbname='.BASE, USER, PWD);
    			}catch(PDOEception $e){
    				die($e);
    			}
    		}
     
    		return self::$_connexion;
     
    	}
     
    	public static function addRequete($requete){
     
    		self::$_tabRequete[] = $requete;
     
    	}
     
    	public static function doRequetes(){
     
    		if(empty(self::$_tabRequete))
    			return null;
     
    		self::$_connexion->beginTransaction();
     
    		foreach(self::$_tabRequete as $requete)
    			if(self::$_connexion->exec($requete) === false){
    				self::$_connexion->rollBack();
    				self::$_tabRequete = array();
    				return null;
    			}
     
    		self::$_connexion->commit();
    		self::$_tabRequete = array();
     
    	}
     
    }
     
    // --- on crée une instance de connexion
    TEST::getInstance();
     
    // --- on ajoute des requetes de type exec seulement
    TEST::addRequete('UPDATE cotations SET variation=9 WHERE cotation_id=125905');
    TEST::addRequete('UPDATE cotations SET variation=11 WHERE cotation_id=125905');
     
    // --- On execute les requetes
    TEST::doRequetes();

    Comme je n'ai jamais vraiment codé de cette manière via des variables statiques, je demande de l'aide, astuces pour améliorer mon code si vous en voyez. Déjà : est ce indiqué de créer une connexion et de lancer des requetes de cette manière sans instancier d'objet de classe ? Ps: je précise que je n'ai pas traité encore la gestion des erreurs donc pas taper

    Merci

  2. #2
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Bonjour, j'ai modifié ma fonction doRequetes de la sorte :

    Code php : 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
     
    public static function doRequetes(){
     
    		if(empty(self::$_tabRequete))
    			return null;
     
    		self::$_connexion->beginTransaction();
     
    		foreach(self::$_tabRequete as $requete)
    			if(($statement = self::$_connexion->prepare($requete)) === false){
    				self::$_connexion->rollBack();
    				self::$_tabRequete = array();
    				return null;
    			}else{
    				$statement->execute();
    			}
     
    		self::$_connexion->commit();
    		self::$_tabRequete = array();
     
    	}

    Je souhaite effectuer mes requetes par prepare/execute mais je n'arrive pas à effectuer de transactions avec prepare. Est ce possible (je ne pense pas...) ? Une bidouille pour le faire peut etre...?

    Mon but est de sécuriser un maximum mes requetes, car la methode quote() ne me semble pas vraiment sécuritaire

    Si vous utilisez cette fonction pour construire des requêtes SQL, vous êtes vivement invités à utiliser PDO::prepare() pour préparer les requêtes SQL avec des paramètres liés au lieu d'utiliser PDO::quote() pour interpréter les entrées utilisateur dans la requête SQL. Les requêtes préparées avec des paramètres liés sont non seulement plus portables, plus souples et plus sécuritaires, mais bien plus rapides à exécuter que d'interpréter les requêtes, étant donné que les côtés client et serveur peuvent mettre en cache une version compilée de la requête.

    Merci de vos conseils

Discussions similaires

  1. Class de connexion PDO
    Par steven79 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/08/2011, 16h06
  2. [PDO] classe de connexion PDO
    Par Kihmé Xs dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 29/04/2010, 23h03
  3. [MySQL] Classe database + connexion multiple + principe mal compris
    Par Rodrigue dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/08/2006, 14h06
  4. Petit souci JSP et class de connexion a BdD
    Par LeXo dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 07/06/2006, 00h57
  5. Realiser une connexion mysql et execute une requete
    Par Taz_8626 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/05/2006, 10h52

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