Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2094 mathias 1
<?php
2
class Maintenance extends Script {
3
 
4
	protected $bdd;
2139 mathias 5
	protected $parametres_autorises = array(
2142 mathias 6
		'-mc' => array(false, '1', 'Mot clef à chercher pour régénérer les machins'),
7
		'-doublon' => array(false, '1', "Id du mot clé qu'on veut réduire à un autre"),
2183 mathias 8
		'-util' => array(false, '1', "Id de l'utilisateur"),
2142 mathias 9
		'-cible' => array(false, '1', "Id de l'autre mot clé")
2139 mathias 10
	);
2094 mathias 11
 
12
	public function __construct($script_nom, $parametres_cli) {
13
		parent::__construct($script_nom, $parametres_cli);
14
		$this->bdd = new Bdd();
15
	}
16
 
17
	public function executer() {
18
		$cmd = $this->getParametre('a');
19
		try {
20
			switch ($cmd) {
21
				case 'regenererMotsClesTexteObs' :
22
					$this->regenererMotsClesTexteObs();
23
					break;
24
				case 'regenererMotsClesTexteImages' :
25
					$this->regenererMotsClesTexteImages();
26
					break;
2103 aurelien 27
				case 'regenererMotsClesTexteObsTout' :
28
					$this->regenererMotsClesTexteObs(true);
29
					break;
30
				case 'regenererMotsClesTexteImagesTout' :
31
					$this->regenererMotsClesTexteImages(true);
32
					break;
2095 mathias 33
				case 'viderMotsClesTexteImagesSansMotsCles' :
34
					$this->viderMotsClesTexteImagesSansMotsCles();
35
					break;
36
				case 'viderMotsClesTexteObsSansMotsCles' :
37
					$this->viderMotsClesTexteObsSansMotsCles();
38
					break;
2100 aurelien 39
				case 'regenererChampsTailleImage' :
40
					$this->regenererChampsTailleImage();
41
					break;
2102 aurelien 42
				case 'reparerLiaisonsOublieesObs' :
43
					$this->reparerLiaisonsOublieesObs();
44
					break;
45
				case 'reparerLiaisonsOublieesImages' :
46
					$this->reparerLiaisonsOublieesImages();
47
					break;
2139 mathias 48
				case 'reparerLiaisonsObsParMotsClesTexte' :
49
					$mot_clef = $this->getParametre('mc');
50
					$this->reparerLiaisonsObsParMotsClesTexte($mot_clef);
51
					break;
2142 mathias 52
				case 'reductionMotsClesImages' :
2183 mathias 53
					// ex: cli.php maintenance -a reductionMotsClesImages -doublon 1234 -cible 5678
2142 mathias 54
					$idDoublon = $this->getParametre('doublon');
55
					$idCible = $this->getParametre('cible');
56
					$this->reductionMotsClesImages($idDoublon, $idCible);
57
					break;
2183 mathias 58
				case 'reductionMotsClesImagesUtil' :
59
					// ex: cli.php maintenance -a reductionMotsClesImagesUtil -util 6865
60
					$idUtilisateur = $this->getParametre('util');
61
					$this->reductionMotsClesImagesUtilisateur($idUtilisateur);
62
					break;
2191 mathias 63
				case 'reduireEtNormaliserMotsClesImages' :
64
					// ex: cli.php maintenance -a reduireEtNormaliserMotsClesImages
65
					$this->reduireEtNormaliserMotsClesImages();
66
					break;
2094 mathias 67
				default :
68
					$msg = "Erreur : la commande '$cmd' n'existe pas!\n".
69
						"Commandes existantes : regenererMotsClesTexteImages, regenererMotsClesTexteObs";
70
					throw new Exception($msg);
71
			}
72
		} catch (Exception $e) {
73
			$this->traiterErreur($e->getMessage());
74
		}
75
	}
76
 
77
	// Régénère le champ "mots_cles_texte" pour toutes les images ayant des mots clés mais ayant ce champ
78
	// vide, suite à une erreur
2103 aurelien 79
	protected function regenererMotsClesTexteImages($tout = false) {
80
		$req = "SELECT id_image FROM cel_images WHERE ".
81
				"id_image IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)";
82
		if(!$tout) {
83
			$req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')";
84
		}
2094 mathias 85
		$res = $this->bdd->recupererTous($req);
86
		echo count($res) . " images trouvées\n";
87
		foreach ($res as $image) {
88
			$req = "UPDATE cel_images SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_images cm "
89
				. "INNER JOIN cel_mots_cles_images_liaison cml ON cml.id_mot_cle = cm.id_mot_cle AND cml.id_element_lie = '" . $image['id_image'] . "') "
90
				. "WHERE id_image = '" . $image['id_image'] . "'";
91
			$this->bdd->requeter($req);
92
		}
93
	}
94
 
95
	// Régénère le champ "mots_cles_texte" pour toutes les observations ayant des mots clés mais ayant ce champ
96
	// vide, suite à une erreur
2103 aurelien 97
	protected function regenererMotsClesTexteObs($tout = false) {
98
		$req = "SELECT id_observation FROM cel_obs WHERE ".
99
				"id_observation IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
100
		if(!$tout) {
101
			$req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')";
102
		}
2094 mathias 103
		$res = $this->bdd->recupererTous($req);
104
		echo count($res) . " observations trouvées\n";
105
		foreach ($res as $image) {
106
			$req = "UPDATE cel_obs SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_obs cm "
107
			. "INNER JOIN cel_mots_cles_obs_liaison cml ON cml.id_mot_cle = cm.id_mot_cle AND cml.id_element_lie = '" . $image['id_observation'] . "') "
108
				. "WHERE id_observation = '" . $image['id_observation'] . "'";
109
			$this->bdd->requeter($req);
110
		}
111
	}
2095 mathias 112
 
113
	// Vide le champ "mots_cles_texte" pour toutes les images n'ayant aucun mot clé
114
	protected function viderMotsClesTexteImagesSansMotsCles() {
115
		$req = "UPDATE cel_images SET mots_cles_texte = NULL WHERE id_image NOT IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)";
116
		$res = $this->bdd->requeter($req);
117
		echo "$res images mises à jour\n";
118
	}
119
 
120
	// Vide le champ "mots_cles_texte" pour toutes les obs n'ayant aucun mot clé
121
	protected function viderMotsClesTexteObsSansMotsCles() {
122
		$req = "UPDATE cel_obs SET mots_cles_texte = NULL WHERE id_observation NOT IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
123
		$res = $this->bdd->requeter($req);
124
		echo "$res observations mises à jour\n";
125
	}
2100 aurelien 126
 
127
	protected function regenererChampsTailleImage() {
128
		$req = "SELECT id_image FROM cel_images WHERE hauteur = 0 OR largeur = 0";
129
		$res = $this->bdd->recupererTous($req);
130
 
131
		echo count($res)." images concernees \n";
132
		echo "Début du traitement \n";
133
		$images_maj = 0;
134
		$image_meta_ratees = 0;
135
		$images_inexistantes = 0;
136
 
137
		foreach($res as $image) {
138
			$chemin = $this->getCheminImage($image['id_image']);
139
			if(file_exists($chemin)) {
140
				list($largeur, $hauteur) = @getimagesize($chemin);
141
				if(is_numeric($largeur) && is_numeric($hauteur)) {
142
					$req_maj = "UPDATE cel_images SET hauteur = '".$hauteur."', largeur = '".$largeur."' ".
143
					           "WHERE id_image = '".$image['id_image']."'";
144
					$maj_taille_image = $this->bdd->requeter($req_maj);
145
					if($maj_taille_image) {
146
						$images_maj++;
147
					}
148
				} else {
149
					$image_meta_ratees++;
150
				}
151
			} else {
152
				$images_inexistantes++;
153
			}
154
			$this->afficherAvancement("\tImages traitées : ", 1);
155
		}
156
		echo "\n";
157
		echo "Fin de la régénération des tailles des images à partir des metadonnées \n";
158
		echo $images_maj." images ont vu leur infos de taille régénérées \n";
159
		echo $image_meta_ratees." images ont raté l'extraction de metadonnées \n";
160
		echo $images_inexistantes." images n'existent pas en tant que fichier \n";
161
	}
162
 
163
	private function getCheminImage($id) {
164
		$chemin_base = Config::get('dossierImages');
165
 
166
		$id = sprintf('%09s', $id);
167
		$id = wordwrap($id, 3 , '_', true);
168
 
169
		list($dossierNiveau1, $dossierNiveau2) = explode('_', $id);
170
 
2119 aurelien 171
		$chemin = $chemin_base.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/O/'.$id.'_O.jpg';
2100 aurelien 172
 
173
		return $chemin;
174
	}
2102 aurelien 175
 
176
	protected function reparerLiaisonsOublieesObs() {
177
		// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
178
		// dans la table de liaison il est souvent vide
179
		$requete_liaisons = "SELECT com.id_observation, com.id_mot_cle_obs, co.ce_utilisateur ".
180
					"FROM `cel_obs_mots_cles` com INNER JOIN cel_obs co ON co.id_observation = com.id_observation ";
181
 
182
		$liaisons = $this->bdd->recupererTous($requete_liaisons);
183
		$nb_liaisons_originales = count($liaisons);
184
 
185
		// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
186
		$requete_mots_cles = "SELECT id_mot_cle_obs, id_utilisateur, mot_cle FROM cel_mots_cles_obs ";
187
		$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
188
 
189
		$anciens_mots_cles_fmt = array();
190
		foreach($anciens_mots_cles as &$ancien_mot_cle) {
191
			$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
192
			if(!isset($anciens_mots_cles_fmt[$id_utilisateur_ancien])) {
193
				$anciens_mots_cles_fmt[$id_utilisateur_ancien] = array();
194
			}
195
			$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_obs']] = $ancien_mot_cle;
196
		}
197
 
198
		// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
199
		$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_obs";
200
		$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
201
 
202
		$nouveau_mots_cles_fmt = array();
203
		foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
204
			$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
205
			if(!isset($nouveau_mots_cles_fmt[$id_utilisateur_nouveau])) {
206
				$nouveau_mots_cles_fmt[$id_utilisateur_nouveau] = array();
207
			}
2137 mathias 208
			$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][strtolower($nouveau_mot_cle['mot_cle'])] = $nouveau_mot_cle;
2102 aurelien 209
		}
