Subversion Repositories Applications.gtt

Rev

Rev 173 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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