Subversion Repositories Applications.gtt

Rev

Rev 89 | Rev 95 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
10 jpm 1
<?php
2
 
3
abstract class aGttSql {
14 jpm 4
 
10 jpm 5
	/*** Attributs : */
6
	private $base_de_donnees = GTT_BDD_NOM;
7
	protected $table_nom;
8
	protected $correspondance;
14 jpm 9
 
10 jpm 10
	/*** Accesseurs : */
14 jpm 11
 
10 jpm 12
	// Base De Donnees
13
	function getBaseDeDonnees()
14
	{
15
		return $this->base_de_donnees;
16
	}
17
	function setBaseDeDonnees($bdd)
18
	{
19
		$this->base_de_donnees = $bdd;
20
	}
21
	// TableNom
22
	function getTableNom()
23
	{
24
		return $this->dao_table_nom;
25
	}
26
	function setTableNom($tn)
27
	{
28
		$this->dao_table_nom = $tn;
29
	}
30
	// Correspondance
48 jpm 31
	function getCorrespondance($champ = null)
10 jpm 32
	{
48 jpm 33
		if (!is_null($champ)) {
34
			return $this->dao_correspondance[$champ];
35
		}
10 jpm 36
		return $this->dao_correspondance;
37
	}
38
	function setCorrespondance($c)
39
	{
40
		$this->dao_correspondance = $c;
41
	}
14 jpm 42
 
10 jpm 43
	/*** Méthodes : */
14 jpm 44
 
10 jpm 45
    /** Instancie un objet utilisateur à partir d'un enregistrement issu de la base de donnée ou l'inverse.
46
	* Cette métohode permet de s'abstraire des noms des champs présent dans la base de donnée.
47
	*/
48
	protected function basculerEnregistrementObjet($donnees, $instancier = false)
14 jpm 49
	{
10 jpm 50
		$classe = get_class($this);
51
		if (is_array($donnees)) {
52
			if ($instancier) {
53
				foreach ($this->getCorrespondance() as $champ => $attribut) {
54
					if (isset($donnees[$champ]) && !is_null($donnees[$champ])) {
48 jpm 55
						$methode = $this->donnerMethodeSetAvecAttribut($attribut);
10 jpm 56
						$this->$methode($donnees[$champ]);
57
					}
58
				}
59
			} else {
60
				$Objet = new $classe;
61
				foreach ($this->getCorrespondance() as $champ => $attribut) {
62
					if (isset($donnees[$champ]) && !is_null($donnees[$champ])) {
48 jpm 63
						$methode = $this->donnerMethodeSetAvecAttribut($attribut);
10 jpm 64
						$Objet->$methode($donnees[$champ]);
65
					}
66
				}
67
				return $Objet;
68
			}
69
		} else if ($donnees instanceof $classe) {
70
			$enregistrement = array();
71
			foreach ($this->getCorrespondance() as $champ => $attribut) {
48 jpm 72
				$methode = $this->donnerMethodeGetAvecAttribut($attribut);
10 jpm 73
				if (method_exists($donnees, $methode)) {
14 jpm 74
					if (!is_null($donnees->$methode())) {
10 jpm 75
				 		$enregistrement[$champ] = $donnees->$methode();
76
					}
77
				}
78
			}
79
			return $enregistrement;
80
		}
81
	}
48 jpm 82
	private function donnerMethodeGetAvecAttribut($attribut)
83
	{
84
		return 'get'.str_replace(' ', '', ucwords(str_replace('_', ' ', $attribut)));
85
	}
86
	private function donnerMethodeGetAvecChamp($champ)
87
	{
88
		return 'get'.str_replace(' ', '', ucwords(str_replace('_', ' ', $this->getCorrespondance($champ))));
89
	}
90
	private function donnerMethodeSetAvecAttribut($attribut)
91
	{
92
		return 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $attribut)));
93
	}
94
	private function donnerMethodeSetAvecChamp($champ)
