Rev 3136 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Classe de nettoyage de la base de données du CEL.* Suppression des antislash* Remplacement des chaines vides par des NULL* Unifier les référentiels : pas de nom de version, majuscule...* Unifier les certitudes* Supprimer les INSEE-C: non rempli, les dates 0000-00** Utilisation :* - <code>/opt/lamp/bin/php cli.php nettoyage -a (voir méthode executer)</code>** @category CEL* @package Scripts* @subpackage Nettoyage* @author Delphine CAUQUIL <delphine@tela-botanica.org>* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>* @copyright 1999-2016 Tela Botanica <accueil@tela-botanica.org>*/class Nettoyage extends Script {protected $bdd;protected $colonnes;public function __construct($script_nom, $parametres_cli) {parent::__construct($script_nom, $parametres_cli);$this->bdd = new Bdd();}public function executer() {$cmd = $this->getParametre('a');$requete_colonnes = "SELECT column_name FROM information_schema.columns WHERE table_name = 'tb_nettoye_cel.cel_obs' AND table_schema='tb_cel';";$this->colonnes = $this->bdd->recupererTous($requete_colonnes);try {switch ($cmd) {case 'tout' :$this->supprimerRetourLigne();$this->supprimerAntislash();$this->supprimerGuillement();$this->unifierNull();$this->unifierNomReferentiel();$this->unifierCertitude();$this->supprimerCertitudeAutre();$this->unifierUtilisateur();$this->verifierCodeInsee();$this->verifierGeodatum();$this->analyserMotsCles();$this->supprimerInfosLiesObsInexistante();$this->unifierNull();break;case 'supprimerAntislash' :$this->supprimerAntislash();break;case 'unifierNomReferentiel' :$this->unifierNomReferentiel();break;case 'unifierCertitude' :$this->unifierCertitude();break;case 'supprimerCertitudeAutre' : // après unifier certitude si les autres valeurs sont bien à supprimer$this->supprimerCertitudeAutre();break;case 'analyserMotsCles' : // après unifier certitude si les autres valeurs sont bien à supprimer$this->analyserMotsCles();break;case 'verifierGeodatum' :$this->verifierGeodatum();break;case 'verifierCodeInsee' :$this->verifierCodeInsee();break;case 'unifierNull' : // lancer en dernier pour bien réussir$this->unifierNull();break;case 'supprimerInfosLiesObsInexistante' :$this->supprimerInfosLiesObsInexistante();break;case 'unifierUtilisateur' :$this->unifierUtilisateur();break;default :$msg = "Erreur : la commande '$cmd' n'existe pas!\n"."Commandes existantes : regenererMotsClesTexteObs, regenererMotsClesTexteImages". ", regenererMotsClesTexteObsTout, regenererMotsClesTexteImagesTout". ", viderMotsClesTexteImagesSansMotsCles, viderMotsClesTexteObsSansMotsCles". ", regenererChampsTailleImage, reparerLiaisonsOublieesObs, reparerLiaisonsOublieesImages". ", reparerLiaisonsObsParMotsClesTexte, reductionMotsClesImages, reductionMotsClesImagesUtil". ", reduireEtNormaliserMotsClesImagesUtil, reduireEtNormaliserMotsClesImages". ", reductionMotsClesObs, reductionMotsClesObsUtil, reduireEtNormaliserMotsClesObsUtil". ", reduireEtNormaliserMotsClesObs";throw new Exception($msg);}} catch (Exception $e) {$this->traiterErreur($e->getMessage());}}private function supprimerRetourLigne() {foreach ($this->colonnes as $id=>$colonne) {echo "Suppression des retour ligne dans la colonne ".$colonne['column_name']." ...";$requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = REPLACE(".$colonne['column_name'].', "\n", "")';$this->bdd->requeter($requete);echo "effectuée \n";}}private function supprimerAntislash() {foreach ($this->colonnes as $id=>$colonne) {echo "Suppression des antislash dans la colonne ".$colonne['column_name']." ...";$requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = REPLACE(".$colonne['column_name'].', "\", "")';$this->bdd->requeter($requete);echo "effectuée \n";}}private function supprimerGuillemet() {foreach ($this->colonnes as $id=>$colonne) {echo "Suppression des guillements dans la colonne ".$colonne['column_name']." ...";$requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = REPLACE(".$colonne['column_name'].',"\"", "")';$this->bdd->requeter($requete);echo "effectuée \n";}}private function unifierNull() {$requete_colonnes = "SELECT column_name FROM information_schema.columns WHERE table_name = 'tb_nettoye_cel.cel_obs' AND table_schema='tb_cel';";$colonnes = $this->bdd->recupererTous($requete_colonnes);foreach ($colonnes as $colonne) {echo "Suppression des vides dans la colonne ".$colonne['column_name']." ...";$dsl = array( 'transmission', 'altitude');if (isset($dsl[$colonne['column_name']])) {$requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = NULL WHERE ".$colonne['column_name']."= ''";} else {$requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = NULL WHERE ".$colonne['column_name']."= '' OR ".$colonne['column_name']." IN ('INSEE-C:', '0000-00-00 00:00:00', '0.00000')";}$this->bdd->requeter($requete);echo "effectuée \n";}}private function unifierCertitude() {echo "Uniformisation du champ certitude/identification";$certitude = array("A déterminer" => "à déterminer","À déterminer, voir photo" => "à déterminer","aDeterminer" => "à déterminer","déterminer" => "à déterminer","Inconnue" => "à déterminer","Ceraine" => "certain","certain" => "certain","Certainaaua" => "certain","Certaine" => "certain","Certaine K- rhizines blanche" => "certain","Certaine ( mais voir notes)" => "certain","Certaine (à 99%)" => "certain","Certaine Anett" => "certain","Certaine Anette" => "certain","Certaine Valériane officinale" => "certain","Certaine, Faite et confirmée par JM BERAUD" => "certain","Certaine, par Jean Lebail" => "certain","Certaine, subsp. minus" => "certain","Certainea" => "certain","Certaineanno" => "certain","Certainearia n" => "certain","Certainee" => "certain","Certainej" => "certain","Certainel" => "certain","CertaineNom de travai" => "certain","CertaineNom de travail" => "certain","Certainesites" => "certain","Certainesous-bois de feuillus en versant sud à sud-ouest" => "certain","Certaineu" => "certain","sure" => "certain","validée sur forum Naturalistes de l'ouest" => "certain","à confirmer" => "douteux","à approfondir" => "douteux","à cofirmer" => "douteux","À confiermer" => "douteux","A confirlmer" => "douteux","A confirmer" => "douteux","à confirmer vs. pumilum" => "douteux","à conirmer" => "douteux","à vérifier" => "douteux","douteuse" => "douteux","Douteuse (canadensis ?)" => "douteux","Douteuse ?" => "douteux","Douteuse à confirmer" => "douteux","Douteuse peut-être cordata" => "douteux","Douteuse, fleurs rouges" => "douteux","douteux" => "douteux","espèce bisannuelle mais non bien déterminée" => "douteux","Incertaine" => "douteux","Pavot douteux" => "douteux","Potentille ansérine, supposé" => "douteux","presque certaine" => "douteux","Quasi Certaine" => "douteux","ssp déterminer" => "douteux","subsp à vérifier" => "douteux","subsp. microphyllum ?" => "douteux","très douteuse" => "douteux","Très probable" => "douteux");foreach ($certitude as $valeur=>$saisie) {$requete = "UPDATE tb_nettoye_cel.cel_obs SET commentaire = concat(commentaire, ' ', certitude), certitude = '".$saisie."' WHERE certitude ='".$valeur."'";$this->bdd->requeter($requete);echo "effectuée \n";}$requete_verif = "SELECT certitude FROM tb_nettoye_cel.cel_obs WHERE certitude NOT IN ('douteux', 'certain', 'aDeterminer', '', NULL)";$verif = $this->bdd->recupererTous($requete_verif);if ($verif != array()) print_r($verif);}private function supprimerCertitudeAutre() {echo "suppression des valeurs non compréhensible du champ certitude/identification";$requete = "UPDATE tb_nettoye_cel.cel_obsSET commentaire = case isnull(commentaire) when 1 THEN certitude ELSE concat(commentaire, ' ', certitude) END,certitude IS NULL WHERE `certitude` NOT IN ('douteux', 'certain', 'aDeterminer', '') and certitude is not NULL";$this->bdd->requeter($requete);echo "effectuée \n";$requete_verif = "SELECT certitude FROM tb_nettoye_cel.cel_obs WHERE certitude NOT IN ('douteux', 'certain', 'aDeterminer', '', NULL)";$verif = $this->bdd->recupererTous($requete_verif);if ($verif != array()) print_r($verif);}private function unifierUtilisateur() {echo "suppression des images anonymes";$requete_anonyme = "DELETE FROM tb_nettoye_cel.`cel_images` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6OR ce_utilisateur = 0) and `courriel_utilisateur` is null";$this->bdd->requeter($requete_anonyme);echo "suppression des tags images anonymes";$requete_anonyme = "DELETE FROM tb_nettoye_cel.`cel_arbre_mots_cles_images` WHERE id_utilisateur in (select ce_utilisateur FROM tb_nettoye_cel.`cel_obs` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6OR ce_utilisateur = 0) and `courriel_utilisateur` is null)";$this->bdd->requeter($requete_anonyme);echo "suppression des tags obs anonymes";$requete_anonyme = "DELETE FROM tb_nettoye_cel.`cel_arbre_mots_cles_obs` WHERE id_utilisateur in (select ce_utilisateur FROM tb_nettoye_cel.`cel_obs` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6OR ce_utilisateur = 0) and `courriel_utilisateur` is null)";$this->bdd->requeter($requete_anonyme);echo "suppression des obs anonymes";$requete_anonyme = "DELETE FROM tb_nettoye_cel.`cel_obs` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6OR ce_utilisateur = 0) and `courriel_utilisateur` is null";$this->bdd->requeter($requete_anonyme);echo "modification des observations ayant une adresse mail en identifiant";$requete_annu_mail = "UPDATE tb_nettoye_cel.`cel_obs` join tela_prod_v4.`annuaire_tela` ON `U_MAIL` = ce_utilisateur SET `ce_utilisateur` = `U_ID`, `prenom_utilisateur` = `U_NAME`, `nom_utilisateur` = `U_SURNAME` ,`courriel_utilisateur` = `U_MAIL` WHERE ce_utilisateur like '%@%'";$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);echo "modification des observations ayant une adresse mail mais pas d'identifiant";$requete_annu_mail = "UPDATE tb_nettoye_cel.`cel_obs` join tela_prod_v4.`annuaire_tela` ON `U_MAIL` = courriel_utilisateur SET `ce_utilisateur` = `U_ID`, `prenom_utilisateur` = `U_NAME`, `nom_utilisateur` = `U_SURNAME` ,`courriel_utilisateur` = `U_MAIL` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6OR ce_utilisateur = 0) and courriel_utilisateur like '%@%'";$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);echo "modification des observations ayant un identifiant";$requete_annu_mail = "UPDATE tb_nettoye_cel.`cel_obs` join tela_prod_v4.`annuaire_tela` ON U_ID = ce_utilisateur SET `prenom_utilisateur` = `U_NAME`, `nom_utilisateur` = `U_SURNAME` ,`courriel_utilisateur` = `U_MAIL` WHERE (ce_utilisateur IS NOT NULL OR LENGTH(ce_utilisateur) > 6) and courriel_utilisateur not like '%@%'";$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);$requete_verif = "SELECT `ce_utilisateur`, `prenom_utilisateur`, `nom_utilisateur`, `courriel_utilisateur` FROM tb_nettoye_cel.cel_obsWHERE ce_utilisateur IS NOT NULL OR LENGTH(ce_utilisateur) > 6";$verif = $this->bdd->recupererTous($requete_verif);if ($verif != array()) print_r($verif);}private function unifierNomReferentiel() {echo "Uniformisation du nom de référentiel";$referentiels = array("BDTFX", "BDTRE", "BDTXA", "APD", "LBF", "ISFAN");foreach ($referentiels as $referentiel) {$requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = '".$referentiel."' WHERE nom_referentiel like '".$referentiel."%'";$this->bdd->requeter($requete);$requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = NULL WHERE nom_sel_nn = '' or nom_sel_nn = '0'";$this->bdd->requeter($requete);$requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = 'APD' WHERE nom_referentiel like 'bdtao%'";$this->bdd->requeter($requete);$requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = 'BDTFX' WHERE nom_referentiel like 'bdnff%'";$this->bdd->requeter($requete);echo "effectuée \n";}$requete_verif = "SELECT nom_referentiel FROM tb_nettoye_cel.cel_obs WHERE nom_referentiel NOT IN ('".implode("', '", $referentiels)."', 'autre')";$verif = $this->bdd->recupererTous($requete_verif);if ($verif != array()) print_r($verif);}private function supprimerInfosLiesObsInexistante() {echo "Supprimer infos liés à obs inexistante";$requete = "DELETE FROM tb_nettoye_cel.`cel_obs_etendues` WHERE `id_observation` not in (select `id_observation` from tb_nettoye_cel.cel_obs);";$this->bdd->requeter($requete);$requete = "DELETE FROM tb_nettoye_cel.`cel_mots_cles_obs_liaison` WHERE `id_element_lie` not in (select `id_observation` from tb_nettoye_cel.cel_obs);";$this->bdd->requeter($requete);$requete = "DELETE FROM tb_nettoye_cel.`cel_mots_cles_images_liaison` WHERE `id_element_lie` not in (select `id_observation` from tb_nettoye_cel.cel_obs);";$this->bdd->requeter($requete);echo "effectuée \n";}private function verifierGeodatum() {echo "Uniformisation du geodatum";$requete = "UPDATE tb_nettoye_cel.cel_obs SET geodatum = 'wgs84' WHERE (latitude IS NOT NULL or latitude != '0.00000') AND geodatum = ''";$this->bdd->requeter($requete);$requete = "UPDATE tb_nettoye_cel.cel_obs SET geodatum = NULL WHERE (latitude IS NULL or latitude == '0.00000')";$this->bdd->requeter($requete);echo "effectuée \n";}private function verifierCodeInsee() {echo "Vérification du code insee";$requete = "UPDATE tb_nettoye_cel.cel_obs SET locality_consistency = '0' WHERE((ce_zone_geo != 'INSEE-C:' and ce_zone_geo like 'INSEE-C:%') and code_insee_calcule != '') andreplace(`ce_zone_geo`, 'INSEE-C:', '') != `code_insee_calcule`";$this->bdd->requeter($requete);$requete = "UPDATE tb_nettoye_cel.cel_obs SET locality_consistency = '1' WHERE((ce_zone_geo != 'INSEE-C:' and ce_zone_geo like 'INSEE-C:%') and code_insee_calcule != '') andreplace(`ce_zone_geo`, 'INSEE-C:', '') = `code_insee_calcule`";$this->bdd->requeter($requete);echo "effectuée \n";}private function analyserMotsCles(){}}