Rev 919 | Rev 935 | Go to most recent revision | Blame | Compare with Previous | 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(), $numero_page = 0, $taille_page = 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;$debut = $taille_page*$numero_page ;$requete_selection_observations .= ' ORDER BY ordre LIMIT '.$debut.','.$taille_page ;$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;$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;}// TODO: fonction temporairepublic function parserRequeteCriteres($chaine_criteres) {$criteres_parses = array();$criteres = explode("&", $chaine_criteres) ;foreach ($criteres as &$critere) {$criteres_parses[] = explode("=",$critere) ;}return $criteres_parses;}private function fabriquerSousRequeteRecherche($id_utilisateur, $criteres) {foreach ($criteres as $nom_valeur){if (count($nom_valeur) == 0){continue;}switch ($nom_valeur[0]) {case 'annee':$sous_requete .= "year(date_observation) = ".$this->proteger($nom_valeur[1]) ;$sous_requete .= ' AND ' ;break;case 'mois':$sous_requete .= "month(date_observation) = ".$this->proteger($nom_valeur[1]) ;$sous_requete .= ' AND ' ;break;case 'jour':$sous_requete .= "day(date_observation) = ".$this->proteger($nom_valeur[1]) ;$sous_requete .= ' AND ' ;break;// TODO: vérifier l'adaptation de la structure aux nouveaux mots cléscase 'mots_cles':$liste_mc = str_replace(";",',',$nom_valeur[1]);$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;//TODO: choisir un meilleur nomcase 'nom_taxon':$nom_valeur[1] = str_replace("*","%",$nom_valeur[1]);$sous_requete .= "(nom_sel LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR courriel_utilisateur LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR prenom_utilisateur LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR nom_utilisateur LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR nom_sel LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR nom_sel_nn LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR nom_ret LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR nom_ret_nn LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR nt LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR famille LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR zone_geo LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR ce_zone_geo LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR date_observation LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR lieudit LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR station LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR milieu LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR commentaire LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR transmission LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR latitude LIKE ".$this->proteger('%'.$nom_valeur[1].'%')." OR longitude LIKE ".$this->proteger('%'.$nom_valeur[1].'%').")";break;default:if(trim($nom_valeur[0]) != ''){$sous_requete .= $nom_valeur[0]." = ".$this->proteger($nom_valeur[1]) ;$sous_requete .= ' AND ' ;}break;}}$sous_requete = rtrim($sous_requete,' AND ');return $sous_requete;}}?>