Rev 2138 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?phpclass Maintenance extends Script {protected $bdd;protected $parametres_autorises = array('-mc' => 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 erreurprotected 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 erreurprotected 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 '<pre>'.print_r($liaisons_a_inserer, true).'</pre>';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);}}?>