Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 880 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 880 Rev 890
1
<?php
1
<?php
2
/** Exemple lancement:
2
/** Exemple lancement:
3
 * /opt/lampp/bin/php -d memory_limit=3500M ~/web/eflore-projets/scripts/cli.php baseflor -a chargerTous
3
 * /opt/lampp/bin/php -d memory_limit=3500M ~/web/eflore-projets/scripts/cli.php baseflor -a chargerTous
4
*/
4
*/
5
class Baseflor extends EfloreScript {
5
class Baseflor extends EfloreScript {
6
 
6
 
7
	private $table = null;
7
	private $table = null;
8
 
8
 
9
 
9
 
10
	public function executer() {
10
	public function executer() {
11
		try {
11
		try {
12
			$this->initialiserProjet('baseflor');
12
			$this->initialiserProjet('baseflor');
13
			$cmd = $this->getParametre('a');
13
			$cmd = $this->getParametre('a');
14
			switch ($cmd) {
14
			switch ($cmd) {
15
				case 'chargerStructureSql' :
15
				case 'chargerStructureSql' :
16
					$this->chargerStructureSql();
16
					$this->chargerStructureSql();
17
					break;
17
					break;
18
				case 'chargerMetadonnees':
18
				case 'chargerMetadonnees':
19
					$this->chargerMetadonnees();
19
					$this->chargerMetadonnees();
20
					break;
20
					break;
21
				case 'chargerOntologies' :
21
				case 'chargerOntologies' :
22
					$this->chargerOntologies();
22
					$this->chargerOntologies();
23
					break;
23
					break;
24
				case 'verifierFichier' :
24
				case 'verifierFichier' :
25
					$this->verifierFichier();
25
					$this->verifierFichier();
26
					break;
26
					break;
27
				case 'chargerDonnees' :
27
				case 'chargerDonnees' :
28
					$this->chargerDonnees();
28
					$this->chargerDonnees();
29
					break;
29
					break;
30
				case 'genererChamps' :
30
				case 'genererChamps' :
31
					 $this->genererChamps();
31
					 $this->genererChamps();
32
					 break;
32
					 break;
33
				case 'chargerTous':
33
				case 'chargerTous':
34
					$this->chargerStructureSql();
34
					$this->chargerStructureSql();
35
					$this->chargerMetadonnees();
35
					$this->chargerMetadonnees();
36
					$this->chargerOntologies();
36
					$this->chargerOntologies();
37
					$this->chargerDonnees();
37
					$this->chargerDonnees();
38
					$this->genererChamps();
38
					$this->genererChamps();
39
					$this->insererDonneesBaseflorRangSupEcolo();
39
					$this->insererDonneesBaseflorRangSupEcolo();
40
					$this->insererDonneesIndex();
40
					$this->insererDonneesIndex();
41
					break;
41
					break;
42
				case 'insererDonneesRangSup' :
42
				case 'insererDonneesRangSup' :
43
					$this->insererDonneesBaseflorRangSupEcolo();
43
					$this->insererDonneesBaseflorRangSupEcolo();
44
					break;
44
					break;
45
				case 'supprimerTous' :
45
				case 'supprimerTous' :
46
					$this->supprimerTous();
46
					$this->supprimerTous();
47
					break;
47
					break;
48
				case 'voirRangSup' :
48
				case 'voirRangSup' :
49
					$this->voirRangSup();
49
					$this->voirRangSup();
50
					break;
50
					break;
51
				case 'voirRangSupEcologie' :
51
				case 'voirRangSupEcologie' :
52
					$this->voirRangSupEcologie();
52
					$this->voirRangSupEcologie();
53
					break;
53
					break;
54
				case 'insererDonneesIndex' :
54
				case 'insererDonneesIndex' :
55
					$this->insererDonneesIndex();
55
					$this->insererDonneesIndex();
56
					break;
56
					break;
57
				default :
57
				default :
58
					throw new Exception("Erreur : la commande '$cmd' n'existe pas!");
58
					throw new Exception("Erreur : la commande '$cmd' n'existe pas!");
59
			}
59
			}
60
		} catch (Exception $e) {
60
		} catch (Exception $e) {
61
			$this->traiterErreur($e->getMessage());
61
			$this->traiterErreur($e->getMessage());
62
		}
62
		}
63
	}
63
	}
64
 
64
 
65
 
65
 
66
	//-- traitement de la table baseflorRangSupInsertion --//
66
	//-- traitement de la table baseflorRangSupInsertion --//
67
 
67
 
68
	private function  getClasseBaseflorRangSupInsertion() {
68
	private function  getClasseBaseflorRangSupInsertion() {
69
		$conteneur = new Conteneur();
69
		$conteneur = new Conteneur();
70
		require_once dirname(__FILE__)."/BaseflorRangSupInsertion.php";
70
		require_once dirname(__FILE__)."/BaseflorRangSupInsertion.php";
71
		$rangSupInsert = new BaseflorRangSupInsertion($conteneur, $this->getBdd());
71
		$rangSupInsert = new BaseflorRangSupInsertion($conteneur, $this->getBdd());
72
		return $rangSupInsert;
72
		return $rangSupInsert;
73
	}
73
	}
74
 
74
 
75
	private function insererDonneesBaseflorRangSupEcolo(){
75
	private function insererDonneesBaseflorRangSupEcolo(){
76
		$rangSupInsert = $this->getClasseBaseflorRangSupInsertion();
76
		$rangSupInsert = $this->getClasseBaseflorRangSupInsertion();
77
		$rangSupInsert->insererDonnees();
77
		$rangSupInsert->insererDonnees();
78
	}
78
	}
79
 
79
 
80
	private function voirRangSup(){
80
	private function voirRangSup(){
81
		$rangSupInsert = $this->getClasseBaseflorRangSupInsertion();
81
		$rangSupInsert = $this->getClasseBaseflorRangSupInsertion();
82
		$rangSupInsert->testAscendantsDeBaseflor();
82
		$rangSupInsert->testAscendantsDeBaseflor();
83
	}
83
	}
84
 
84
 
85
	private function voirRangSupEcologie(){
85
	private function voirRangSupEcologie(){
86
		$rangSupInsert = $this->getClasseBaseflorRangSupInsertion();
86
		$rangSupInsert = $this->getClasseBaseflorRangSupInsertion();
87
		$rangSupInsert->testEcologieAscendantsDeBaseflor();
87
		$rangSupInsert->testEcologieAscendantsDeBaseflor();
88
	}
88
	}
89
 
89
 
90
 
90
 
91
	//-- traitement de la table baseflorIndex --//
91
	//-- traitement de la table baseflorIndex --//
92
 
92
 
93
	private function  getClasseBaseflorIndex() {
93
	private function  getClasseBaseflorIndex() {
94
		$conteneur = new Conteneur();
94
		$conteneur = new Conteneur();
95
		require_once dirname(__FILE__)."/BaseflorIndex.php";
95
		require_once dirname(__FILE__)."/BaseflorIndex.php";
96
		$Index = new BaseflorIndex($conteneur, $this->getBdd());
96
		$Index = new BaseflorIndex($conteneur, $this->getBdd());
97
		return $Index;
97
		return $Index;
98
	}
98
	}
99
 
99
 
100
	private function insererDonneesIndex(){
100
	private function insererDonneesIndex(){
101
		$Index= $this->getClasseBaseflorIndex();
101
		$Index= $this->getClasseBaseflorIndex();
102
		$Index->insererDonnees();
102
		$Index->insererDonnees();
103
	}
103
	}
104
 
104
 
105
 
105
 
106
	//-- traitement de la table generer champs --//
106
	//-- traitement de la table generer champs --//
107
 
107
 
108
	private function genererChamps(){
108
	private function genererChamps(){
109
		$this->initialiserGenerationChamps();
109
		$this->initialiserGenerationChamps();
110
		$this->ajouterChamps();
110
		$this->ajouterChamps();
111
		$this->analyserChampsExistant();
111
		$this->analyserChampsExistant();
112
	}
112
	}
113
 
113
 
114
	private function initialiserGenerationChamps() {
114
	private function initialiserGenerationChamps() {
115
		$this->table = Config::get('tables.donnees');
115
		$this->table = Config::get('tables.donnees');
116
	}
116
	}
117
 
117
 
118
	private function ajouterChamps() {
118
	private function ajouterChamps() {
119
		$this->preparerTablePrChpsBDNT();
119
		$this->preparerTablePrChpsBDNT();
120
		$this->preparerTablePrChpsNumTaxon();
120
		$this->preparerTablePrChpsNumTaxon();
121
		$this->preparerTablePrChpsNumNomen();
121
		$this->preparerTablePrChpsNumNomen();
122
	}
122
	}
123
 
123
 
124
	private function preparerTablePrChpsBDNT() {
124
	private function preparerTablePrChpsBDNT() {
125
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'BDNT' ";
125
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'BDNT' ";
126
		$resultat = $this->getBdd()->recuperer($requete);
126
		$resultat = $this->getBdd()->recuperer($requete);
127
		if ($resultat === false) {
127
		if ($resultat === false) {
128
			$requete = 	"ALTER TABLE {$this->table} ".
128
			$requete = 	"ALTER TABLE {$this->table} ".
129
					'ADD BDNT VARCHAR( 6 ) '.
129
					'ADD BDNT VARCHAR( 6 ) '.
130
					'CHARACTER SET utf8 COLLATE utf8_general_ci '.
130
					'CHARACTER SET utf8 COLLATE utf8_general_ci '.
131
					'NOT NULL AFTER catminat_code ';
131
					'NOT NULL AFTER catminat_code ';
132
			$this->getBdd()->requeter($requete);
132
			$this->getBdd()->requeter($requete);
133
		}
133
		}
134
	}
134
	}
135
 
135
 
136
	private function preparerTablePrChpsNumTaxon() {
136
	private function preparerTablePrChpsNumTaxon() {
137
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'num_taxon' ";
137
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'num_taxon' ";
138
		$resultat = $this->getBdd()->recuperer($requete);
138
		$resultat = $this->getBdd()->recuperer($requete);
139
		if ($resultat === false) {
139
		if ($resultat === false) {
140
			$requete = "ALTER TABLE {$this->table} ".
140
			$requete = "ALTER TABLE {$this->table} ".
141
					'ADD num_taxon INT( 10 ) NOT NULL '.
141
					'ADD num_taxon INT( 10 ) NOT NULL '.
142
					'AFTER catminat_code';
142
					'AFTER catminat_code';
143
			$this->getBdd()->requeter($requete);
143
			$this->getBdd()->requeter($requete);
144
		}
144
		}
145
	}
145
	}
146
 
146
 
147
	private function preparerTablePrChpsNumNomen() {
147
	private function preparerTablePrChpsNumNomen() {
148
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'num_nomen' ";
148
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'num_nomen' ";
149
		$resultat = $this->getBdd()->recuperer($requete);
149
		$resultat = $this->getBdd()->recuperer($requete);
150
		if ($resultat === false) {
150
		if ($resultat === false) {
151
			$requete = "ALTER TABLE {$this->table} ".
151
			$requete = "ALTER TABLE {$this->table} ".
152
					'ADD num_nomen INT( 10 ) NOT NULL '.
152
					'ADD num_nomen INT( 10 ) NOT NULL '.
153
					'AFTER catminat_code';
153
					'AFTER catminat_code';
154
			$this->getBdd()->requeter($requete);
154
			$this->getBdd()->requeter($requete);
155
		}
155
		}
156
	}
156
	}
157
 
157
 
158
	private function analyserChampsExistant() {
158
	private function analyserChampsExistant() {
159
		$resultats = $this->recupererTuplesNumsOriginels();
159
		$resultats = $this->recupererTuplesNumsOriginels();
160
		foreach ($resultats as $chps) {
160
		foreach ($resultats as $chps) {
161
			$cle = $chps['cle'];
161
			$cle = $chps['cle'];
162
			$nno = $chps['num_nomen_originel'];
162
			$nno = $chps['num_nomen_originel'];
163
			$nto = $chps['num_taxon_originel'];
163
			$nto = $chps['num_taxon_originel'];
164
 
164
 
165
			$valeurs = array();
165
			$valeurs = array();
166
			$valeurs["BDNT"] = $this->genererChpsBDNT($nno, $nto);
166
			$valeurs["BDNT"] = $this->genererChpsBDNT($nno, $nto);
167
			$valeurs["num_taxon"] = $this->genererChpsNumTaxon($nto);
167
			$valeurs["num_taxon"] = $this->genererChpsNumTaxon($nto);
168
			$valeurs["num_nomen"] = $this->genererChpsNumNomen($nno);
168
			$valeurs["num_nomen"] = $this->genererChpsNumNomen($nno);
169
 
169
 
170
			$this->remplirChamps($cle, $valeurs);
170
			$this->remplirChamps($cle, $valeurs);
171
 
171
 
172
			$this->afficherAvancement("Insertion des valeurs dans la base en cours");
172
			$this->afficherAvancement("Insertion des valeurs dans la base en cours");
173
		}
173
		}
174
		echo "\n";
174
		echo "\n";
175
	}
175
	}
176
 
176
 
177
	private function recupererTuplesNumsOriginels(){
177
	private function recupererTuplesNumsOriginels(){
178
		$requete = "SELECT cle, num_taxon_originel, num_nomen_originel FROM {$this->table} ";
178
		$requete = "SELECT cle, num_taxon_originel, num_nomen_originel FROM {$this->table} ";
179
		$resultat = $this->getBdd()->recupererTous($requete);
179
		$resultat = $this->getBdd()->recupererTous($requete);
180
		return $resultat;
180
		return $resultat;
181
	}
181
	}
182
 
182
 
183
	private function genererChpsBDNT($nno, $nto) {
183
	private function genererChpsBDNT($nno, $nto) {
184
		$bdnt = '';
184
		$bdnt = '';
185
		if (preg_match("/^([AB])[0-9]+$/", $nno, $retour) || preg_match("/^([AB])[0-9]+$/", $nto, $retour)){
185
		if (preg_match("/^([AB])[0-9]+$/", $nno, $retour) || preg_match("/^([AB])[0-9]+$/", $nto, $retour)){
186
			if ($retour[1]=='A') {
186
			if ($retour[1]=='A') {
187
				$bdnt = "BDAFX";
187
				$bdnt = "BDAFX";
188
			} else {
188
			} else {
189
				$bdnt = "BDBFX";
189
				$bdnt = "BDBFX";
190
			}
190
			}
191
		} elseif (($nno == 'nc') && ($nto == 'nc')) {
191
		} elseif (($nno == 'nc') && ($nto == 'nc')) {
192
			$bdnt = "nc";
192
			$bdnt = "nc";
193
		} else {
193
		} else {
194
			$bdnt = "BDTFX";
194
			$bdnt = "BDTFX";
195
		}
195
		}
196
		return $bdnt;
196
		return $bdnt;
197
	}
197
	}
198
 
198
 
199
	private function genererChpsNumTaxon($nto){
199
	private function genererChpsNumTaxon($nto){
200
		$num_taxon = '';
200
		$num_taxon = '';
201
		if (preg_match("/^[AB]([0-9]+)$/", $nto, $retour)) {
201
		if (preg_match("/^[AB]([0-9]+)$/", $nto, $retour)) {
202
			$num_taxon = intval($retour[1]);
202
			$num_taxon = intval($retour[1]);
203
		} elseif($nto == 'nc') {
203
		} elseif($nto == 'nc') {
204
			$num_taxon = 0;
204
			$num_taxon = 0;
205
		} else {
205
		} else {
206
			$num_taxon = intval($nto);
206
			$num_taxon = intval($nto);
207
		}
207
		}
208
		return $num_taxon;
208
		return $num_taxon;
209
	}
209
	}
210
 
210
 
211
	private function genererChpsNumNomen($nno) {
211
	private function genererChpsNumNomen($nno) {
212
		$num_nomen = '';
212
		$num_nomen = '';
213
		if (preg_match("/^[AB]([0-9]+)$/", $nno, $retour)) {
213
		if (preg_match("/^[AB]([0-9]+)$/", $nno, $retour)) {
214
			$num_nomen = intval($retour[1]);
214
			$num_nomen = intval($retour[1]);
215
		} elseif ($nno == 'nc') {
215
		} elseif ($nno == 'nc') {
216
			$num_nomen = 0;
216
			$num_nomen = 0;
217
		} else {
217
		} else {
218
			$num_nomen = intval($nno);
218
			$num_nomen = intval($nno);
219
		}
219
		}
220
		return $num_nomen;
220
		return $num_nomen;
221
	}
221
	}
222
 
222
 
223
	 private function remplirChamps($cle, $valeurs) {
223
	 private function remplirChamps($cle, $valeurs) {
224
		foreach ($valeurs as $nomChamp => $valeurChamp) {
224
		foreach ($valeurs as $nomChamp => $valeurChamp) {
225
			$valeurChamp = $this->getBdd()->proteger($valeurChamp);
225
			$valeurChamp = $this->getBdd()->proteger($valeurChamp);
226
			$requete = "UPDATE {$this->table} SET $nomChamp = $valeurChamp WHERE cle = $cle ";
226
			$requete = "UPDATE {$this->table} SET $nomChamp = $valeurChamp WHERE cle = $cle ";
227
			$resultat = $this->getBdd()->requeter($requete);
227
			$resultat = $this->getBdd()->requeter($requete);
228
			if ($resultat === false) {
228
			if ($resultat === false) {
229
				throw new Exception("Erreur d'insertion pour le tuple clé = $cle");
229
				throw new Exception("Erreur d'insertion pour le tuple clé = $cle");
230
			}
230
			}
231
		}
231
		}
232
	}
232
	}
233
 
233
 
234
	//+------------------------------------------------------------------------------------------------------+
234
	//+------------------------------------------------------------------------------------------------------+
235
	// chargements, suppression, exécution
235
	// chargements, suppression, exécution
236
 
236
 
237
	protected function chargerMetadonnees() {
237
	protected function chargerMetadonnees() {
238
		$contenuSql = $this->recupererContenu(Config::get('chemins.metadonnees'));
238
		$contenuSql = $this->recupererContenu(Config::get('chemins.metadonnees'));
239
		$this->executerScriptSql($contenuSql);
239
		$this->executerScriptSql($contenuSql);
240
	}
240
	}
241
 
241
 
242
	private function chargerOntologies() {
242
	private function chargerOntologies() {
243
		$chemin = Config::get('chemins.ontologies');
243
		$chemin = Config::get('chemins.ontologies');
244
		$table = Config::get('tables.ontologies');
244
		$table = Config::get('tables.ontologies');
245
		$requete = "LOAD DATA INFILE '$chemin' ".
245
		$requete = "LOAD DATA INFILE '$chemin' ".
246
			"REPLACE INTO TABLE $table ".
246
			"REPLACE INTO TABLE $table ".
247
			'CHARACTER SET utf8 '.
247
			'CHARACTER SET utf8 '.
248
			'FIELDS '.
248
			'FIELDS '.
249
			"	TERMINATED BY '\t' ".
249
			"	TERMINATED BY '\t' ".
250
			"	ENCLOSED BY '' ".
250
			"	ENCLOSED BY '' ".
251
			"	ESCAPED BY '\\\' "
251
			"	ESCAPED BY '\\\' "
252
			;
252
			;
253
		$this->getBdd()->requeter($requete);
253
		$this->getBdd()->requeter($requete);
254
	}
254
	}
255
 
255
 
256
	protected function chargerStructureSql() {
256
	protected function chargerStructureSql() {
257
		$contenuSql = $this->recupererContenu(Config::get('chemins.structureSql'));
257
		$contenuSql = $this->recupererContenu(Config::get('chemins.structureSql'));
258
		$this->executerScriptSql($contenuSql);
258
		$this->executerScriptSql($contenuSql);
259
	}
259
	}
260
 
260
 
261
	protected function executerScriptSql($sql) {
261
	protected function executerScriptSql($sql) {
262
		$requetes = Outils::extraireRequetes($sql);
262
		$requetes = Outils::extraireRequetes($sql);
263
		foreach ($requetes as $requete) {
263
		foreach ($requetes as $requete) {
264
			$this->getBdd()->requeter($requete);
264
			$this->getBdd()->requeter($requete);
265
		}
265
		}
266
	}
266
	}
267
 
267
 
268
	private function chargerDonnees() {
268
	private function chargerDonnees() {
269
		$nb_err = $this->verifierFichier();
269
		$nb_err = $this->verifierFichier();
270
		if ($nb_err > 0) {
270
		if ($nb_err > 0) {
271
			$e = "Je ne peux pas charger les données car le fichier comporte des erreurs.".
271
			$e = "Je ne peux pas charger les données car le fichier comporte des erreurs.".
272
					"Voir le fichier baseflor_verif.txt\n";
272
					"Voir le fichier baseflor_verif.txt\n";
273
			throw new Exception($e);
273
			throw new Exception($e);
274
		}
274
		}
275
 
275
 
276
		$table = Config::get('tables.donnees');
276
		$table = Config::get('tables.donnees');
277
		$requete = "LOAD DATA INFILE '".Config::get('chemins.donnees')."' ".
277
		$requete = "LOAD DATA INFILE '".Config::get('chemins.donnees')."' ".
278
			"REPLACE INTO TABLE $table ".
278
			"REPLACE INTO TABLE $table ".
279
			'CHARACTER SET utf8 '.
279
			'CHARACTER SET utf8 '.
280
			'FIELDS '.
280
			'FIELDS '.
281
			"	TERMINATED BY '\t' ".
281
			"	TERMINATED BY '\t' ".
282
			"	ENCLOSED BY '' ".
282
			"	ENCLOSED BY '' ".
283
			"	ESCAPED BY '\\\'";
283
			"	ESCAPED BY '\\\'";
284
		$this->getBdd()->requeter($requete);
284
		$this->getBdd()->requeter($requete);
285
	}
285
	}
286
 
286
 
287
	private function supprimerTous() {
287
	private function supprimerTous() {
288
		// TODO : rajouter une boucle utilisant un parametre de config stockant toutes les versions pour supprimer les tables
288
		// TODO : rajouter une boucle utilisant un parametre de config stockant toutes les versions pour supprimer les tables
289
		$requete = "DROP TABLE IF EXISTS baseflor_meta, baseflor_ontologies, ".
289
		$requete = "DROP TABLE IF EXISTS baseflor_meta, baseflor_ontologies, ".
290
			" baseflor_v2012_03_19, ".
290
			" baseflor_v2012_03_19, ".
291
			" baseflor_v2012_05_08, baseflor_rang_sup_ecologie_v2012_05_08, baseflor_index_v2012_05_08, ".
291
			" baseflor_v2012_05_08, baseflor_rang_sup_ecologie_v2012_05_08, baseflor_index_v2012_05_08, ".
292
			" baseflor_v2012_12_31, baseflor_rang_sup_ecologie_v2012_12_31 ";
292
			" baseflor_v2012_12_31, baseflor_rang_sup_ecologie_v2012_12_31, baseflor_index_v2012_12_31,  ".
-
 
293
			" baseflor_v2013_07_04, baseflor_rang_sup_ecologie_v2013_07_04, baseflor_index_v2013_07_04";
293
		$this->getBdd()->requeter($requete);
294
		$this->getBdd()->requeter($requete);
294
	}
295
	}
295
 
296
 
296
	//++------------------------------------verifierFichier------------------------------------------++//
297
	//++------------------------------------verifierFichier------------------------------------------++//
297
 
298
 
298
	private function  getClasseBaseflorVerif() {
299
	private function  getClasseBaseflorVerif() {
299
		$conteneur = new Conteneur();
300
		$conteneur = new Conteneur();
300
		require_once dirname(__FILE__)."/BaseflorVerif.php";
301
		require_once dirname(__FILE__)."/BaseflorVerif.php";
301
		$verif = new BaseflorVerif($conteneur,'baseflor');
302
		$verif = new BaseflorVerif($conteneur,'baseflor');
302
		return $verif;
303
		return $verif;
303
	}
304
	}
304
 
305
 
305
	private function verifierFichier() {
306
	private function verifierFichier() {
306
		$verif = $this->getClasseBaseflorVerif();
307
		$verif = $this->getClasseBaseflorVerif();
307
		$nb_erreurs = $verif->verifierFichier(Config::get('chemins.donnees'));
308
		$nb_erreurs = $verif->verifierFichier(Config::get('chemins.donnees'));
308
		return $nb_erreurs;
309
		return $nb_erreurs;
309
	}
310
	}
310
 
311
 
311
}
312
}
312
?>
313
?>