210
 
211
		$anciens_mot_cles_pas_trouves = 0;
212
		$nouveaux_mot_cles_pas_trouves = 0;
213
		$utilisateurs_pas_trouves = 0;
214
		$valeurs_a_inserer = array();
215
 
216
		$ids_obs = array();
217
 
218
		foreach($liaisons as &$liaison) {
219
			$id_utilisateur_liaison = $liaison['ce_utilisateur'];
220
			$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_obs'];
221
 
222
			if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
223
				if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
224
					$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
2137 mathias 225
					$texte_ancien_mot_cle = strtolower($texte_ancien_mot_cle); // l'astuce de ouf !
2102 aurelien 226
					if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
227
						if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
228
							$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
229
 
230
							$valeurs_a_inserer[] = array(
231
													'id_element_lie' => $liaison['id_observation'],
232
													'id_mot_cle' => $nouvel_id_mot_cle,
233
													'ancienne_liaison' => $liaison
234
							);
235
							$ids_obs[] = $liaison['id_observation'];
236
						} else {
237
							$nouveaux_mot_cles_pas_trouves++;
238
						}
239
					} else {
240
 
241
					}
242
 
243
				} else {
244
					$anciens_mot_cles_pas_trouves++;
245
				}
246
			} else {
247
				$utilisateurs_pas_trouves++;
248
			}
