40,6 → 40,20 |
} |
|
|
/** Nettoyer les paramètres pour ne pas accepter les % |
* */ |
public function nettoyerParametres($parametres) { |
$parametresRetour = array(); |
foreach ($parametres as $cle => $valeur) { |
$valSanPourcent = trim($valeur, "% "); |
if ($valSanPourcent != '') { |
$parametresRetour[$cle] = $valeur; |
} |
} |
|
return $parametresRetour; |
} |
|
/** |
* RequeteSansParametres |
* |
49,6 → 63,7 |
* @param array $parametres les paramètres tels qu'il sont passés au script |
* */ |
public function requeteSansParametres($ressources, $parametres) { |
|
$estSansParametres = true; |
|
if (sizeof($ressources) > 0) { |
56,6 → 71,7 |
} |
|
if (sizeof($parametres) > 2) { |
|
// s'il y a plus de 2 paramètres, on est forcément dans le cas où on a demandé des paramètres autre que la navigation |
$estSansParametres = false; |
} else { |
93,7 → 109,7 |
$this->verifierParametresTri(); |
$this->initialiserTri(); |
|
|
$parametres = $this->nettoyerParametres($parametres); |
if ($this->requeteSansParametres($ressources, $parametres)) { |
|
// Lancement du service |
243,6 → 259,7 |
* Charger la clause WHERE en fonction des paramètres de masque |
* */ |
private function chargerClauseWhere() { |
|
$where = array(); |
$tableauMasque = $this->masque->getMasque(); |
if (!empty($tableauMasque)) { |
335,7 → 352,11 |
'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').' AND '. |
'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').') OR '. |
'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '. |
'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').') '. |
'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').') OR '. |
'(nom LIKE '.$this->proteger($valeurMasque.'%').') OR '. |
'(prenom LIKE '.$this->proteger($valeurMasque.'%').') OR '. |
'(dob.nom_utilisateur LIKE '.$this->proteger($valeurMasque.'%').') OR '. |
'(dob.prenom_utilisateur LIKE '.$this->proteger($valeurMasque.'%').') '. |
')'; |
} else { |
$masque = '( |
451,44 → 472,190 |
* */ |
private function chargerLiaisons() { |
|
$champs = array('dob.id_observation as id_observation', 'nom_sel', 'nom_sel_nn', 'nt', 'famille', 'ce_zone_geo', 'zone_geo', |
'lieudit', 'station', 'milieu', 'date_observation', 'dob.mots_cles_texte as mots_cles_texte', 'dob.commentaire as commentaire', |
'di.mots_cles_texte as mots_cles_texte_image ', 'date_transmission', 'di.id_image as id_image', 'di.ce_utilisateur as ce_utilisateur', |
'prenom', 'nom', 'courriel', 'dob.prenom_utilisateur', 'dob.nom_utilisateur', 'dob.courriel_utilisateur', 'nom_original'); |
// Attention le LEFT JOIN est indispensable pour ramener les images n'ayant pas de votes |
// en cas de tri par votes |
$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS '.implode(', ',$champs).' '. |
($this->doitJoindreTableVotes() ? |
', IF(dvote.ce_protocole = '.$this->parametres['protocole'].', AVG(dvote.valeur), 0) as total_votes ' : |
'' |
). |
($this->doitJoindreTableTags() ? |
// attention le DISTINCT est indispensable ! |
', (COUNT(DISTINCT dtag.id_tag) + '.$this->assemblercomptageOccurencesMotsClesCel().') as total_tags ' : |
'' |
). |
'FROM '.$this->gestionBdd->formaterTable('del_obs_image', 'doi'). |
'INNER JOIN del_image di '. |
'ON doi.id_image = di.id_image '. |
'INNER JOIN del_observation dob '. |
'ON doi.id_observation = dob.id_observation '. |
'LEFT JOIN del_utilisateur du '. |
'ON du.id_utilisateur = di.ce_utilisateur '. |
($this->doitJoindreTableTags() ? |
'LEFT JOIN del_image_tag dtag '. |
'ON doi.id_image = dtag.ce_image AND dtag.actif = 1 ' : |
'' |
). |
($this->doitJoindreTableVotes() ? |
'LEFT JOIN del_image_vote dvote '. |
'ON doi.id_image = dvote.ce_image AND dvote.ce_protocole = '.$this->parametres['protocole'] : |
'' |
); |
$requeteLiaisons .= $this->chargerClauseWhere(); |
$requeteLiaisons .= $this->getTri(); |
// 1. Récupérer les id observation |
$requeteObs = ' SELECT id_observation FROM del_observation dob LEFT JOIN del_utilisateur du ON dob.ce_utilisateur = du.id_utilisateur '; |
|
$masques = $this->masque->getMasque(); |
$conditionsObs = array(); |
|
if (isset($masques['masque'])) { |
$conditionLibre = array(); |
$passe = $masques['masque']; |
|
if (!isset($masques['masque.ns'])) { |
$conditionsLibre[] = "nom_sel LIKE '$passe%'"; |
} |
|
if (!isset($masques['masque.famille'])) { |
$conditionsLibre[] = "famille LIKE '$passe%'"; |
} |
|
if (!isset($masques['masque.milieu'])) { |
$conditionsLibre[] = "nom_sel LIKE '$passe%'"; |
} |
|
if (!isset($masques['masque.tag'])) { |
$conditionsLibre[] = "mots_cles_texte LIKE '%$passe%'"; |
//TODO : voir pour images |
} |
|
if (!isset($masques['masque.date'])) { |
$conditionsLibre[] = $this->creerFiltreDate($passe); |
} |
|
if (!isset($masques['masque.auteur'])) { |
$conditionsLibre[] = $this->creerFiltreAuteur($passe); |
} |
|
$conditionsObs[] = implode(' OR ', $conditionsLibre); |
} |
|
// nom sel |
if (isset($masques['masque.ns'])) { |
$nom_sel = $masques['masque.ns']; |
$conditionsObs[] = "nom_sel LIKE '$nom_sel%'"; |
} |
|
// famille |
if (isset($masques['masque.famille'])) { |
$famille = $masques['masque.famille']; |
$conditionsObs[] = "famille LIKE '$famille%'"; |
} |
|
// genre |
if (isset($masques['masque.genre'])) { |
$genre = $masques['masque.genre']; |
$conditionsObs[] = "nom_sel LIKE '$genre%'"; |
} |
|
// milieu |
if (isset($masques['masque.milieu'])) { |
$milieu = $masques['masque.milieu']; |
$conditionsObs[] = "nom_sel LIKE '$milieu%'"; |
} |
|
// mots_cles_texte |
if (isset($masques['masque.tag'])) { |
$motscles = $masques['masque.tag']; |
$conditionsObs[] = "mots_cles_texte LIKE '%$motscles%'"; |
} |
|
// date |
if (isset($masques['masque.date'])) { |
$date = $masques['masque.date']; |
$conditionsObs[] = $this->creerFiltreDate($date); |
} |
|
// utilisateur |
if (isset($masques['masque.auteur'])) { |
$auteur = $masques['masque.auteur']; |
$conditionsObs[] = $this->creerFiltreAuteur($auteur); |
} |
|
// commune |
if (isset($masques['masque.commune'])) { |
$commune = $masques['masque.commune']; |
$conditionsObs[] = " zone_geo LIKE ".$this->proteger(str_replace(array('-',' '), '_', $commune).'%'); |
} |
|
// commune |
if (isset($masques['masque.departement'])) { |
$dept = $masques['masque.departement']; |
$conditionsObs[] = $this->creerFiltreIdZoneGeo($dept); |
} |
|
if (!empty($conditionsObs)) { |
$where = ' WHERE '.implode(' AND ', $conditionsObs); |
$requeteObs .= $where; |
} |
|
$observations = $this->bdd->recupererTous($requeteObs); |
|
$tabIdsObs = array(); |
foreach ($observations as $observation) { |
$tabIdsObs[] = $observation['id_observation']; |
} |
$idsObs = implode(',', $tabIdsObs); |
if ($idsObs == '') { |
$idsObs = "''"; |
} |
//var_dump($requeteObs); |
// 2. Récupérer les id images |
|
$conditionsImg = array(); |
if (isset($masques['masque.tag'])) { |
$tag = $masques['masque.tag']; |
$conditionsImg[] = " dit.tag_normalise LIKE '$tag%' "; |
$conditionsImg[] = " di.mots_cles_texte LIKE '%$tag%' "; |
} |
|
$idsImages = ''; |
if (!empty($conditionsImg)) { |
$requeteImages = ' SELECT doi.id_image FROM del_obs_image doi '. |
' INNER JOIN del_image di ON doi.id_image = di.id_image '. |
' INNER JOIN del_image_tag dit ON dit.ce_image = di.id_image '; |
|
$where = ' WHERE '.implode(' OR ', $conditionsImg); |
$requeteImages .= $where; |
|
$images = $this->bdd->recupererTous($requeteImages); |
|
$tabIdsImages = array(); |
foreach ($images as $image) { |
$tabIdsImages[] = $image['id_image']; |
} |
$idsImages = implode(',', $tabIdsImages); |
|
if ($idsImages == '') { |
$idsImages = "''"; |
} |
} |
//var_dump($requeteImages);exit(); |
// 3. Récupérer la combinaison des deux |
$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS dob.id_observation as id_observation, nom_sel, nom_sel_nn, nt, famille, ce_zone_geo, zone_geo, lieudit, station, milieu, '. |
' date_observation, dob.mots_cles_texte as mots_cles_texte, dob.commentaire as commentaire, di.mots_cles_texte as mots_cles_texte_image , date_transmission, '. |
' di.id_image as id_image, di.ce_utilisateur as ce_utilisateur, prenom, nom, courriel, dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, nom_original '. |
' FROM del_obs_image DOI '. |
' INNER JOIN del_image di ON doi.id_image = di.id_image '. |
' INNER JOIN del_observation dob ON doi.id_observation = dob.id_observation '. |
' LEFT JOIN del_utilisateur du ON du.id_utilisateur = di.ce_utilisateur '; |
|
|
$where = array(); |
if (!empty($conditionsObs) && strlen($idsObs) > 0) { |
$where[] = 'dob.id_observation IN ( '.$idsObs.') '; |
} |
|
if (!empty($conditionsImg) && strlen($idsImages) > 0) { |
$chaineWhere = 'di.id_image IN ( '.$idsImages.') '; |
// Si on ne cherche pas que le tag, on doit récupérer uniquement les |
// images qui matche avec la recherche d'observation |
if (isset($masques['masque.tag']) && sizeof($masques) > 1) { |
$chaineWhere .= ' AND doi.id_observation IN ('.$idsObs.') '; |
} |
$where[] = $chaineWhere; |
} |
|
if (!empty($where)) { |
$requeteLiaisons .= ' WHERE '.implode(' OR ', $where); |
} |
|
// limite de la chaine idobs = 1047389 |
/*if (strlen($requeteLiaisons) > 1047389) { |
exit('requete trop longue'); |
//return array(); |
}*/ |
|
$requeteLiaisons .= $this->gestionBdd->getLimitSql(); |
|
return $this->bdd->recupererTous($requeteLiaisons); |
|
// on ne lance la requete que si on a trouvé des images ou des observations, sinon |
// cela signifie qu'il n'y a aucune correspondance dans la base |
$retour = array(); |
if (strlen($idsObs) > 0 || strlen($idsImages) > 0) { |
$retour = $this->bdd->recupererTous($requeteLiaisons); |
} |
|
return $retour; |
} |
|
|
501,7 → 668,7 |
// récupérer les ids |
// récupérer les observations |
|
$requeteImages = 'SELECT *, di.mots_cles_texte as mots_cles_texte_image FROM del_obs_image doi '. |
$requeteImages = 'SELECT *, di.mots_cles_texte as mots_cles_texte_image FROM del_obs_image doi '. |
'INNER JOIN del_image di ON doi.id_image = di.id_image '. |
'ORDER BY id_observation DESC'. |
$this->gestionBdd->getLimitSql(); |