array(false, '1', 'Mot clef à chercher pour régénérer les machins') ); public function __construct($script_nom, $parametres_cli) { parent::__construct($script_nom, $parametres_cli); $this->bdd = new Bdd(); } public function executer() { $cmd = $this->getParametre('a'); try { switch ($cmd) { case 'regenererMotsClesTexteObs' : $this->regenererMotsClesTexteObs(); break; case 'regenererMotsClesTexteImages' : $this->regenererMotsClesTexteImages(); break; case 'regenererMotsClesTexteObsTout' : $this->regenererMotsClesTexteObs(true); break; case 'regenererMotsClesTexteImagesTout' : $this->regenererMotsClesTexteImages(true); break; case 'viderMotsClesTexteImagesSansMotsCles' : $this->viderMotsClesTexteImagesSansMotsCles(); break; case 'viderMotsClesTexteObsSansMotsCles' : $this->viderMotsClesTexteObsSansMotsCles(); break; case 'regenererChampsTailleImage' : $this->regenererChampsTailleImage(); break; case 'reparerLiaisonsOublieesObs' : $this->reparerLiaisonsOublieesObs(); break; case 'reparerLiaisonsOublieesImages' : $this->reparerLiaisonsOublieesImages(); break; case 'reparerLiaisonsObsParMotsClesTexte' : $mot_clef = $this->getParametre('mc'); $this->reparerLiaisonsObsParMotsClesTexte($mot_clef); break; default : $msg = "Erreur : la commande '$cmd' n'existe pas!\n". "Commandes existantes : regenererMotsClesTexteImages, regenererMotsClesTexteObs"; throw new Exception($msg); } } catch (Exception $e) { $this->traiterErreur($e->getMessage()); } } // Régénère le champ "mots_cles_texte" pour toutes les images ayant des mots clés mais ayant ce champ // vide, suite à une erreur protected function regenererMotsClesTexteImages($tout = false) { $req = "SELECT id_image FROM cel_images WHERE ". "id_image IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)"; if(!$tout) { $req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')"; } $res = $this->bdd->recupererTous($req); echo count($res) . " images trouvées\n"; foreach ($res as $image) { $req = "UPDATE cel_images SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_images cm " . "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'] . "') " . "WHERE id_image = '" . $image['id_image'] . "'"; $this->bdd->requeter($req); } } // Régénère le champ "mots_cles_texte" pour toutes les observations ayant des mots clés mais ayant ce champ // vide, suite à une erreur protected function regenererMotsClesTexteObs($tout = false) { $req = "SELECT id_observation FROM cel_obs WHERE ". "id_observation IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)"; if(!$tout) { $req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')"; } $res = $this->bdd->recupererTous($req); echo count($res) . " observations trouvées\n"; foreach ($res as $image) { $req = "UPDATE cel_obs SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_obs cm " . "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'] . "') " . "WHERE id_observation = '" . $image['id_observation'] . "'"; $this->bdd->requeter($req); } } // Vide le champ "mots_cles_texte" pour toutes les images n'ayant aucun mot clé protected function viderMotsClesTexteImagesSansMotsCles() { $req = "UPDATE cel_images SET mots_cles_texte = NULL WHERE id_image NOT IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)"; $res = $this->bdd->requeter($req); echo "$res images mises à jour\n"; } // Vide le champ "mots_cles_texte" pour toutes les obs n'ayant aucun mot clé protected function viderMotsClesTexteObsSansMotsCles() { $req = "UPDATE cel_obs SET mots_cles_texte = NULL WHERE id_observation NOT IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)"; $res = $this->bdd->requeter($req); echo "$res observations mises à jour\n"; } protected function regenererChampsTailleImage() { $req = "SELECT id_image FROM cel_images WHERE hauteur = 0 OR largeur = 0"; $res = $this->bdd->recupererTous($req); echo count($res)." images concernees \n"; echo "Début du traitement \n"; $images_maj = 0; $image_meta_ratees = 0; $images_inexistantes = 0; foreach($res as $image) { $chemin = $this->getCheminImage($image['id_image']); if(file_exists($chemin)) { list($largeur, $hauteur) = @getimagesize($chemin); if(is_numeric($largeur) && is_numeric($hauteur)) { $req_maj = "UPDATE cel_images SET hauteur = '".$hauteur."', largeur = '".$largeur."' ". "WHERE id_image = '".$image['id_image']."'"; $maj_taille_image = $this->bdd->requeter($req_maj); if($maj_taille_image) { $images_maj++; } } else { $image_meta_ratees++; } } else { $images_inexistantes++; } $this->afficherAvancement("\tImages traitées : ", 1); } echo "\n"; echo "Fin de la régénération des tailles des images à partir des metadonnées \n"; echo $images_maj." images ont vu leur infos de taille régénérées \n"; echo $image_meta_ratees." images ont raté l'extraction de metadonnées \n"; echo $images_inexistantes." images n'existent pas en tant que fichier \n"; } private function getCheminImage($id) { $chemin_base = Config::get('dossierImages'); $id = sprintf('%09s', $id); $id = wordwrap($id, 3 , '_', true); list($dossierNiveau1, $dossierNiveau2) = explode('_', $id); $chemin = $chemin_base.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/O/'.$id.'_O.jpg'; return $chemin; } protected function reparerLiaisonsOublieesObs() { // Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car // dans la table de liaison il est souvent vide $requete_liaisons = "SELECT com.id_observation, com.id_mot_cle_obs, co.ce_utilisateur ". "FROM `cel_obs_mots_cles` com INNER JOIN cel_obs co ON co.id_observation = com.id_observation "; $liaisons = $this->bdd->recupererTous($requete_liaisons); $nb_liaisons_originales = count($liaisons); // Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé $requete_mots_cles = "SELECT id_mot_cle_obs, id_utilisateur, mot_cle FROM cel_mots_cles_obs "; $anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles); $anciens_mots_cles_fmt = array(); foreach($anciens_mots_cles as &$ancien_mot_cle) { $id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur']; if(!isset($anciens_mots_cles_fmt[$id_utilisateur_ancien])) { $anciens_mots_cles_fmt[$id_utilisateur_ancien] = array(); } $anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_obs']] = $ancien_mot_cle; } // Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot $requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_obs"; $nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles); $nouveau_mots_cles_fmt = array(); foreach($nouveau_mots_cles as &$nouveau_mot_cle) { $id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur']; if(!isset($nouveau_mots_cles_fmt[$id_utilisateur_nouveau])) { $nouveau_mots_cles_fmt[$id_utilisateur_nouveau] = array(); } $nouveau_mots_cles_fmt[$id_utilisateur_nouveau][strtolower($nouveau_mot_cle['mot_cle'])] = $nouveau_mot_cle; } $anciens_mot_cles_pas_trouves = 0; $nouveaux_mot_cles_pas_trouves = 0; $utilisateurs_pas_trouves = 0; $valeurs_a_inserer = array(); $ids_obs = array(); foreach($liaisons as &$liaison) { $id_utilisateur_liaison = $liaison['ce_utilisateur']; $id_mot_cle_ancien_liaison = $liaison['id_mot_cle_obs']; if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) { if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) { $texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle']; $texte_ancien_mot_cle = strtolower($texte_ancien_mot_cle); // l'astuce de ouf ! if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) { if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) { $nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle']; $valeurs_a_inserer[] = array( 'id_element_lie' => $liaison['id_observation'], 'id_mot_cle' => $nouvel_id_mot_cle, 'ancienne_liaison' => $liaison ); $ids_obs[] = $liaison['id_observation']; } else { $nouveaux_mot_cles_pas_trouves++; } } else { } } else { $anciens_mot_cles_pas_trouves++; } } else { $utilisateurs_pas_trouves++; } } echo "Anciennes liaisons ".$nb_liaisons_originales." \n"; echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n"; echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n"; echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n"; echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n"; $tranches = array_chunk($valeurs_a_inserer, 800); foreach($tranches as $tranche) { $requete_insertion = "INSERT IGNORE INTO cel_mots_cles_obs_liaison (id_element_lie, id_mot_cle) ". "VALUES "; foreach($tranche as $l) { $requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),"; } $requete_insertion = rtrim($requete_insertion, ','); $insertion = $this->bdd->requeter($requete_insertion); $this->afficherAvancement("Liaisons insérées (par paquet de 800) ", 1); } echo "\n"; } private function reparerLiaisonsOublieesImages() { // Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car // dans la table de liaison il est souvent vide $requete_liaisons = "SELECT cim.id_image, cim.id_mot_cle_image, ci.ce_utilisateur ". "FROM cel_images_mots_cles cim INNER JOIN cel_images ci ON ci.id_image = cim.id_image "; $liaisons = $this->bdd->recupererTous($requete_liaisons); // Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé $requete_mots_cles = "SELECT id_mot_cle_image, id_utilisateur, mot_cle FROM cel_mots_cles_images "; $anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles); $anciens_mots_cles_fmt = array(); foreach($anciens_mots_cles as &$ancien_mot_cle) { $id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur']; if(!isset($anciens_mots_cles_fmt[$id_utilisateur_ancien])) { $anciens_mots_cles_fmt[$id_utilisateur_ancien] = array(); } $anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_image']] = $ancien_mot_cle; } // Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot $requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_images"; $nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles); $nouveau_mots_cles_fmt = array(); foreach($nouveau_mots_cles as &$nouveau_mot_cle) { $id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur']; if(!isset($nouveau_mots_cles_fmt[$id_utilisateur_nouveau])) { $nouveau_mots_cles_fmt[$id_utilisateur_nouveau] = array(); } $nouveau_mots_cles_fmt[$id_utilisateur_nouveau][$nouveau_mot_cle['mot_cle']] = $nouveau_mot_cle; } $anciens_mot_cles_pas_trouves = 0; $nouveaux_mot_cles_pas_trouves = 0; $utilisateurs_pas_trouves = 0; $valeurs_a_inserer = array(); foreach($liaisons as &$liaison) { $id_utilisateur_liaison = $liaison['ce_utilisateur']; $id_mot_cle_ancien_liaison = $liaison['id_mot_cle_image']; if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) { if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) { $texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle']; if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) { if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) { $nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle']; $valeurs_a_inserer[] = array( 'id_element_lie' => $liaison['id_image'], 'id_mot_cle' => $nouvel_id_mot_cle, 'ancienne_liaison' => $liaison ); $ids_imgs[] = $liaison['id_image']; } else { $nouveaux_mot_cles_pas_trouves++; } } else { } } else { $anciens_mot_cles_pas_trouves++; } } else { $utilisateurs_pas_trouves++; } } echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n"; echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n"; echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n"; echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n"; $tranches = array_chunk($valeurs_a_inserer, 800); foreach($tranches as $tranche) { $requete_insertion = "INSERT IGNORE INTO cel_mots_cles_images_liaison (id_element_lie, id_mot_cle) ". "VALUES "; foreach($tranche as $l) { $requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),"; } $requete_insertion = rtrim($requete_insertion, ','); $insertion = $this->bdd->requeter($requete_insertion); $this->afficherAvancement("Liaisons insérées (par paquet de 800) ", 1); } echo "\n"; } private function reparerLiaisonsObsParMotsClesTexte($mot_cle_texte_recherche) { $ancienne_table_obs = Config::get('table_obs_recup'); $requete_anciens_mots_cles_texte = "SELECT ce_utilisateur, id_observation, mots_cles_texte ". "FROM ".$ancienne_table_obs." WHERE mots_cles_texte LIKE '%".$mot_cle_texte_recherche."%'"; $obs_a_mot_cle = $this->bdd->recupererTous($requete_anciens_mots_cles_texte); $requete_nouveaux_mots_cle = "SELECT * FROM cel_arbre_mots_cles_obs ". "WHERE id_utilisateur IN ". "(SELECT id_utilisateur FROM ".$ancienne_table_obs." ". "WHERE mots_cles_texte LIKE '%".$mot_cle_texte_recherche."%')"; $nouveaux_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cle); $mots_cles_indexes = array(); foreach($nouveaux_mots_cles as $mot_cle) { $mots_cles_indexes[$mot_cle['id_utilisateur']][strtolower($mot_cle['mot_cle'])] = $mot_cle; } $liaisons_a_inserer = array(); $utilFoirax = 0; $mcFoirax = 0; foreach($obs_a_mot_cle as $obs) { $mots_cles_texte_tab = explode(',', $obs['mots_cles_texte']); $id_observation = $obs['id_observation']; $id_utilisateur = $obs['ce_utilisateur']; foreach($mots_cles_texte_tab as $mot_cle_t) { if($mot_cle_t == $mot_cle_texte_recherche) { if (isset($mots_cles_indexes[$id_utilisateur])) { if (isset($mots_cles_indexes[$id_utilisateur][strtolower($mot_cle_t)])) { $id_nouveau_mot_cle = $mots_cles_indexes[$id_utilisateur][strtolower($mot_cle_t)]['id_mot_cle']; } else { $mcFoirax++; } } else { $utilFoirax++; } $liaisons_a_inserer[] = array('id_element_lie' => $id_observation, 'id_mot_cle' => $id_nouveau_mot_cle); } } } echo "Utilisateurs pas dans le tableau: $utilFoirax\n"; echo "Motf-clefs pas dans le tableau: $mcFoirax\n"; //echo '
'.print_r($liaisons_a_inserer, true).'
'; echo "Liaisons à insérer: " . count($liaisons_a_inserer) . " \n"; $requete_insertion = "INSERT IGNORE INTO cel_mots_cles_obs_liaison (id_element_lie, id_mot_cle) ". "VALUES "; foreach($liaisons_a_inserer as $l) { $requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),"; } $requete_insertion = rtrim($requete_insertion, ','); $insertion = $this->bdd->requeter($requete_insertion); } } ?>