249
		}
250
 
251
		echo "Anciennes liaisons ".$nb_liaisons_originales." \n";
252
		echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
253
		echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
254
		echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
255
		echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n";
256
 
257
		$tranches = array_chunk($valeurs_a_inserer, 800);
258
 
259
		foreach($tranches as $tranche) {
260
			$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_obs_liaison (id_element_lie, id_mot_cle) ".
261
					                      "VALUES ";
262
			foreach($tranche as $l) {
263
				$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
264
			}
265
			$requete_insertion = rtrim($requete_insertion, ',');
266
			$insertion = $this->bdd->requeter($requete_insertion);
267
			$this->afficherAvancement("Liaisons insérées (par paquet de 800) ", 1);
268
		}
269
		echo "\n";
270
	}
271
 
272
	private function reparerLiaisonsOublieesImages() {
273
		// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
274
		// dans la table de liaison il est souvent vide
275
		$requete_liaisons = "SELECT cim.id_image, cim.id_mot_cle_image, ci.ce_utilisateur ".
276
							"FROM cel_images_mots_cles cim INNER JOIN cel_images ci ON ci.id_image = cim.id_image ";
277
 
278
		$liaisons = $this->bdd->recupererTous($requete_liaisons);
279
 
280
		// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
281
		$requete_mots_cles = "SELECT id_mot_cle_image, id_utilisateur, mot_cle FROM cel_mots_cles_images ";
282
		$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
283
 
284
		$anciens_mots_cles_fmt = array();
285
		foreach($anciens_mots_cles as &$ancien_mot_cle) {
286
			$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
287
			if(!isset($anciens_mots_cles_fmt[$id_utilisateur_ancien])) {
288
				$anciens_mots_cles_fmt[$id_utilisateur_ancien] = array();
289
			}
290
			$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_image']] = $ancien_mot_cle;
291
		}
292
 
293
		// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
294
		$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_images";
295
		$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
296
 
297
		$nouveau_mots_cles_fmt = array();
298
		foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
299
			$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
300
			if(!isset($nouveau_mots_cles_fmt[$id_utilisateur_nouveau])) {
301
				$nouveau_mots_cles_fmt[$id_utilisateur_nouveau] = array();
302
			}
303
			$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][$nouveau_mot_cle['mot_cle']] = $nouveau_mot_cle;
