Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
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 07/08/2007, 22h13   #1
Membre actif
 
Inscription : octobre 2003
Messages : 211
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 211
Points : 153
Points : 153
Envoyer un message via MSN à nabab
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 :
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 :
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 />'; }
nabab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2007, 23h05   #2
Membre chevronné
 
David DRAPEAU
Consultant OpenERP
Inscription : juin 2003
Messages : 807
Détails du profil
Informations personnelles :
Nom : David DRAPEAU

Informations professionnelles :
Activité : Consultant OpenERP

Informations forums :
Inscription : juin 2003
Messages : 807
Points : 728
Points : 728
Envoyer un message via MSN à zyongh Envoyer un message via Skype™ à zyongh
Par défaut une autre classe

Voilà le type de classe que je ferais:

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
<?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 :
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.
zyongh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2007, 23h58   #3
Membre actif
 
Inscription : octobre 2003
Messages : 211
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 211
Points : 153
Points : 153
Envoyer un message via MSN à nabab
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.
nabab 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 08h55.


 
 
 
 
Partenaires

Hébergement Web