Blame | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');// ou ISO-8859-15/*** Description :* Classe Taxons.php permettant de fournir des informations sur les noms scientifiques retenu.* Si l'url finit par /taxons on retourne une liste de noms latin et leurs identifiants (seulement les 100 premeiers noms par défaut).* L'url peut contenir des paramètres optionnels passés après le ? : /taxons?param1=val1¶m2=val2&...** Les paramètres de requête disponibles sont : masque, recherche, rang, distinct, retour.format, nl.format,* nl.structure, navigation.depart et navigation.limite.** Encodage en entrée : utf8* Encodage en sortie : utf8* @package framework-v3* @author Jennifer Dhé <jennifer.dhe@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>* @version 1.0* @copyright 1999-${year} Tela Botanica (accueil@tela-botanica.org)*/class Taxons extends CommunNomsTaxons {/*** Valeur du paramètre de requete recherche stricte, etendue, floue */protected $recherche = false;/** Permet de stocker la requete formulée :* - taxons | taxons/#id | taxons/#id/#champ+#champ* - taxons/#id/relations | taxons/#id/relations/synonymie | taxons/#id/relations/homonymie* | taxons/#id/relations/flores | taxons/#id/relations/superieurs | taxons/#id/relations/inferieurs* - taxons/stats/rangs | taxons/stats/annees | taxons/stats/initiales */protected $format_reponse = 'taxons';/** Représente la première partie de la requete SQL (entre le SELECT et le WHERE)*/protected $requete_champ = 'num_nom, nom_sci, num_nom_retenu, num_tax ';/** Représente la partie de la requete SQL ajoutant une condition (WHERE ...)*/protected $requete_condition = 'num_nom = num_nom_retenu ';/** Représente la partie GROUP BY de la requete SQL (GROUP BY ...) */protected $requete_group_by = ' ';/** Permet de stocker les limite de la requete SQL (par défaut seul les 100 premiers résultats seront retournés). */protected $limite_requete = array('depart' => 0, 'limite' => 100);/** Stocke le num_nom du nom retenu du num_nom recherché */protected $num_nom_taxon;protected $service = 'taxons';protected $presence_num_tax = true;public function consulter($ressources, $parametres) {$resultat_formate = '';$this->initialiserRestClient(); //création d'un objet RestClient$this->traiterParametres($parametres);$this->traiterVersionProjet($ressources) ;if ($this->corps_http == '' && $this->entete_http == '') {foreach ($this->table_version as $version) {$this->table = $version; //on stocke ici la table correspondant à la version du projet analysée$this->recupererNomChamp($this->table);$this->gererNumTax();$this->traiterRessources($ressources);if ($this->corps_http == '' && $this->entete_http == '') {$requete = $this->assemblerLaRequete();$resultat = $this->getBdd()->recupererTous($requete);if ($resultat == '') { //cas ou la requete comporte des erreurs$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,'Fct consulter() : La requete formée comporte une erreur !!');} elseif ($resultat) {$res_version[$version] = $resultat;} else { //cas ou la requete renvoi un tableau vide$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,'Données introuvables dans la base '.$version.' <br/>L\'identifiant demande n\'est pas un taxon et aucun taxon ne lui a ete attribue');}}}}if ($this->corps_http == '' && $this->entete_http == '') {$resultat_formate = $this->retournerResultatFormate($res_version);}$this->formerReponseHTTP($resultat_formate);}/**** Permet d'analyser les paramètres* @param array $parametres*/public function traiterParametres($parametres) {$this->table_param = $parametres;if (isset($parametres) && ($parametres)) {if (isset($parametres['recherche']) && $parametres['recherche'] != '') {$this->recherche = $parametres['recherche'];}foreach ($parametres as $param => $val) {switch ($param) {case 'ns_format' : $this->html = $val; break;case 'ns_structure' : $this->remplirTableCompositionNom($val);$this->requete_champ .= ' ,'.implode(', ',$this->compo_nom); break;case 'masque' : $this->ajouterFiltreMasque($val); break;case 'masque_nt' : $this->ajouterFiltreMasqueNt($val); break;case 'masque_rg' : $this->requete_condition .= ' AND rang = '.$this->getBdd()->proteger($val); break;case 'navigation_depart': $this->limite_requete['depart'] = $val; break;case 'navigation_limite': $this->limite_requete['limite'] = $val; break;case 'retour_format' : $this->retour_format = $val; break;case 'recherche' : break;default : $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,'Erreur dans les parametres de recherche de votrerequete : </br> Le parametre " '.$param.' " n\'existe pas.');break;}}}}public function ajouterFiltreMasque($val) {if ($this->recherche == 'etendue') {$val = str_replace(' ','%', $val);$val .= '%';$this->requete_condition .= ' AND nom_sci LIKE '.$this->getBdd()->proteger($val);} elseif ($this->recherche == 'floue') {$this->requete_condition .= ' AND (SOUNDEX(nom_sci) = SOUNDEX(\''.$val.'\')'.' OR SOUNDEX(REVERSE(nom_sci)) = SOUNDEX(REVERSE(\''.$val.'\'))) ';} else {$this->requete_condition .= ' AND nom_sci LIKE '.$this->getBdd()->proteger($val);}}public function ajouterFiltreMasqueNt($val) {if (strrpos($val, ',') !== false) {$ids_taxon = explode(",", $val);} else {$ids_taxon[] = $val;}foreach ($ids_taxon as $id) {$this->requete_condition .= ' OR num_tax = '.$this->getBdd()->proteger($id);}$this->requete_condition = str_replace('num_nom = num_nom_retenu OR ','num_nom = num_nom_retenu AND (' , $this->requete_condition).')';}/*** Permet d'ajouter à la requete_champ les parametres demandés qui composeront le nom_sci.* Permet de remplir le tableau compo_nom qui regroupe les parametres demandés qui composeront le nom_sci.* (parametres à ajouter aux nom_sci sous la forme : Auteur [annee, biblio] [addendum])* @param la valeur du parametre nl.structure*/public function recupererParametreNom($valeur) {$structure_nom = explode(",",$valeur);foreach ($structure_nom as $structure) {switch ($structure) {case 'au' : $this->compo_nom['au'] = 'auteur'; break;case 'an' : $this->compo_nom['an'] = 'annee'; break;case 'bib' : $this->compo_nom['bib'] = 'biblio_origine'; break;case 'ad' : $this->compo_nom['ad'] = 'nom_addendum'; break;default : $this->renvoyerErreur( RestServeur::HTTP_CODE_MAUVAISE_REQUETE,'Erreur : Le parametre "'.$structure.'" n\'existe pas. <br/><br/>Les parametres du nom possibles sont :<li> au (auteur)</li><li> an (annee)</li><li> bib (bibliographie)</li><li> ad (nom_addendum)</li>');break;}}if (isset($this->compo_nom)) {$this->requete_champ .= ' ,'.implode(', ',$this->compo_nom);}}//------------------------------------------Fonction ressources---------------------------------------------------------------------public function gererNumTax() {if (!in_array('num_tax', $this->champs_table)) {$this->presence_num_tax = false;$this->requete_champ = str_replace(', num_tax ', '', $this->requete_champ);} else {$this->presence_num_tax = true;}}public function traiterRessourcesIdentifiant() {$this->format_reponse = 'taxons/id';$this->num_nom_taxon = $this->recupererNumNomTaxon(); //on recupere le taxon correspondant au num_nom recherchéif ($this->entete_http == '') {$this->requete_condition = ' num_nom = '.$this->num_nom_taxon;if (isset($this->table_ressources[1]) && !empty($this->table_ressources[1])) {//---------------- requete de type taxons/#id/#champ+#champ--------------------------------------if ($this->table_ressources[1] != 'relations') {// SELECT *, nom_sci FROM bftfx_v2_00 WHERE num_nom = X;$this->requete_champ = ' *, nom_sci ';$this->format_reponse .= '/champ';//---------------- requete de type taxons/#id/relations/#relation--------------------------------} elseif ($this->table_ressources[1] == 'relations') {$this->traiterRessourceIdRelations();} else {$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,'Erreur dans votre requete </br> Ressources disponibles : <br/><li> #id/relations </li> <li> #id/#champ+#champ </li> <li> #id/relations </li><li> #id/relations/inferieurs </li> <li> #id/relations/superieurs </li>');}} else {//--------------- requete de type taxons/#id-----------------------------------------------------$this->requete_champ = ' *, nom_sci ';}}}/*** Permet de récupérer le num_nom du taxon recherché. Soit le numéro taxonomique est demandé (avec nt: )* soit un num_nom dont on recherche le num_nom_retenu*/public function recupererNumNomTaxon() {$identifiant = '';if (strrpos($this->table_ressources[0], 'nt:') !== false) {if ($this->presence_num_tax) {// SELECT num_nom FROM bdtfx_v2_00 WHERE num_nom = num_nom_retenu AND num_tax = X;$this->requete_condition = ' num_nom = num_nom_retenu AND num_tax = '.str_replace('nt:', '', $this->table_ressources[0]).' ';} else {$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,'Erreur dans votre requete : </br> Le numero taxonomique n\'existe pas dans ce projet' );}} else {// SELECT num_nom FROM bdtfx_v2_00 WHERE num_nom = (SELECT num_nom_retenu FROM bdtfx_v2_00 WHERE num_nom = X);$this->requete_condition = ' num_nom = (SELECT num_nom_retenu FROM '.$this->table.' WHERE num_nom = '.$this->table_ressources[0].')';}if ($this->entete_http == '') {//on récupere l'identifiant du taxon correspondant au num_nom ou num_tax demandé pour pouvoir l'afficher$res = '';$req_tax = 'SELECT num_nom FROM '.$this->table.' WHERE '.$this->requete_condition;$res_tax = $this->getBdd()->recuperer($req_tax);//on recherche ensuite les identifiants des taxons supérieurs ou inférieursif ($res_tax == '') {$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,'Le numéro de taxon ou l\'identifiant de nom correspondant au num_nom '.$this->table_ressources[0].' n\'existe pas dans la table '.$this->table);} elseif ($res_tax) {$identifiant = $res_tax['num_nom'];} else {$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,'Le numéro de taxon ou l\'identifiant de nom correspondant au num_nom '.$this->table_ressources[0].' n\'existe pas dans la table '.$this->table);}}return $identifiant;}public function traiterRessourceIdRelations() {//----------------- requete de type taxons/#id/relations-------------------------------------------// SELECT *, nom_sci FROM bftfx_v2_00 WHERE num_nom = X;$this->format_reponse .= '/relations';if (isset($this->table_ressources[2])) {//------------- requete de type taxons/#id/relations/#relation--------------------------------switch ($this->table_ressources[2]) {case 'superieurs' : $rel = 'recupererIdSup';$this->format_reponse .= '/superieurs';$this->traiterRessourceIdRelationInfSup($rel); break;case 'inferieurs' : $rel = 'recupererIdInf';$this->format_reponse .= '/inferieurs';$this->traiterRessourceIdRelationInfSup($rel); break;default : $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,'Erreur dans votre requête </br> Ressources disponibles : <br/><li> taxons/#id/relations </li> <li> taxons/#id/relations/flores </li><li> taxons/#id/relations/homonymie </li> <li> #id/relations/inferieurs </li><li> #id/relations/superieurs </li>'); break;}}}public function traiterRessourceIdRelationInfSup($rel) {//Appel de la fct récupérerIdSup ou recupererIdInf : retourne les num_nom des noms inferieurs ou superieurs$res_relation = $this->$rel();//analyse du résultat retourné par la requete de recherche des identifiants correspondant aux taxons inf|sup :if ($res_relation == '') { //dans le cas ou la requete comporte des erreurs$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,'Fct traiterRessourceIdHomonymie : La requete forme comporte une erreur !!');} elseif ($res_relation) {//dans le cas ou une ou plusieurs relations est retournée, on récupère les identifiants ss la forme (id, id, id)foreach ($res_relation as $ligne) $res[] = $ligne['num_nom'];$res = implode(',',$res);$this->requete_condition = ' num_nom IN ('.$res.')';$this->requete_champ .= ', rang, num_tax_sup ';} else { //dans le cas ou aucune relation n'existe$res = array($this->num_nom_taxon => null);$this->corps_http = json_encode($res);$this->entete_http = RestServeur::HTTP_CODE_OK;}}public function recupererIdInf() {//SELECT num_nom FROM bfdtx_v2_00 WHERE num_tax_sup = (SELECT num_nom FROM bdtfx_v2_00 WHERE num_nom = X);$req_relation = 'SELECT num_nom FROM '.$this->table.' WHERE num_tax_sup = (SELECT num_nom FROM '.$this->table.' WHERE '.$this->requete_condition.')';$res_relation = $this->getBdd()->recupererTous($req_relation);return $res_relation;}public function recupererIdSup() {//SELECT num_nom FROM bfdtx_v2_00 WHERE num_nom = (SELECT num_tax_sup FROM bdtfx_v2_00 WHERE num_nom = X);$req_relation = 'SELECT num_nom FROM '.$this->table.' WHERE num_nom = (SELECT num_tax_sup FROM '.$this->table.' WHERE '.$this->requete_condition.')';$res_relation = $this->getBdd()->recupererTous($req_relation);return $res_relation;}public function traiterRessourceStatsInitiales() {// SELECT count(nom_sci) as nb, rang, left(nom_sci, 2) as lettre FROM bdtfx_v2_00 GROUP BY rang, left(nom_sci, 2);$this->format_reponse = 'taxons/stats/initiales';$this->requete_champ = 'count(nom_sci) as nb, rang, left(nom_sci, 2) as lettre ';$this->requete_group_by = ' GROUP BY rang, left(nom_sci, 2) ';}public function traiterRessourceStatsRangs() {// SELECT count(*) as nombre, rang FROM bdtfx_v2_00 [WHERE rang = 290] GROUP BY rang ORDER BY rang;$this->format_reponse = 'taxons/stats/rangs';$this->requete_champ = 'count(*) as nombre, rang ';$this->requete_group_by = ' GROUP BY rang ORDER BY rang ';}public function traiterRessourceStatsAnnees() {// SELECT count(*) as nombre, annee FROM bdtfx_v2_00 GROUP BY annee ORDER BY annee;$this->format_reponse = 'taxons/stats/annees';$this->requete_champ = 'count(*) as nombre, annee ';$this->requete_group_by = ' GROUP BY annee ORDER BY annee ';}//-----------------------------FONCTIONS DASSEMBLAGE DE LA REQUETE-----------------------------------------------------public function assemblerLaRequete() {if ($this->format_reponse != 'taxons/stats/initiales') {$this->mettreAuFormat(); //on remplace les nom_sci par les nom_sci_html}if ($this->requete_condition != '') {$this->requete_condition = ltrim($this->requete_condition, ' AND, WHERE');$this->requete_condition = ' WHERE '.$this->requete_condition;}if ($this->format_reponse != 'taxons' && $this->format_reponse != 'taxons/id/relations/homonymie') {$this->requete_limite = '';} elseif (($depart = $this->limite_requete['depart']) > ($this->total_resultat = $this->recupererTotalResultat())) {$this->limite_requete['depart'] = (($this->total_resultat - $this->limite_requete['limite']) < 0) ? 0 : ($this->total_resultat - $this->limite_requete['limite']);$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];} else {$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];}$requete = ' SELECT '.$this->requete_champ.' FROM '.$this->table.$this->requete_condition.$this->requete_group_by.$this->requete_limite;return $requete;}/*** Recupere le nombre total de résultat d'une requete lancée.* Est utilisée lors de l'affichage du total dans le résultat retourné* @return Le nombre total de résultat*/public function recupererTotalResultat() {$requete = 'SELECT count(*) as nombre FROM '.$this->table.$this->requete_condition.$this->requete_group_by;$res = $this->getBdd()->recuperer($requete);if ($res) {$total = $res['nombre'];} else {$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,'Fct recupererTotalResultat() : <br/>Données introuvables dans la base');}return $total;}//-------------------------FONCTIONS DE FORMATION DU RESULTAT-----------------------------------------------------------/*** Permet de récupérer le résultat à retourner propre à chaque requete et de l'encoder en json* @param array $resultat* @param array $ressources* @return le résultat encoder en json*/public function retournerResultatFormate($resultat) {switch ($this->format_reponse) {case 'taxons/id' : $reponse = $this->formaterId($resultat); break; //ds CommunNomsTaxonscase 'taxons/id/champ' : $reponse = $this->formaterIdChamp($resultat); break; //ds CommunNomsTaxonscase 'taxons/id/relations' : $reponse = $this->formaterIdRelations($resultat); break;case 'taxons/id/relations/superieurs' : $reponse = $this->formaterIdSuperieur($resultat); break;case 'taxons/id/relations/inferieurs' : $reponse = $this->formaterIdInferieur($resultat); break;case 'taxons/stats/annees' : $reponse = $this->formaterStatsAnnee($resultat); break; //ds CommunNomsTaxonscase 'taxons/stats/rangs' : $reponse = $this->formaterStatsRang($resultat); break; //ds CommunNomsTaxonscase 'taxons/stats/initiales' : $reponse = $this->formaterStatsInitiales($resultat); break; //ds CommunNomsTaxonscase 'taxons' : $reponse = $this->formatertaxons($resultat); break;default : break;}return json_encode($reponse);}//----------------------concerne les resultats pour des requetes de type /noms avec ou sans paramètres--------------/**** Est utilisée pour les requetes de type /noms avec ou sans parametres. Détermine le format json ou oss.* @param retourne le résultat sous forme de tableau, à encoder en json.*/public function formaterTaxons($resultat) {if ($this->retour_format == 'oss') {$reponse = $this->formaterEnOss($resultat);} else {$reponse = $this->formaterEnJsonMax($resultat);}return $reponse;}/**** Permet de créer un tableau ($table_retour_json) au format defaut puis de l'encoder en json (json_encode).* Le format comprend deux parties, une partie entete (contenu dans le tableau $entete_json) et une partie* resultat (contenu dans le tableau $resultat_json).* @param string $resultat : résultat de la requete (liste des noms et leur identifiant)* @return une chaine encodé json (format par default)*/public function formaterEnJsonMax($resultat) {$this->recupererTableSignification('correspondance_champs,champs_api,champs_comp');$res = array();foreach ($resultat as $version => $res_version) {//on remplit la table $table_retour_json['entete']if (isset($this->table_param['masque'])) $this->afficherDonnees('masque', $this->table_param['masque']);if (isset($this->table_param['masque_nt'])) $this->afficherDonnees('masque.nt', $this->table_param['masque_nt']);$this->afficherEnteteRangBorneTotalUrls($res_version, '/'.$this->service);$table_retour_json['entete'] = $this->table_retour;$this->table_retour = array();//on remplit la table $table_retour_json['resultat']$tab_tax_inf = $this->recupererListeTaxonInf($res_version);foreach ($res_version as $tab) {$this->resultat_req = $tab;if (isset($this->table_param['masque_nt'])) $this->afficherDonnees('num_tax', $tab['num_tax']);foreach ($tab as $key => $val) {if ($val != '') {switch ($key) {case 'num_nom' : $num = $val;$this->afficherDonnees($key, $val); break;case 'num_nom_retenu' : $retenu = ($val == $num) ? 'true' : 'false';$this->table_retour['retenu'] = $retenu; break;default : break;}}}$this->afficherTaxonInfNb($num, $tab_tax_inf);unset($this->table_retour['id']);$resultat_json[$num] = $this->table_retour;$this->table_retour = array(); //on vide le tableau table_retour}$table_retour_json['resultat'] = $resultat_json;$res = $this->afficherVersionOuPas($version, $table_retour_json, $res);}return $res;}//--------------------concerne les resultats pour des requetes de type noms/id----------------------------------------public function formaterIdRelations($resultat) {$this->recupererTableSignification('correspondance_champs,champs_api,champs_comp');$res = array();foreach ($resultat as $version => $res_version) {$this->resultat_req = $res_version;$retour_id_rel = array ('entete' => array()); //on initialise pr que l'entete apparaisse en premier//on affiche le resultat$superieurs = $this->ajouterRelations('superieurs', $version);if (isset($superieurs)) $retour_id_rel['resultat']['superieurs'] = $superieurs;$inferieurs = $this->ajouterRelations('inferieurs', $version);if (isset($inferieurs)) $retour_id_rel['resultat']['inferieurs'] = $inferieurs;//on renvoit un tableau null si il n'existe aucune relationsif (!isset($retour_id_rel['resultat'])) {$retour_id_rel = null;//on rajoute l'entete si des relations existent} else {$this->afficherDonnees('num_nom', $this->num_nom_taxon); //$this->afficherEnteteRangBorneTotalUrls($resultat, '/'.$this->service.'/'.$this->table_ressources[0].'/relations/synonymie');$retour_id_rel['entete'] = $this->table_retour;$this->table_retour = array();}//recuperation du resultat de chaque version$res = $this->afficherVersionOuPas($version, $retour_id_rel, $res);}return $res;}public function ajouterRelations($relation, $version) {$version = str_replace(Config::get('bdd_table').'_v', '', $version);$res = null;$taxon = $this->num_nom_taxon;$parametres_url = '';if ($this->table_param != array()) $parametres_url = '?'.http_build_query($this->table_param, '', '&');$url = Config::get('url_service').'/'.$version.'/'.$this->service.'/'.$this->table_ressources[0].'/relations/'.$relation.$parametres_url;$relation = $this->rest_client->consulter($url);$entete = $this->rest_client->getReponseEntetes();//Si le service meta-donnees fonctionne correctement, l'entete comprend la clé wrapper_dataif (isset($entete['wrapper_data'])) {$relation = json_decode($relation);if (isset($relation->resultat)) {$res = $relation->resultat;} elseif (isset($relation->$taxon)) { //pour les relations inf et sup$res = $relation->$taxon;}} else {$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,'Le service '.$this->service.' de ce projet comporte des erreurs. url lancée : '.$url);}return $res;}public function formaterIdSuperieur($resultat) {$this->recupererTableSignification('correspondance_champs,champs_api,champs_comp');$res = array();foreach ($resultat as $version => $res_version) {//on remplit le tableau de formatageif (($res_version) != '' ) {//on recupere d'abord les rangs supérieurs$sup = $res_version[0];do {$sup = $this->recupererIdSuperieur($sup['num_tax_sup'], $version);if ($sup['rang'] == '0') $sup['rang'] = '10'; //erreur dans la baseif (isset($sup)) $res_version[] = $sup;} while ($sup != null);krsort($res_version);//on les affiche ensuiteforeach ($res_version as $tab) {$this->resultat_req = $tab;foreach ($tab as $key => $val) {if ($val != '') {switch ($key) {case 'num_nom' : $num = $val;$this->afficherDonnees($key, $num); break;case 'num_nom_retenu' : $retenu = ($val == $num) ? 'true' : 'false';$this->table_retour['retenu'] = $retenu; break;case 'rang' : $this->afficherDonnees($key, $val); break;default : break;}}}unset($this->table_retour['id']);$tab_inf[$num] = $this->table_retour;$this->table_retour = array();}$tab_relation[$this->num_nom_taxon] = $tab_inf;} else { //si il n'existe aucune relation$tab_relation = null;}//recuperation du resultat de chaque version$res = $this->afficherVersionOuPas($version, $tab_relation, $res);}return $res;}public function recupererIdSuperieur($id, $version) {$req = 'SELECT num_nom, num_nom_retenu, num_tax_sup, rang FROM '.$version.' WHERE num_nom = '.$this->getBdd()->proteger($id);$res = $this->getBdd()->recupererTous($req);if ($res) {$resultat = $res[0];} else {$resultat = null; //on return null si il n'y a pas de taxon superieur}return $resultat;}public function formaterIdInferieur($resultat) {$this->recupererTableSignification('champs_api,champs_comp,correspondance_champs');$res = array();foreach ($resultat as $version => $res_version) {//on veut récupérer pour chacun des taxons inférieur le nb de taxons inf :$tab_tax_inf = $this->recupererListeTaxonInf($res_version);//on commence le formatageif (($res_version) != '' ) {foreach ($res_version as $tab) {$this->resultat_req = $tab;foreach ($tab as $key => $val) {if ($val != '') {switch ($key) {case 'num_nom' : $num = $val;$this->afficherDonnees($key, $num); break;case 'num_nom_retenu' : $retenu = ($val == $num) ? 'true' : 'false';$this->table_retour['retenu'] = $retenu; break;default : break;}}}$this->afficherTaxonInfNb($num, $tab_tax_inf);unset($this->table_retour['id']);$tab_inf[$num] = $this->table_retour;$this->table_retour = array(); //on vide le tableau table_retour}$tab_relation[$this->num_nom_taxon] = $tab_inf;} else {$tab_relation = null;}//recuperation du resultat de chaque version$res = $this->afficherVersionOuPas($version, $tab_relation, $res);}return $res;}public function afficherTaxonInfNb($num, $tab_tax_inf) {foreach ($tab_tax_inf as $taxNb) {if ($taxNb['num_tax_sup'] == $num) {$this->table_retour['taxon_inferieur_nbre'] = $taxNb['nb'];}}if (!isset($this->table_retour['taxon_inferieur_nbre'])) {$this->table_retour['taxon_inferieur_nbre'] = '0';}}public function recupererListeTaxonInf($resultat) {// SELECT num_tax_sup, count(*) as nb FROM bdtfx_v2_00 WHERE num_tax_sup IN (id, id, id) AND num_nom = num_nom_retenu GROUP BY num_tax_sup';foreach ($resultat as $tab) {$tab_num[] = $tab['num_nom']; //on regroupe ici les id des taxons dont on cherche le nb de taxon inf}$req = 'SELECT num_tax_sup, count(*) as nb FROM '.$this->table.' WHERE num_tax_sup IN ('.implode(',',$tab_num).') AND num_nom = num_nom_retenu GROUP BY num_tax_sup';$res = $this->getBdd()->recupererTous($req);if ($res) {$resultat = $res;} else {$resultat = array(); //on return un tableau vide s'il n'y a pas de taxon inférieurs}return $resultat;}}?>