'', 'Voie' => '@addresse', 'cpVille' => '@ville', 'telFax' => '@(tel, fax)', 'naf' => '@ape_etab' ); /** Séquance d'échappement. **/ protected $form2crit = array('siren' => 'I', 'raisonSociale' => 'S', 'departement' => 'D', 'localite' => 'L', 'cpVille' => 'D', 'numeroVoie' => 'N', 'Voie' => 'R', 'Ville' => 'V', 'SPH_MATCH' => EOF ); protected $mode; // Le MatchingMode de sphinx protected $deb; // La Page de début. protected $nbRep; // Le Nombre de reponse par page protected $max; // Le Nombre maximum de résultats. protected $total_time; // Le temps d'éxecution de la recherche. /** Parametres de la partie debug (Interface de test)**/ protected $quorum; protected $sequances; protected $proximites; protected $poids; protected $actif; /** **/ protected $maxSizeWord; // Taille Minimum des mots pour la raisonSociale protected $Quorumsize; // Inutilisé pour le moment. protected $ProximiteSize; // Taille de la proximite. protected $page; // La page courante. public $html; // HTML propre au debug (interface de test) protected $pertinance; // La pertinence dans la recherche. (sirenage) protected $acronyme; /** * @param $deb Page courante. * @param $nbRep Nombre de reponse / pages * @param $max Nombre Maximum de reponses. * * Fonction de recherche entreprise, ici nous allons crée tous les cas de recherche possible * De la recherche par exact match ou Phonetique en passant par le gestionnaire de condition de Sphinx * A savoir nous retirerons des critéres celon les resultats de sphinx. */ public function __construct() { $this->total_time = 0; $this->quorum = false; $this->sequances = false; $this->proximites = false; $this->poids = false; $this->actif = false; $this->nbRep = 10; $this->max = 1000; $this->debug = true; } public function _initForm($formR) { $formulaire = array(); $ok = false; foreach($formR as $name => $form) { if($name != 'controller' and $name != 'action' and $name != 'module' and $name != 'Envoyer') { if($this->index == 'dir' and ($name == 'nom' or $name == 'prenom' and !$ok)) { $formulaire['raisonSociale'] = $formR['nom'].' '.$formR['prenom']; $ok = true; } $formulaire[$name] = (empty($form))?'':$form; } } $this->formR = $formulaire; } public function databaseJO() { $db = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, 'jo'); if (mysqli_connect_error()) { $this->println('Erreur : Ne peut pas se connecter a la base.'); return; } $db->query("SET NAMES 'utf8';"); return $db; } /** * * Fonction d'entrée dans la classe * Elle s'occupe de setter les parametres de sphinx et d'éxecuter le bon type de recherche. * * @todo voir pour la verification du mode de sortie de sphinx. * Prévoir un input de selection avec les différents modes de sortie. * $this->sphinx->SetSortMode(SPH_SORT_EXTENDED, "@adr_num desc"); * */ public function search() { $pass = 0; $quorumActif = false; $quorum = array(); $array = array(); if(!empty($this->formR['raisonSociale'])) $this->formR['raisonSociale'] = $this->formatRaisonSociale($this->formR['raisonSociale']); foreach($this->formR as $name => $form) { if(array_key_exists($name, $this->form2crit) and !empty($this->formR[$name])) $array[$name] = $form; } $this->formR = $array; if(!$this->sphinx and $this->debug) return (array('Nombre de Réponses :' => 0, 'Nombre de Réponses Totales :' => 0, 'Durée exécution :' => $total_time, 'Erreure :' => 'Le formulaire est Vide !') ); if($this->index == 'ent') $this->sphinx->SetSortMode(SPH_SORT_EXTENDED, 'sirenValide DESC, rang DESC, actif DESC, siege DESC'); $this->sphinx->SetLimits(intval($this->deb), intval($this->nbRep), intval($this->max)); $this->maxSizeWord = 0; switch($this->formR['SPH_MATCH']) { case 'SPH_MATCH_ALL': $this->sphinx->SetMatchMode(SPH_MATCH_ALL); $resSphinx = $this->SPH_MATCH_('SPH_MATCH_ALL'); $this->printStatus($resSphinx); break; case 'SPH_MATCH_ANY': $this->sphinx->SetMatchMode(SPH_MATCH_ANY); $resSphinx = $this->SPH_MATCH_('SPH_MATCH_ANY'); $this->printStatus($resSphinx); break; case 'SPH_MATCH_PHRASE': $this->sphinx->SetMatchMode(SPH_MATCH_PHRASE); $resSphinx = $this->SPH_MATCH_('SPH_MATCH_PHRASE'); $this->printStatus($resSphinx); break; case 'SPH_MATCH_BOOLEAN': $this->sphinx->SetMatchMode(SPH_MATCH_BOOLEAN); $resSphinx = $this->SPH_MATCH_('SPH_MATCH_BOOLEAN'); $this->printStatus($resSphinx); break; case 'SPH_MATCH_EXTENDED': $this->sphinx->SetMatchMode(SPH_MATCH_EXTENDED); $resSphinx = $this->SPH_MATCH_('SPH_MATCH_EXTENDED'); $this->printStatus($resSphinx); break; default: $this->sphinx->SetMatchMode(SPH_MATCH_EXTENDED2); if(!empty($this->formR['raisonSociale']) and $this->index == 'ent') $this->formR['raisonSociale'] = $this->removeSmallWord($this->formR['raisonSociale']); if(!empty($this->formR['Voie'])) $this->formR['Voie'] = $this->formatAdress ($this->formR['Voie']); $resSphinx = $this->SPH_MATCH_('SPH_MATCH_EXTENDED2'); $this->printStatus($resSphinx); break; case 'SPH_MATCH_FULLSCAN': return; } if($resSphinx['matches'] > 0) { $this->setTime($resSphinx['time']); /*$this->getResultSphinx($resSphinx);*/ } return ($this->getResponse($resSphinx)); } /***************************************************************************************************************/ /** Partie Requette **/ /** * Grosse fonction de traitement des sequences ainsi que les différent sequencing de sphinx * Comme la gestion du quorum d'écrémenté sur la raisonSociale et l'Adresse * + La gestion des doublons et des espaces. * * @param $type vaut le type de recherche SPH_MATCH_? * @return les résultats dans le cas ou il y a des résultats. * */ public function SPH_MATCH_($type) { include 'sequence.php'; if($this->debug) $html = ''; $ref = array('acrony', 'normal', 'points', 'split', 'space', 'double', 'quorum'); $i = 0; if($this->detectedSequance() == 'S.S') $valeur = 'S'; else { $valeur = explode(':', $this->detectedSequance()); $valeur = trim($valeur[0]); } print_r($this->formR); foreach($link[$valeur]['id'] as $seqId) { if($this->debug) $html .= '
Séquence : '.$sequence[$link[$valeur]['id'][$i]].'
'; $this->criteresLetters = $sequence[$link[$valeur]['id'][$i]]; $tab = explode('.', $sequence[$link[$valeur]['id'][$i]]); if(in_array('S', $tab)) { $nb = 1; if($this->debug) $html .= ''; for ($quorum = $this->countQorum(); $quorum > 0; $quorum--) { foreach($ref as $seq) { if($this->index != 'ent' and ($seq == 'acrony' or $seq == 'split')) continue; if($link[$valeur][$seq]) { if(isset($passe) and $passe == $sequence[$link[$valeur]['id'][$i]]) $seq = 'quorum'; if(in_array('R', explode('.', $sequence[$link[$valeur]['id'][$i]]))) { for($quorumR = $this->countQorumR(); $quorumR > 0; $quorumR--) { $request = $this->constructQuerySequance($sequence[$link[$valeur]['id'][$i]], $type, array($quorum, $quorumR), $seq); $result = $this->sphinx->Query($request, $this->index); if($this->debug) { $html .=''; $html .= ''; $html .= ''; $html .= ''; if($seq != 'quorum') $html .= ''; else $html .= ''; $html .= ''; } if($result['total'] > 0) break; } if($result['total'] > 0 or $passe == $sequence[$link[$valeur]['id'][$i]]) break; } else { $request = $this->constructQuerySequance($sequence[$link[$valeur]['id'][$i]], $type, array($quorum, false), $seq); $result = $this->sphinx->Query($request, $this->index); if($this->debug) { $html .=''; $html .= ''; $html .= ''; $html .= ''; if($seq != 'quorum') $html .= ''; else $html .= ''; $html .= ''; } if($result['total'] > 0 or $passe == $sequence[$link[$valeur]['id'][$i]]) break; } } if($result['total'] > 0) break; } if($result['total'] > 0) break; $passe = $sequence[$link[$valeur]['id'][$i]]; } if($this->debug) $html .='
'.$nb++.''.$request.''.$result['total'].'/'.$result['total_found']. ''.$seq.' quorum R:'.$quorum.'
'.$nb++.''.$request.''.$result['total'].'/'.$result['total_found']. ''.$seq.' quorum:'.$quorum.'
'; } elseif(in_array('R', $tab)) { if($this->debug) $html .= ''; $nb = 1; for($qv=count(explode(' ', trim($this->formR['Voie']))); $qv > 0; $qv--) { $request = $this->constructQuerySequance($sequence[$link[$valeur]['id'][$i]], $type, array(false, $qv), $seq); $result = $this->sphinx->Query($request, $this->index); if($this->debug) { $html .=''; $html .= ''; $html .= ''; $html .= ''; if($seq != 'quorum') $html .= ''; else $html .= ''; $html .= ''; } if($result['total'] > 0) { break; } } if($this->debug) $html .= '
'.$nb++.''.$request.''.$result['total'].'/'.$result['total_found']. ''.$seq.' quorum:'.$quorum.'
'; } else { if($this->debug) $html .= ''; $request = $this->constructQuerySequance($sequence[$link[$valeur]['id'][$i]], $type, array(false, false), $seq); $result = $this->sphinx->Query(($request != " ")?$request:'', $this->index); if($this->debug) { $html .=''; $html .= ''; $html .= ''; $html .= ''; if($seq != 'quorum') $html .= ''; else $html .= ''; $html .= ''; $html .= '
'.$nb++.''.$request.''.$result['total'].'/'.$result['total_found']. ''.$seq.' quorum:'.$quorum.'
'; } } if($result['total'] > 0) { break; } $i++; } $this->pertinance = $this->levenshteinCrit($sequence[$link[$valeur]['id'][$i]]); if($this->debug) $this->printInformations($html); return ($result); } /** * Cette fonction permet une recherche simple avec les annonce juste un filtre + un champs de recherche * J'ai preferer ne pas la mettre dans le moteur car trop leger pour suporter les requette du moteur se serai une surcharge pour rien... * * getResponse implemente la requete SQL, pour respecter la hierarchie de code ! * @return type */ public function HistoSearch() { if(!empty($this->formR['annee1'])) $this->sphinx->setFilter('annee1', array($this->formR['annee1'])); $resSphinx = $this->sphinx->Query($this->formR['recherche'], $this->index); return ($this->getResponse($resSphinx)); } /** * Gestion de la raison sociale Formatage * avec des preg_replace etc... **/ public function formatRaisonSociale($rs, $double = false) { include 'sequence.php'; if(!empty($this->formR['raisonSociale'])) { $request = ''; $array = explode(' ', $rs); foreach($array as $item) { $item = str_replace('\'', ' ', $item); if((strlen($item) > $this->maxSizeWord and !in_array(strtoupper($item), $wordformRS) and $this->index == 'ent') or strlen($item) > $this->maxSizeWord and count($array) == 1) { if($double) $request .= preg_replace('/(?:([^*])\1)\1*/', '$1', $item).' '; else $request .= $item.' '; } else { $request .= $item.' '; } } return ($request); } } /** * Fonction qui permet de gerer les CP et le Ville * @param type $cp * @return type */ public function formatCP($cp) { $matches = ''; $arrayChamp = explode(' ', trim($cp)); $str = false; for($i=0; $i < count($arrayChamp); $i++) { if(preg_match('/^[0-9]{1,}$/', $cp, $matches)) { if (strlen($matches[0]) == 1 and $matches[0] < 10) { $matches[0] = '0'.$matches[0]; } $size = strlen($matches[0]); if($size >= 2 and $this->index == 'ent' or $this->index == 'dir') { if(substr($matches[0], 0, 2) > 95 ) { // DOM-TOM outre mers $this->sphinx->setFilter('adr_dep', array((int)substr($matches[0], 0, 3))); } else if (substr($matches[0], 0, 2) == 20) { // Teritoire de la corse 2A et 2B @todo Attention a la compilation transformer 2A et 2B en 200 $this->sphinx->setFilter('adr_dep', array(200)); } else { // Classique Metropole $this->sphinx->setFilter('adr_dep', array((int)(substr($cp, 0, 2)))); } if($size == 5) { $this->sphinx->setFilter('adr_cp', array(intval($matches[0]))); } } } else $str .= $arrayChamp[$i]; } return ($str); } public function FiltreDateDeNaissance() { if(!empty($this->formR['dirDateNaissMM'])) { if($this->formR['dirDateNaissMM'] > 0 and $this->formR['dirDateNaissMM'] < 12) { if(($this->formR['dirDateNaissMM'] % 2) != 0 ) { if($this->formR['dirDateNaissJJ'] > 0 and $this->formR['dirDateNaissJJ'] < 31) { $this->sphinx->setFilter('naiss_jour', array($this->formR[dirDateNaissJJ])); } } else { if($this->formR['dirDateNaissJJ'] > 0 and $this->formR['dirDateNaissJJ'] < 29) { $this->sphinx->setFilter('naiss_jour', array($this->formR[dirDateNaissJJ])); } } } } else { if(!empty($this->formR['dirDateNaissJJ'])) { $this->sphinx->setFilter('naiss_jour', array($this->formR[dirDateNaissJJ])); } } if($this->formR['dirDateNaissAAAA'] > 0 and $this->formR['dirDateNaissAAAA'] < date('Y')) { $this->sphinx->setFilter('naiss_annee', array($this->formR[dirDateNaissAAAA])); } } /** * Retire les petits mots de la raisonSociale. * @param $rs => raisonSociale * @return raisonSociale modifié. */ public function removeSmallWord($rs) { include 'sequence.php'; $array = explode(' ', $rs); if(count($array) > 2) { foreach($array as $item) { if(strlen($item) > 1 and !in_array(strtoupper($item), $wordformRS)) { $request .= $item.' '; } else if (strlen($item) == 1) { $this->acronyme .= $item; } } } return ((empty($request))?$rs:$request); } /** * Elle format l'adresse. * @param $adress * @return adresse modifié. */ public function formatAdress($adress) { require_once 'sequence.php'; $adr = explode(' ', $adress); foreach($adr as $item) { if(!in_array($item, $adrRef)) { $request .= $item.' '; } } return ($request); } /***************************************************************************************************************/ /** Partie Sequance **/ /** * Calcule le quorum selon le nombre de mots présents dans la RS. * @return Nombre. */ public function countQorum() { $i=0; $val = explode(' ', $this->formR['raisonSociale']); foreach($val as $item) { if(empty($item)) unset($val[$i]); $i++; } return (count($val)); } public function countQorumR() { $i=0; $val = explode(' ', $this->formR['Voie']); foreach($val as $item) { if(empty($item)) unset($val[$i]); $i++; } return (count($val)); } /***************************************************************************************************************/ /** Partie Sequance **/ /** * Permet de determiner la sequence celon les parametres entré dans les formulaire. * @return sequence formater sous ce type "S.D.R : RaisonSociale Departement Voie" */ public function detectedSequance() { $sequance = ""; foreach($this->formR as $name => $form) { if($name != 'SPH_MATCH' and !empty($this->formR[$name])) { $sequance .= '.'.$this->form2crit[$name]; $values .= $name.', '; } } return (substr($sequance,1).' : '.$values); } /** * Elle construit la requette pour sphinx celon certain parametre et un certain formatage. * * @param $sequances de format "S.D.V" * @param $type type de recherche sphinx SPH_MATCH_? * @param $qorum pour la raisons sociale * @param $seq type de sequence "espace, normal, double" * @return $request bien formater pour sphinx. */ protected function constructQuerySequance($sequances, $type, $quorum, $seq) { $this->sphinx->ResetFilters(); $adresse = '@adresse "'; $ville = '@ville "'; $request = ''; foreach($this->form2crit as $name => $crit) { $diff = explode('.', $sequances); if(in_array($crit, $diff)) { if ($name == 'raisonSociale') { $request = $request .= (($type=='SPH_MATCH_EXTENDED' or $type=='SPH_MATCH_EXTENDED2')?'@nom ':'').''; switch($seq) { case 'radica': //$request = substr(trim($this->formR['raisonSociale']), 0, 3); continue; break; case 'quorum': $request .= ' "'.$this->formR[$name].'"'.(($quorum[0] >= 1)?'/'.$quorum[0]:''); break; case 'space': $request .= '"'.str_replace(' ', '', $this->formatRaisonSociale($this->formR[$name])).'" | '; $request .= '"'.str_replace(' ', '', $this->formatRaisonSociale($this->formR[$name], true)).'"'; break; case 'double': if(strlen($this->formR[$name]) > 5) { $request .= '"'.$this->formatRaisonSociale($this->formR[$name], true).'" | '; $request .= '"'.$this->formatRaisonSociale($this->formR[$name], true).'" '.(($quorum[0] >= 1)?'/'.$quorum[0]:'').' '; } else continue; break; case 'points': $request .= '"'.str_replace('.', '', $this->formR[$name]).'"'; break; case 'acrony': if(!empty($this->acronyme) and strlen($this->acronyme) > 2) { $request .= '"'.$this->acronyme.' '.$this->formatRaisonSociale($this->formR[$name]).'"/'.$quorum[0]; } else continue; break; case 'split': for($count=0;$count < 2; $count++) { $rs = (($i == 0)?trim($this->formR[$name]):str_replace('.', '', trim($this->formR[$name]))); $precedent = ''; $request .= '('; if(count(explode(' ', $rs)) == 1) { for($i=0; $i < strlen($rs); $i++) { $precedent .= $rs[$i]; $request .= ' "'.$precedent.' '.substr($rs, $i+1).'"'.(($i+1 != strlen($rs))?' ':''); if($i+1 < strlen($rs)) $request .= ' | '; } } $request .=($count == 0)?') |':')'; } break; default: if($this->index == 'act') $request .= '"'.$this->formR[$name].'" /'.(count(explode(' ', $this->formR['raisonSociale']))-1).' | '; else $request .= '"'.$this->formR[$name].'"'; if(strlen($this->formR[$name]) > 5) $request .= ' | @nom "'.$this->formatRaisonSociale($this->formR[$name], true).'"'; } } else if($name == 'cpVille') { $str = $this->formatCP($this->formR[$name]); if($str != false) { $adresse .= $str; } } else if($name == 'Ville') { $ville .= $this->formR[$name].' '; } else if($name == 'naf') { $this->sphinx->setFilter('naf', array($this->formR[$name])); } else if($name == 'Voie') { $adresse .= $this->formR[$name].' '; } else if ($name == 'siret') { if(strlen($this->formR[$name]) == 14) { $this->sphinx->setFilter('siren', array(substr($this->formR[$name], 0, 9))); $this->sphinx->setfilter('nic', array(substr($this->formR[$name], 9))); } else if (strlen($this->fomrR[$name]) == 9) { $this->sphinx->setFilter('siren', array($this->formR[$name])); } } else if($name == 'numeroVoie') { $this->sphinx->setFilter('adr_num', array($this->formR[$name])); } else if($name == 'actMin' or $name == 'actMax') { if(!empty($this->formR['actMin']) and !empty($this->formR['actMax'])) $this->sphinx->SetFilterRange('PminNum', $this->formR['actMin'], $this->formR['actMax']); } else if ($name == 'dirDateNaissJJ' or $name == 'dirDateNaissMM' or $name = 'dirDateNaissAAAA') { $this->FiltreDateDeNaissance(); } else if ($this->actif) { $this->sphinx->setFilter('actif', array(1)); }else { $request .= $this->formR[$name].' '; } } } if($adresse != '@adresse "') { $request = $request .' '.$adresse.'"'. (($quorum[1]!=false)?'/'.$quorum[1]:''); } if($ville != '@ville "') $request = $request .' '.$ville.'"'; echo $request.'
'; return ($request); } /***************************************************************************************************************/ /** Partie Pertinence **/ /* La pertinence doit être calculé a partir des critères recherche ( la séquence utilisé ) moins la séquence avec la quelle * ont a trouvé les résultat ainsi que la distance des mots de la RS ou des l'adresse. * exemple : * S = scores et decisions * D = 78 * V = Rambouillet(s) * * SDV = 20; resultat de base * -> 0 resultats * SD = 15; * -> 1 resultat * V = levenshtein : ~1 alors 5-1 (étant le poid de V) = 4 donc 15+4 = 19 pourquoi -1, La proximité est proche plus le nombre est grand plus l'éloignement l'est. * total pertinence = 19 * * @param $formR * @param $mySql */ protected function levenshteinCrit($crit) { $pertinance = 0; $weight = array('I' => 10, 'S' => 9, 'D' => 6, 'L' => 4, 'V' => 5, 'N' => 2, 'R' => 3); $crit = explode('.', $crit); for($i=0; $i < count($crit); $i++) { $pertinance += $weight[$crit[$i]]; } return ($pertinance); } protected function checkParamsRS($rs) { if(strlen($rs) > 3) return (false); else return (true); } protected function getPertinence($formR, $mySql) { $formR = strtoupper($formR); $mySql = strtoupper($mySql); $array = explode(' ', $mySql); $array2 = explode(' ', $formR); for($i = 0;$i < count($array2); $i++) { if(in_array($array2[$i], $array)) { $size += levenshtein($formR, $mySql); } } return (($size)?$size:100); } /***************************************************************************************************************/ /** Partie Reponse **/ public function getResponse($resSphinx) { $i= 0; $response = array(); switch($this->index) { case 'ent': $sql = 'SELECT rang, raisonSociale, CONCAT(siren, nic) AS siret, rang, siren, nic, siege, raisonSociale, sigle, enseigne, (siren > 200) AS sirenValide, adr_num, adr_typeVoie, adr_libVoie, adr_comp, adr_cp, adr_ville, tel, fax, cj, actif, ape_etab, ape_entrep FROM etablissements WHERE id IN ('; foreach($resSphinx['matches'] as $elements) { /*$sql .= 'id='.$elements['id'];*/ $sql .= $elements['id']; if($i+1 < count($resSphinx['matches'])) $sql .= ', '; $i++; } $sql .= ") ORDER BY sirenValide DESC, rang DESC, actif DESC, siege DESC"; //echo $sql;exit; break; case 'dir': $sql = 'SELECT e.id, e.raisonSociale, CONCAT(e.siren, e.nic) AS siret, e.siren, e.nic, e.siege, e.raisonSociale, e.sigle, e.enseigne, e.adr_num, e.adr_typeVoie, e.adr_libVoie, e.adr_comp, e.adr_cp, e.adr_ville, e.tel, e.fax, e.cj, e.actif, e.ape_etab, ape_entrep, d.nom, d.prenom, l.libelle AS fonction_lib from rncs_dirigeants = d, etablissements e, bodacc_fonctions l WHERE d.id IN ('; foreach($resSphinx['matches'] as $elements) { $sql .= $elements['id']; if($i+1 < count($resSphinx['matches'])) $sql .= ', '; $i++; } $sql .= ' ) AND d.siren=e.siren and d.fonction_code=l.codeFct AND e.siege=1 GROUP BY d.siren, d.id ORDER BY e.rang DESC, e.actif DESC, e.siege DESC, e.id ASC'; break; case 'act': $sql = 'SELECT DISTINCT e.siren, l.id AS lienId, l.actif AS lienActif, l.source, l.Pmin, l.PpPm, l.id2, '. 'l.Siren2, l.RaisonSociale, l.Pays, '. 'IF(l.dateUpdate>IF(l.dateInsert>l.dateLien,l.dateInsert,l.dateLien),l.dateUpdate,IF(l.dateInsert>l.dateLien,l.dateInsert,l.dateLien)) AS dateLien, '. 'e.id, CONCAT(siren,nic) AS siret, siren, nic, siege, e.raisonSociale, sigle, '. 'enseigne, adr_num, adr_typeVoie, adr_libVoie, adr_comp, adr_cp, adr_ville, '. 'tel, fax, cj, e.actif, ape_etab, ape_entrep, e.rang '. 'FROM liens l, etablissements e '. 'WHERE l.id IN ('; foreach($resSphinx['matches'] as $elements) { $sql .= $elements['id']; if($i+1 < count($resSphinx['matches'])) $sql .= ', '; $i++; } $sql .= ") AND l.Siren1=e.siren AND siege=1 AND e.actif=1 ORDER BY e.rang DESC"; break; case 'Histo' : $sql = 'SELECT Histo as Loc, id, nomFichier, annee1, bod, texte FROM bodacc_cor WHERE id IN ( '; foreach($resSphinx['matches'] as $elements) { $sql .= $elements['id']; if($i+1 < count($resSphinx['matches'])) $sql .= ', '; $i++; } $sql .= ')'; break; } $i = 0; $response['criteres'] = $this->criteresLetters; $response['nbReponses'] = $resSphinx['total']; $response['nbReponsesTotal'] = $resSphinx['total_found']; $response['duree'] = $this->total_time; $db = $this->databaseJO(); $result = $db->query($sql); while($row = mysqli_fetch_assoc($result)) { if($this->index != 'Histo') { $response['reponses'][$i]['Siret'] = $row['siret']; $response['reponses'][$i]['Siren'] = $row['siren']; $response['reponses'][$i]['Nic'] = $row['nic']; $response['reponses'][$i]['Siege'] = $row['siege']; $response['reponses'][$i]['Nom'] = $row['raisonSociale']; $response['reponses'][$i]['Nom2'] = ''; $response['reponses'][$i]['Sigle'] = $row['sigle']; $response['reponses'][$i]['Enseigne'] = $row['enseigne']; $response['reponses'][$i]['Adresse'] = $row['adr_num'].' '.$row['adr_typeVoie'].' '.$row['adr_libVoie']; $response['reponses'][$i]['Adresse2'] = $row['adr_comp']; $response['reponses'][$i]['CP'] = $row['adr_cp']; $response['reponses'][$i]['Ville'] = $row['adr_ville']; $response['reponses'][$i]['Tel'] = $row['tel']; $response['reponses'][$i]['Fax'] = $row['fax']; $response['reponses'][$i]['FJ'] = $row['cj']; $response['reponses'][$i]['Actif'] = $row['actif']; $response['reponses'][$i]['NafEtab'] = $row['ape_etab']; $response['reponses'][$i]['NafEnt'] = $row['ape_entrep']; } switch($this->index) { case 'ent': $pertinence = $this->getPertinence($this->formR['raisonSociale'], $row['raisonSociale']); $response['reponses'][$i]['Pertinence'] = $pertinence; $response['reponses'][$i]['rang'] = $row['rang']; break; case 'act': $response['reponses'][$i]['ActNomRs'] = $row['raisonSociale']; $response['reponses'][$i]['ActPays'] = $row['Pays']; $response['reponses'][$i]['ActDateLien'] = $row['dateLien']; $response['reponses'][$i]['ActActif'] = $row['actif']; $response['reponses'][$i]['ActPmin'] = $row['Pmin']; break; case 'dir': $response['reponses'][$i]['DirRs'] = ''; $response['reponses'][$i]['DirNom'] = $row['nom']; $response['reponses'][$i]['DirPrenom'] = $row['prenom']; $response['reponses'][$i]['DirNomUsage'] = ''; $response['reponses'][$i]['DirDateEffet'] = ''; $response['reponses'][$i]['DirFonction'] = $row['fonction_lib']; $response['reponses'][$i]['DirDepart'] = ''; break; case 'Histo': $response['reponses'][$i]['Localisation'] = $row['Loc']; $response['reponses'][$i]['Fichier'] = $row['nomFichier']; $response['reponses'][$i]['Annee'] = $row['annee']; $response['reponses'][$i]['Code'] = $row['bod']; $response['reponses'][$i]['Texte'] = $row['texte']; $response['reponses'][$i]['id'] = $row['id']; $response['reponses'][$i]['Pertinence'] = $resSphinx[$row['id']]['weight']; break; } $i++; } return ($response); } /***************************************************************************************************************/ /** Partie debug **/ protected function cmp($a, $b) { return (($a < $b)?-1:1); } public function getResultSphinx($resSphinx) { $response = $this->getResponse($resSphinx); /** Sortir les resultats par pertinence **/ //usort($response, array($this, 'cmp')); $html .= '
    '; if($this->index == 'ent') { for($i= 0; $i < count($response['reponses']); $i++) { $html .= '
  1. ['.$response['reponses'][$i]['Pertinence'].'] [ '.$response['reponses'][$i]['Siren'].' ] '.$response['reponses'][$i]['Nom'].' '.$response['reponses'][$i]['CP'].' '.$response['reponses'][$i]['Adresse'].' '.$response['reponses'][$i]['Ville'].'
  2. '; } } else if ($this->index == 'act') { for($i= 0; $i < count($response['reponses']); $i++) { $html .= '
  3. '.$response['reponses'][$i]['ActNomRs'].' '.$response['reponses'][$i]['ActPays'].' '.$response['reponses'][$i]['ActDateLien'].' '.$response['reponses'][$i]['ActPmin'].'
  4. '; } } else if ($this->index == 'dir') { for($i= 0; $i < count($response['reponses']); $i++) { $html .= '
  5. '.$response['reponses'][$i]['DirNom'].' '.$response['reponses'][$i]['DirPrenom'].' '.$response['reponses'][$i]['Nom'].'
  6. '; } } $html .= '
'; $this->printInformations($html); $critere = explode(':', $this->detectedSequance()); $html = 'Critères detectés : '.$critere[0].'
'; $this->printInformations($html); } protected function printStatus($response) { if(!$response) { return ($this->printError('Erreur : '.$this->sphinx->GetLastError())); } if ($this->sphinx->GetLastWarning()) { return ($this->printError('Erreur : '.$this->sphinx->GetLastWarning())); } $html = 'Résultats trouvés : '.$response['total'].' sur '.$response['total_found'].' trouvé en '.$response['time'].' secondes !
'; $html .= '
Statistiques de recherches :
'; $html .= '
    '; if(isset($response['words'])) { foreach($response['words'] as $words => $info) { $html .= '
  1. '.$words.' a été trouvé '.$info['hits'].' fois
  2. '; } } $html .= '
'; $this->printInformations($html); } protected function printError($error) { $this->html .= '
'; $this->html .= $error; $this->html .= '
'; } protected function printInformations($informations) { if($this->debug) { $this->html .= '
'; $this->html .= $informations; $this->html .= '
'; } } /***************************************************************************************************************/ /** Partie Setters **/ public function setSortMode($mode) { switch($mode) { case 'SPH_SORT_RELEVANCE': return (SPH_SORT_RELEVANCE); case 'SPH_SORT_ATTR_DESC': return (SPH_SORT_ATTR_DESC); case 'SPH_SORT_ATTR_ASC': return (SPH_SORT_ATTR_ASC); case 'SPH_SORT_TIME_SEGMENTS': return (SPH_SORT_TIME_SEGMENTS); case 'SPH_SORT_EXTENDED': return (SPH_SORT_EXTENDED); case 'SPH_SORT_EXPR': return (SPH_SORT_EXPR); default: return (SPH_SORT_RELEVANCE); } } public function setForm($form) { $this->formR = $form; } public function setSphinx($sphinx) { $this->sphinx = $sphinx; } public function execute($sphinx) { $this->sphinx = $sphinx; return $this->search(); } public function setTime($time) { $this->total_time += $time; } public function setMaxSizeWord($size) { $this->maxSizeWord = $size; } public function setSequance($bool = true) { $this->sequances = $bool; } public function setQuorums($bool = true) { $this->quorum = $bool; } public function setProximotes($bool = true) { $this->proximites = $bool; } public function setPoids($bool = true) { $this->poids = $bool; } public function setActif($bool = true) { $this->actif = $bool; } public function setQuorumsize($size) { $this->Quorumsize = $size; } public function setProximiteSize($size) { $this->ProximiteSize = $size; } public function setNbRep($max) { $this->nbRep = $max; } public function setDebug($bool = true) { $this->debug = $bool; } public function setPage($page) { $this->page = $page; } public function setDeb($deb) { $this->deb = $deb; } public function setMax($max) { $this->max = $max; } public function setIndex($index) { $this->index = $index; } /***************************************************************************************************************/ } ?>