Rev 906 | Rev 930 | 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 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 temporaire
public 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és
case '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 nom
case '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;
}
}
?>