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

Langage PHP Discussion :

[POO] POO pour une classe PDO


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 211
    Points : 196
    Points
    196
    Par défaut [POO] POO pour une classe PDO
    Bonsoir,

    J'ai créé une classe - ma premiere! - pour gérer les connections a la BD.
    N'arrivant toujours pas a intégrer le concept de la POO malgre tous les tutoriels suivis, je crois que ce que j'ai fait n'est pas top. Est-ce que quelqu'un pourrait jeter un oeil et me dire si cela ne devrait pas etre redisposé ? (2 classes au lieu d'une par ex...)

    Merci

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    class bbno_pdo
    {
    private $user;
    private $pass;
    private $db;
    private $host;
    private $db_sys;
    private $to;
    private $connection;
    private $req;
    public function __construct($bbn=1)
    	{
    		if ( $bbn = 1 )
    			{
    				$this->user = 'user';
    				$this->pass = 'pass';
    				$this->db = 'db';
    				$this->host = 'localhost';
    				$this->db_sys = 'mysql';
    			}
    		else
    			{
    				$this->user = $_SESSION['bbn_site']['bbn_db_login'];
    				$this->pass = $_SESSION['bbn_site']['bbn_db_pass'];
    				$this->db = $_SESSION['bbn_site']['bbn_db'];
    				$this->host = $_SESSION['bbn_site']['bbn_db_host'];
    				$this->db_sys = $_SESSION['bbn_site']['bbn_db_sys'];
    			}
    		$this->to = "me@me.com";
    	}
    public function bbnf_db_connect()
    	{
    		try
    			{	$this->connection = new PDO($this->db_sys.':host='.$this->host.';dbname='.$this->db, $this->user, $this->pass ); }
    		catch (PDOException $e)
    			{ $this->bbnf_db_error($e); }
    	}
    public function bbnf_db_error($err) // This function sends an email in case of error
    	{
    		$msg = $err->getMessage();
    		if ( method_exists($err,'errorInfo') )
    			{
    				$info = $err->errorInfo();
    				$msg .= '<br /><br />Unified error code: '.$info[0];
    				$msg .= '<br /><br />Driver specific error code: '.$info[1];
    				$msg .= '<br /><br />Driver specific error string: '.$info[2];
    			}
    		if ( $_SERVER["SERVER_PORT"] != '1975' )
    			{
    				$headers .= "From: BaBna <babna@babna.com>\nBcc: babna@babna.com\nMIME-Version: 1.0\ncontent-type: text/html; charset=utf-8\n";
    				$message = "<html><head><title>PDO Error</title></head><body style=\"color:#FFFFFF; font-family:Verdana, Arial, Helvetica, sans-serif;font-size:13px; background-color:#4f5967\">".$msg."</body></html>\r\n";
    				mail($this->to,'PDO Error',$message,$headers);
    			}
    		else
    			{ echo $msg; }
    		echo $msg;
    		die();
    	}
    public function bbnf_db_query($sql) // This function prepares a query with PDO::Prepare and PDO::bindParam
    	{
    		$args = func_get_args();
    		$i = 1;
    		$this->req = $this->connection->prepare($sql);
    		$value = array();
    		$type = array();
    		while ( $i < count($args) )
    			{
    				if ( is_array($args[$i]) )
    					{
    						$value = $args[$i][0];
    						$type = $args[$i][1];
    					}
    				else
    					{
    						$value = $args[$i];
    						$type = 's';
    					}
    				if ( $type == 'i' )
    					{ $type = PDO::PARAM_INT; }
    				else
    					{ $type = PDO::PARAM_STR; }
    				$this->req->bindParam($i,$value,$type);
    				$i++;
    			}
    		return $this->req;
    	}
    public function bbnf_db_recset() //This function executes a query and returns its result
    	{
    		try
    			{	$this->req->execute(); }
    		catch (PDOException $e)
    			{ $this->req->bbnf_db_error($e); }
    	}
    public function bbnf_db_exec() //This function executes a query or a transaction and returns the affected rows
    	{
    		$args = func_get_args();
    		// If there are more than one arguments, it is a transaction
    		if ( count($args) > 1 )
    			{
    				$transaction_ok = 1;
    				$affected_rows = 0;
    				$this->connection->beginTransaction();
    				for ( $i = 0; $i < count($args); $i++ )
    					{
    						try
    							{	$affected_rows += $args[$i]->exec(); }
    						catch (PDOException $e)
    							{
    								$transaction_ok = 0;
    								bbnf_db_error($e);
    							}
    					}
    				if ( $transaction_ok == 1 )
    					{ $this->connection->commit(); }
    				else
    					{ $this->connection->rollBack(); }
     
    			}
    		else
    			{
    				try
    					{	$affected_rows = $args[0]->exec(); }
    				catch (PDOException $e)
    					{ $this->bbnf_db_error($e); }
    			}
    		return $affected_rows;
    	}
    }
    J'ai fait une petite fonction pour tester, et ca a l'air de fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    include_once('classes/db.php');
    $db = new bbno_pdo();
    $db->bbnf_db_connect();
    $id = array('1','i');
    $req1 = $db->bbnf_db_query('SELECT * FROM bbn_users ORDER BY bbn_login');
    $db->bbnf_db_recset();
    $req2 = $db->bbnf_db_query('SELECT * FROM bbn_accounts ORDER BY bbn_societe');
    $db->bbnf_db_recset();
    while ( $res2 = $req2->fetch() )
    	{ echo $res2['bbn_societe'].'<br />'; }
    echo '<br /><br />';
    while ( $res1 = $req1->fetch() )
    	{ echo $res1['bbn_login'].'<br />'; }

  2. #2
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut une autre classe
    Voilà le type de classe que je ferais:

    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
    <?php
    class ClassDefine {
    	// Définitions des variables de classe
    	private $_server = 'localhost';	// Serveur SQL
    	private $_user = 'user';		// Utilisateur SQL
    	private $_password = 'xxxxxx';	// Password SQL
    	private $_dbname = 'test';		// Nom de la BDD SQL
    	private $_tablename = null;  // Pour la table SQL
     
    	// Définitions des tables MySQL
    	private $_prefix0 = '';		// préfixe des tables MySQL
     
    	/** Définition des méthodes, et méthodes magiques **/
     
    	// Constructeur
    	public function __construct(){}
     
    	// Destructeur
    	public function __destruct(){}
     
    	public function getSQLServer(){
    		return $this->_server;
    	}
     
    	public function getSQLUser(){
    		return $this->_user;
    	}
     
    	public function getSQLPassword(){
    		return $this->_password;
    	}
     
    	public function getSQLDatabase(){
    		return $this->_dbname;
    	}
     
    	public function getSQLTable($tablename){
    		return $this->_tablename = $tablename;
    	}
     
    }

    et que j'appelle comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    require_once('ClassDB.php');
     
    $host = $D->getSQLServer();
    $dbname = $D->getSQLDatabase();
    $user = $D->getSQLUserL();
    $pass = $D->getSQLPassword();
     
    $link = new pdo("mysql:host=$host;$dbname=$dbname", $user, $pass);
     
    /* Instructions */
    ?>
    En ce moment, n'étant pas sur mon ordi, il faut tester si le code est bon, mais ce doit être à peu près ça.
    Business, Stratégie, Leadership
    Toujours à l'écoute du marché : Surtout en Suisse ! ;-)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 211
    Points : 196
    Points
    196
    Par défaut
    Merci de ta réponse mais c'est un peu ce que j'essaie d'eviter:
    Soit je me connecte a une base MySQL fixe dont les infos sont privates dans la fonction, soit on utilise d'autres identifiants qui sont stockes dans la session.
    Dans ton exemple, il me faut 5 lignes de code pour creer la connection quand je cherche a n'en avoir qu'une.
    Mon probleme est surtout de savoir si je devrais avoir une classe pour la connection et une autre (ou une sous-classe) pour la requete, et si la gestion d'erreur de la classe de connection peut etre utilisee aussi pour les requetes.

Discussions similaires

  1. [POO] Equivalent de getElementById mais pour une class ?
    Par boutmos dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 29/04/2008, 10h19
  2. [POO] Utilisation d'une classe pdo perso
    Par artotal dans le forum Langage
    Réponses: 11
    Dernier message: 05/04/2008, 03h47
  3. [POO] Plugins pour une classe ?
    Par PseudoCoder dans le forum Langage
    Réponses: 6
    Dernier message: 05/10/2006, 12h03
  4. Réponses: 19
    Dernier message: 02/02/2006, 23h30
  5. Réponses: 3
    Dernier message: 02/12/2005, 15h58

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