95
	{
96
		return 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $this->getCorrespondance($champ))));
97
	}
14 jpm 98
 
10 jpm 99
	/**
75 jpm 100
	* Consulter un ou plusieurs enregistrements dans la base de données.
101
	* Chaque requête comportant des paramêtre doivent les inclures sous la forme "#0" pour le paramêtre 0,
102
	* puis "#1" pour le paramêtre 1 et ainsi de suite.
103
	* Exemple : SELECT * FROM gestion_projet WHERE gp_id_projet = #0
104
	* ou		SELECT * FROM gestion_projet WHERE gp_nom_projet = "#0"
105
	* @return mixed false, un objet, un tableau d'objet ou rien et instancie l'objet courant.
106
	*/
107
	public function consulter($requete, $parametres = null, $instancier = false)
108
	{
109
		// Formatage de la requête avec les paramêtres s'il y en a
110
		if (!is_null($parametres)) {
111
			if (!is_array($parametres)) {
112
				$parametres = array('#0' => $parametres);
113
			} else {
114
				// Ajout d'un # devant chaque clé numérique
115
				if (count($parametres) > 0) {
116
					foreach ($parametres as $c => $v) {
117
						$parametres['#'.$c] = $v;
118
					}
119
				}
120
			}
121
			// Remplacement dans la requete par les valeurs des paramêtres
122
			$requete = strtr($requete, $parametres);
123
		}
89 jpm 124
		if (GTT_DEBOGAGE) {
125
			trigger_error($requete, E_USER_NOTICE);
126
		}
75 jpm 127
		$resultat = $GLOBALS['db']->query($requete);
128
		(DB::isError($resultat)) ? trigger_error(GestionnaireErreur::retournerErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete), E_USER_ERROR) : '' ;
129
		$tab_resultat = array();
130
		while ($donnees =& $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {
131
			$tab_resultat[] = $this->basculerEnregistrementObjet($donnees, $instancier);
132
		}
133
		$resultat_nbre = count($tab_resultat);
134
		if ($resultat_nbre > 1) {
135
			return $tab_resultat;
136
		} else if ($resultat_nbre == 1) {
137
			return $tab_resultat[0];
138
		} else if ($resultat_nbre == 0) {
139
			return false;
140
		}
141
	}
142
 
143
	/**
10 jpm 144
	* Ajouter un enregistrement dans la base de données.
145
	* @return true si ok, false si aucun enregistrement effectué
146
	*/
147
	public function ajouter()