304
		}
305
 
306
		$anciens_mot_cles_pas_trouves = 0;
307
		$nouveaux_mot_cles_pas_trouves = 0;
308
		$utilisateurs_pas_trouves = 0;
309
		$valeurs_a_inserer = array();
310
 
311
		foreach($liaisons as &$liaison) {
312
			$id_utilisateur_liaison = $liaison['ce_utilisateur'];
313
			$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_image'];
314
 
315
			if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
316
				if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
317
					$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
318
					if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
319
						if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
320
							$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
321
 
322
							$valeurs_a_inserer[] = array(
323
															'id_element_lie' => $liaison['id_image'],
324
															'id_mot_cle' => $nouvel_id_mot_cle,
325
															'ancienne_liaison' => $liaison
326
							);
327
							$ids_imgs[] = $liaison['id_image'];
328
						} else {
329
							$nouveaux_mot_cles_pas_trouves++;
330
						}
331
					} else {
332
 
333
					}
334
 
335
				} else {
336
					$anciens_mot_cles_pas_trouves++;
337
				}
338
			} else {
339
				$utilisateurs_pas_trouves++;
340
			}
341
		}
342
 
343
		echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
344
		echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
345
		echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
346
		echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n";
347
 
348
		$tranches = array_chunk($valeurs_a_inserer, 800);
349
 
350
		foreach($tranches as $tranche) {
351
			$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_images_liaison (id_element_lie, id_mot_cle) ".
352
					                      "VALUES ";
353
			foreach($tranche as $l) {
354
				$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
355
			}
356
			$requete_insertion = rtrim($requete_insertion, ',');
357
			$insertion = $this->bdd->requeter($requete_insertion);
358
			$this->afficherAvancement("Liaisons insérées (par paquet de 800) ", 1);
359
		}
360
		echo "\n";
361
	}
2139 mathias 362
 
363
	private function reparerLiaisonsObsParMotsClesTexte($mot_cle_texte_recherche) {
364
		$ancienne_table_obs = Config::get('table_obs_recup');
365
		$requete_anciens_mots_cles_texte = "SELECT ce_utilisateur, id_observation, mots_cles_texte ".
366
											"FROM ".$ancienne_table_obs." WHERE mots_cles_texte LIKE '%".$mot_cle_texte_recherche."%'";
367
		$obs_a_mot_cle = $this->bdd->recupererTous($requete_anciens_mots_cles_texte);
368
 
369
		$requete_nouveaux_mots_cle = "SELECT * FROM cel_arbre_mots_cles_obs ".
370
									"WHERE id_utilisateur IN ".
371
									"(SELECT id_utilisateur FROM ".$ancienne_table_obs." ".
372
									"WHERE mots_cles_texte LIKE '%".$mot_cle_texte_recherche."%')";
373
		$nouveaux_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cle);
374
 
375
		$mots_cles_indexes = array();
376
		foreach($nouveaux_mots_cles as $mot_cle) {
377
			$mots_cles_indexes[$mot_cle['id_utilisateur']][strtolower($mot_cle['mot_cle'])] = $mot_cle;
378
		}
379
 
380
		$liaisons_a_inserer = array();
381
		$utilFoirax = 0;
382
		$mcFoirax = 0;
