Rev 959 | Blame | Last modification | View Log | RSS feed
<?php/*** PHP Version 5** @category PHP* @package jrest* @author Aurélien Peronnet <aurelien@tela-botania.org>* @copyright 2010 Tela-Botanica* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL* @version SVN: <svn_id>* @link /doc/jrest/*//*** in : utf8* out : utf8** Librairie recherche d'observations a partir de divers critères**/class RechercheObservation extends Cel {public function obtenirIdObservationsPourOrdre($id_utilisateur, $ordre) {$requete_selection_id = 'SELECT id_observation FROM cel_obs WHERE ordre ';if(is_array($ordre)) {$ordre = array_map(array($this,'proteger'), $ordre);$requete_selection_id .= ' IN ('.implode(',',$ordre).') ';} else {$requete_selection_id .= ' = '.$this->proteger($ordre).' ';}$requete_selection_id .= ' AND ce_utilisateur = '.$this->proteger($id_utilisateur);$requete_selection_id .= ' ORDER BY id_observation';$resultat_ids = $this->requeter($requete_selection_id);$ids = array();if(is_array($resultat_ids)) {foreach ($resultat_ids as $resultat) {$ids[] = $resultat['id_observation'];}}return $ids;}public function rechercherObservations($id_utilisateur = null, $criteres = array(), $debut = 0, $limite = 50) {$requete_selection_observations = 'SELECT * FROM cel_obs ';if($id_utilisateur != null) {$requete_selection_observations .= 'WHERE ce_utilisateur = '.$this->proteger($id_utilisateur).' AND ';} else if(count($criteres) > 0) {$requete_selection_observations .= 'WHERE ';}$sous_requete_recherche = $this->fabriquerSousRequeteRecherche($id_utilisateur, $criteres);$requete_selection_observations .= $sous_requete_recherche;$requete_selection_observations = rtrim($requete_selection_observations, 'AND ');$requete_selection_observations .= ' ORDER BY ordre LIMIT '.$debut.','.$limite ;$resultats_observations = array();$resultats_observations = $this->requeter($requete_selection_observations);return $resultats_observations;}public function compterObservations($id_utilisateur = null, $criteres = array()) {$requete_selection_observations = 'SELECT COUNT(*) as nb_obs FROM cel_obs ';if($id_utilisateur != null) {$requete_selection_observations .= 'WHERE ce_utilisateur = '.$this->proteger($id_utilisateur).' AND ';} else if(count($criteres) > 0) {$requete_selection_observations .= 'WHERE ';}$sous_requete_recherche = $this->fabriquerSousRequeteRecherche($id_utilisateur, $criteres);$requete_selection_observations .= $sous_requete_recherche;$requete_selection_observations = rtrim($requete_selection_observations, 'AND ');$nb_obs = '0';$resultat_requete_nombre_observations = $this->requeter($requete_selection_observations);if($resultat_requete_nombre_observations && is_array($resultat_requete_nombre_observations) && count($resultat_requete_nombre_observations) > 0) {$nb_obs = $resultat_requete_nombre_observations[0]['nb_obs'];}return $nb_obs;}public function formaterPourEnvoiCel($tableau_observations) {foreach($tableau_observations as &$observation) {$observation['ce_zone_geo'] = $this->convertirCodeZoneGeoVersCodeInsee($observation['ce_zone_geo']);$ids_mots_cles = $this->getIdsMotsClesObservation($observation['id_observation']);$mots_cles_chaine = '';foreach($ids_mots_cles as $id_mot_cle) {$mots_cles_chaine .= $id_mot_cle['id_mot_cle_utilisateur'].';';}$mots_cles_chaine = rtrim($mots_cles_chaine,';');$observation['mots_cles'] = $mots_cles_chaine;}return $tableau_observations;}private function getIdsMotsClesObservation($id_observation) {$requete_selection_mots_cles = 'SELECT DISTINCT id_mot_cle_utilisateur '.'FROM cel_obs_mots_cles '.'WHERE id_observation = '.$id_observation;return $this->requeter($requete_selection_mots_cles);}// TODO: fonction temporairepublic function parserRequeteCriteres($chaine_criteres) {$criteres_parses = array();$criteres = explode("&", $chaine_criteres) ;foreach($criteres as &$critere) {$nom_valeur = explode("=",$critere) ;if(count($nom_valeur) >= 2) {$criteres_parses[$nom_valeur[0]] = $nom_valeur[1];}}return $criteres_parses;}private function fabriquerSousRequeteRecherche($id_utilisateur, $criteres) {foreach ($criteres as $nom => $valeur){if($valeur == null || trim($nom) == "" || trim($valeur) == "") {continue;}switch ($nom) {case 'annee':$sous_requete .= "year(date_observation) = ".$this->proteger($valeur) ;$sous_requete .= ' AND ' ;break;case 'mois':$sous_requete .= "month(date_observation) = ".$this->proteger($valeur) ;$sous_requete .= ' AND ' ;break;case 'jour':$sous_requete .= "day(date_observation) = ".$this->proteger($valeur) ;$sous_requete .= ' AND ' ;break;case 'departement':$sous_requete .= "ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$valeur.'___');$sous_requete .= ' AND ' ;break;case 'commune':$sous_requete .= "zone_geo = ".$this->proteger($valeur);$sous_requete .= ' AND ' ;break;case 'id_mots_cles':$liste_mc = '"'.str_replace(';','","',$valeur).'"';$sous_requete .= '' ;$sous_requete .= 'id_observation IN (SELECT id_observation FROM cel_obs_mots_cles WHERE id_mot_cle_utilisateur IN ('.$liste_mc.'))';$sous_requete .= ' AND ' ;break;case 'mots_cles':// TODO: gérer la recherche sur les mots clés textuelsbreak;//TODO: choisir un meilleur nomcase 'nom_taxon':$valeur = str_replace("*","%",$valeur);$sous_requete .= "(nom_sel LIKE ".$this->proteger('%'.$valeur.'%')." OR courriel_utilisateur LIKE ".$this->proteger('%'.$valeur.'%')." OR prenom_utilisateur LIKE ".$this->proteger('%'.$valeur.'%')." OR nom_utilisateur LIKE ".$this->proteger('%'.$valeur.'%')." OR nom_sel LIKE ".$this->proteger('%'.$valeur.'%')." OR nom_sel_nn LIKE ".$this->proteger('%'.$valeur.'%')." OR nom_ret LIKE ".$this->proteger('%'.$valeur.'%')." OR nom_ret_nn LIKE ".$this->proteger('%'.$valeur.'%')." OR nt LIKE ".$this->proteger('%'.$valeur.'%')." OR famille LIKE ".$this->proteger('%'.$valeur.'%')." OR zone_geo LIKE ".$this->proteger('%'.$valeur.'%')." OR ce_zone_geo LIKE ".$this->proteger('%'.$valeur.'%')." OR date_observation LIKE ".$this->proteger('%'.$valeur.'%')." OR lieudit LIKE ".$this->proteger('%'.$valeur.'%')." OR station LIKE ".$this->proteger('%'.$valeur.'%')." OR milieu LIKE ".$this->proteger('%'.$valeur.'%')." OR commentaire LIKE ".$this->proteger('%'.$valeur.'%')." OR transmission LIKE ".$this->proteger('%'.$valeur.'%')." OR latitude LIKE ".$this->proteger('%'.$valeur.'%')." OR longitude LIKE ".$this->proteger('%'.$valeur.'%').")";break;default:if(trim($nom) != ''){$sous_requete .= $nom." = ".$this->proteger($valeur) ;$sous_requete .= ' AND ' ;}break;}}$sous_requete = rtrim($sous_requete,' AND ');return $sous_requete;}}?>