148
	{
149
		$enregistrement = $this->basculerEnregistrementObjet($this);
150
		$sql_attributs = '';
151
		$sql_valeurs = '';
152
		foreach($enregistrement as $champ => $val) {
14 jpm 153
			if (!is_numeric($val)) {
154
				$val = '"'.$val.'"';
155
			}
10 jpm 156
			$sql_attributs .= $champ.', ';
157
			$sql_valeurs .= $val.', ';
158
		}
159
		$sql_attributs = trim($sql_attributs, ', ');
160
		$sql_valeurs = trim($sql_valeurs, ', ');
161
		$requete = 	'INSERT INTO '.$this->getBaseDeDonnees().'.'.$this->getTableNom().' '.
162
					'( '.$sql_attributs.' ) '.
163
					'VALUES '.
164
					'( '.$sql_valeurs.' )';
14 jpm 165
		trigger_error($requete, E_USER_NOTICE);
10 jpm 166
		$resultat = $GLOBALS['db']->query($requete);
14 jpm 167
 
10 jpm 168
		(DB::isError($resultat)) ? die (GestionnaireErreur::retournerErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '' ;
169
		$nbre_enregistrement_ajoute = $GLOBALS['db']->affectedRows();
170
		if ($nbre_enregistrement_ajoute == 1) {
171
			return true;
172
		} elseif ($nbre_enregistrement_ajoute == 0) {
173
			return false;
174
		}
175
	}
14 jpm 176
 
10 jpm 177
	/**
178
	* Modifier un enregistrement dans la base de données.
48 jpm 179
	* @param object l'ancien objet contenant les valeurs de clés primaires non modifiées. Laissé vide si on ne modifie pas les clés.
180
	* @return true si ok, false si aucun enregistrement effectué.
10 jpm 181
	*/
48 jpm 182
	public function modifier($Ancien = null)
10 jpm 183
	{
184
		$enregistrement = $this->basculerEnregistrementObjet($this);
185
		$sql_where = '';
186
		$sql_set = '';
187
		foreach($enregistrement as $champ => $val) {
14 jpm 188
			if (!is_numeric($val)) {
189
				$val = '"'.$val.'"';
190
			}
48 jpm 191
			$sql_set .= $champ.' = '.$val.', ';
192
			$classe = get_class($this);
193
			if ($Ancien instanceof $classe) {
194
				$methode = $this->donnerMethodeGetAvecChamp($champ);
195
				$val = $Ancien->$methode();
196
				if (!is_numeric($val)) {
197
					$val = '"'.$val.'"';
198
				}
199
			}
10 jpm 200
			if (preg_match('/_id_/', $champ)) {
201
				$sql_where .= $champ.' = '.$val.' AND ';
202
			}
203
		}
204
		$sql_set = trim($sql_set, ', ').' ';
205
		$sql_where = trim($sql_where, ' AND ').' ';
206
		$requete = 	'UPDATE '.$this->getBaseDeDonnees().'.'.$this->getTableNom().' SET '.$sql_set.'WHERE '.$sql_where;
14 jpm 207
		trigger_error($requete, E_USER_NOTICE);
10 jpm 208
		$resultat = $GLOBALS['db']->query($requete);
14 jpm 209
 
10 jpm 210
		(DB::isError($resultat)) ? die (GestionnaireErreur::retournerErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '' ;
211
		$nbre_enregistrement_ajoute = $GLOBALS['db']->affectedRows();
212
		if ($nbre_enregistrement_ajoute == 1) {
213
			return true;
214
		} elseif ($nbre_enregistrement_ajoute == 0) {
215
			return false;
216
		}
217
	}
14 jpm 218
 
10 jpm 219
	/**
220
	* Supprimer un enregistrement dans la base de données.
221
	* @return true si ok, false si aucun enregistrement effectué
222
	*/
223
	public function supprimer()
224
	{
225
		$enregistrement = $this->basculerEnregistrementObjet($this);
226
		$sql_where = '';
227
		foreach($enregistrement as $champ => $val) {
14 jpm 228
			if (!is_numeric($val)) {
229
				$val = '"'.$val.'"';
230
			}
10 jpm 231
			//if (preg_match('/_id_/', $champ)) {
232
				$sql_where .= $champ.' = '.$val.' AND ';
233
			//}
234
		}
235
		$sql_where = trim($sql_where, ' AND ').' ';
236
		$requete = 'DELETE FROM '.$this->getBaseDeDonnees().'.'.$this->getTableNom().' WHERE '.$sql_where ;
14 jpm 237
		trigger_error($requete, E_USER_NOTICE);
10 jpm 238
		$resultat = $GLOBALS['db']->query($requete);
239
		(DB::isError($resultat)) ? die (GestionnaireErreur::retournerErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '' ;
240
 
50 jpm 241
		$nbre_enregistrement_suppr = $GLOBALS['db']->affectedRows();
242
		if ($nbre_enregistrement_suppr == 1) {
10 jpm 243
			return true;
50 jpm 244
		} elseif ($nbre_enregistrement_suppr == 0) {
10 jpm 245
			return false;
246
		}
247
	}
92 jpm 248
 
249
	/** Afficher l'objet courrant. */
250
	public function afficher()
251
	{
252
		echo '<pre>'.print_r($this, true).'</pre>';
253
	}
10 jpm 254
}
255
?>