383
		foreach($obs_a_mot_cle as $obs) {
384
			$mots_cles_texte_tab = explode(',', $obs['mots_cles_texte']);
385
			$id_observation = $obs['id_observation'];
386
			$id_utilisateur = $obs['ce_utilisateur'];
387
			foreach($mots_cles_texte_tab as $mot_cle_t) {
388
				if($mot_cle_t == $mot_cle_texte_recherche) {
389
					if (isset($mots_cles_indexes[$id_utilisateur])) {
390
						if (isset($mots_cles_indexes[$id_utilisateur][strtolower($mot_cle_t)])) {
391
							$id_nouveau_mot_cle = $mots_cles_indexes[$id_utilisateur][strtolower($mot_cle_t)]['id_mot_cle'];
392
						} else {
393
							$mcFoirax++;
394
						}
395
					} else {
396
						$utilFoirax++;
397
					}
398
					$liaisons_a_inserer[] = array('id_element_lie' => $id_observation, 'id_mot_cle' => $id_nouveau_mot_cle);
399
				}
400
			}
401
		}
402
		echo "Utilisateurs pas dans le tableau: $utilFoirax\n";
403
		echo "Motf-clefs pas dans le tableau: $mcFoirax\n";
2140 mathias 404
		//echo '<pre>'.print_r($liaisons_a_inserer, true).'</pre>';
405
		echo "Liaisons à insérer: " . count($liaisons_a_inserer) . " \n";
406
 
407
		$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_obs_liaison (id_element_lie, id_mot_cle) ".
408
				"VALUES ";
409
		foreach($liaisons_a_inserer as $l) {
410
			$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
411
		}
412
		$requete_insertion = rtrim($requete_insertion, ',');
413
		$insertion = $this->bdd->requeter($requete_insertion);
2139 mathias 414
	}
2142 mathias 415
 
416
	// Change toutes les associations images - mots_cles dont l'id mot_cle est $idDoublon, pour le remplacer par $idCible
2183 mathias 417
	private function reductionMotsClesImages($idDoublon, $idCible, $supprimerVieuxMotsCles=true) {
418
		echo "Réduction de $idDoublon à $idCible" . PHP_EOL;
419
 
2142 mathias 420
		$q1 = "SELECT id_element_lie FROM cel_mots_cles_images_liaison WHERE id_mot_cle = $idCible;";
421
		$r1 = $this->bdd->requeter($q1);
422
		$idsImages = array();
423
		foreach ($r1 as $r) {
424
			$idsImages[] = $r['id_element_lie'];
425
		}
426
 
2183 mathias 427
		if (count($idsImages) > 0) {
428
			// On vire ceux qui ont le doublon mais qui ont aussi la cible
429
			$q2 = "DELETE FROM cel_mots_cles_images_liaison WHERE id_mot_cle = $idDoublon AND id_element_lie IN (" . implode(',', $idsImages) . ");";
430
			$r2 = $this->bdd->requeter($q2);
431
		}
432
 
2142 mathias 433
		// On convertit tous les doublons en cible
434
		$q3 = "UPDATE cel_mots_cles_images_liaison SET id_mot_cle = $idCible WHERE id_mot_cle = $idDoublon;";
435
		$r3 = $this->bdd->requeter($q3);
2183 mathias 436
 
437
		if ($supprimerVieuxMotsCles) {
438
			// On supprime le mot cle qui sert plus à rien
439
			$q4 = "DELETE FROM cel_arbre_mots_cles_images WHERE id_mot_cle = $idDoublon;";
440
			$r4 = $this->bdd->requeter($q4);
441
		}
2142 mathias 442
	}
2183 mathias 443
 
444
	// Parcourt l'arbre des mots-cles images de l'utilisateur dont l'id est $idUtilisateur, et réduit tous ceux dont le chemin
445
	// n'est pas unique
446
	private function reductionMotsClesImagesUtilisateur($idUtilisateur) {
2191 mathias 447
		$q1 = "SELECT id_mot_cle, chemin, mot_cle, (LOCATE(mot_cle, chemin) != 0) as valide FROM cel_arbre_mots_cles_images"
448
			. " WHERE id_utilisateur = '$idUtilisateur'"
449
			. " ORDER BY chemin ASC, valide DESC;";
2183 mathias 450
		$r1 = $this->bdd->requeter($q1);
451
 
452
		$idsMotsCles = array();
453
		$nbVieux = 0;
454
		foreach ($r1 as $r) {
455
			$k = strtolower($r['chemin']);
456
			if (! isset($idsMotsCles[$k])) {
457
				$idsMotsCles[$k] = array();
458
			}
459
			$idsMotsCles[$k][] = $r['id_mot_cle'];
460
			$nbVieux++;
461
		}
462
		$nbNouveaux = count($idsMotsCles);
463
 
464
		echo "Réduction de $nbVieux à $nbNouveaux mots-cles" . PHP_EOL;
465
		$aTraiter = 0;
466
		foreach ($idsMotsCles as $chemin => $ids) {
467
			if (count($ids) > 1) {
468
				$aTraiter ++;
469
				$idCible = array_shift($ids);
470
				foreach ($ids as $idDoublon) {
471
					$this->reductionMotsClesImages($idDoublon, $idCible);
472
				}
473
			}
474
		}
475
		echo "$aTraiter groupes ont été réduits" . PHP_EOL;
476
	}
