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 'reparerLiaisonsOublieesObs' : $this->reparerLiaisonsOublieesObs(); break; case 'reparerLiaisonsOublieesImages' : $this->reparerLiaisonsOublieesImages(); break; case 'regenererChampsTailleImage' : $this->regenererChampsTailleImage(); 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][$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']; 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"; } } ?>