2191 mathias 477
 
478
	private function reduireEtNormaliserMotsClesImages() {
479
		$this->reduireEtNormaliserMotsCles('cel_arbre_mots_cles_images', 'chemin', 'images');
480
	}
481
 
482
	private function reduireEtNormaliserMotsCles($table, $colonne, $mode = "images") {
483
		echo "Suppression des accents dans la table $table, colonne $colonne ...";
484
		$this->supprimerAccents($table, $colonne);
485
		echo "effectuée \n";
486
		echo "Suppression des majuscules dans la table $table, colonne $colonne ...";
487
		$this->supprimerMajuscules($table, $colonne);
488
		echo "effectuée \n";
489
		echo "\n";
490
		echo "Réduction de tous les mots clés $mode \n";
491
		$req_utilisateurs = "SELECT DISTINCT id_utilisateur FROM ".$table;
492
		$utilisateurs = $this->bdd->recupererTous($req_utilisateurs);
493
 
494
		foreach($utilisateurs as $utilisateur) {
495
			echo "Utilisateur en cours de traitement : ".$utilisateur['id_utilisateur']." \n";
496
			if($mode == "images") {
497
				$this->reductionMotsClesImagesUtilisateur($utilisateur['id_utilisateur']);
498
			} else {
499
				//TODO: créer cette fonction
500
				// $this->reductionMotsClesObsUtilisateur($utilisateur['id_utilisateur']);
501
			}
502
		}
503
		echo "Fin de la réduction des mots clés $mode \n";
504
	}
505
 
506
	private function supprimerMajuscules($table, $colonne) {
507
		$requete = "UPDATE ".$table." SET ".$colonne." = LOWER(".$colonne.")";
508
		$this->bdd->requeter($requete);
509
	}
510
 
511
	private function supprimerAccents($table, $colonne) {
512
 
513
		$requetes = array(
514
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Š','S')",
515
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'š','s')",
516
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ð','Dj')",
517
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ž','Z')",
518
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ž','z')",
519
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'À','A')",
520
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Á','A')",
521
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Â','A')",
522
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ã','A')",
523
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ä','A')",
524
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Å','A')",
525
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Æ','A')",
526
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ç','C')",
527
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'È','E')",
528
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'É','E')",
529
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ê','E')",
530
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ë','E')",
531
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ì','I')",
532
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Í','I')",
533
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Î','I')",
534
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ï','I')",
535
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ñ','N')",
536
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ò','O')",
537
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ó','O')",
538
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ô','O')",
539
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Õ','O')",
540
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ö','O')",
541
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ø','O')",
542
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ù','U')",
543
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ú','U')",
544
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Û','U')",
545
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ü','U')",
546
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ý','Y')",
547
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Þ','B')",
548
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ß','Ss')",
549
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'à','a')",
550
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'á','a')",
551
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'â','a')",
552
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ã','a')",
553
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ä','a')",
554
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'å','a')",
555
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'æ','a')",
556
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ç','c')",
557
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'è','e')",
558
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'é','e')",
559
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ê','e')",
560
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ë','e')",
561
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ì','i')",
562
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'í','i')",
563
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'î','i')",
564
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ï','i')",
565
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ð','o')",
566
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ñ','n')",
567
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ò','o')",
568
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ó','o')",
569
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ô','o')",
570
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'õ','o')",
571
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ö','o')",
572
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ø','o')",
573
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ù','u')",
574
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ú','u')",
575
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'û','u')",
576
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ý','y')",
577
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ý','y')",
578
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'þ','b')",
579
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ÿ','y')",
580
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ƒ','f')",
581
		);
582
 
583
		foreach($requetes as $requete) {
584
			$this->bdd->requeter($requete);
585
		}
586
	}
2094 mathias 587
}
588
?>