117,7 → 117,7 |
|
// contrainte du point d'entrée d'API webservice Tela lors d'un GET |
public function consulter($ressources, $parametres, $db = NULL) { |
if(!$db) { |
if (!$db) { |
// http_response_code(500); |
throw new Exception('no DB', 500); |
} |
124,19 → 124,21 |
|
// parser la requête et filtrer les paramètres valides |
// en cas d'accès HTTP |
if(array_key_exists('QUERY_STRING', $_SERVER)) { |
if (array_key_exists('QUERY_STRING', $_SERVER)) { |
self::requestParse($uri, $params); |
} |
// en cas d'accès phpunit |
else { |
} else {// en cas d'accès phpunit |
$uri = $ressources; |
} |
|
// renvoie du plain/text d'aide (cf fin de programme) |
if(count($uri) == 1 && $uri[0] == 'aide') return self::aide(); |
if (count($uri) == 1 && $uri[0] == 'aide') { |
return self::aide(); |
} |
|
|
if(is_null($parametres)) $parametres = Array(); |
if (is_null($parametres)) { |
$parametres = Array(); |
} |
$params = self::requestFilterParams($parametres); |
// les contraintes liées aux ids (passés comme composants d'URL) |
// sont ajoutées aux params [sans être accepté comme paramètre d'URL] |
148,7 → 150,7 |
|
$res = $db->recupererTous($req); |
$err = mysql_error(); |
if(!$res && $err) { |
if (!$res && $err) { |
// http_response_code(400); |
// if(defined('DEBUG') && DEBUG) header("X-Debug: $req"); |
throw new Exception('not found', 400); |
157,7 → 159,7 |
// rapide formatage des résultats: |
$matches = 0; |
|
if($res) { |
if ($res) { |
// nombre de matches (sans LIMIT) utilisé pour l'en-tête |
$matches = $db->recuperer('SELECT FOUND_ROWS() AS total'); |
$matches = intval($matches['total']); |
167,8 → 169,10 |
// cependant le paramètre retour.indexBy permet de choisir une indexation par num_nom de bdtfx |
$clef_index = $params['retour.indexBy'] == 'coste' ? 'coste:nn' : 'bdtfx:nn'; |
$res2 = array(); |
foreach($res as $v) { |
if(!$v[$clef_index]) throw new Exception('format error: index NULL, use retour.indexBy=coste', 409); |
foreach ($res as $v) { |
if (!$v[$clef_index]) { |
throw new Exception('format error: index NULL, use retour.indexBy=coste', 409); |
} |
$res2[$v[$clef_index]] = $v; |
} |
|
175,11 → 179,12 |
// l'appelant s'occupera du json_encode() |
// même si ça démange d'exit'er ici |
header("Content-Type: application/json; charset=utf-8"); |
return array('entete' => array('depart' => $params['navigation.depart'], |
'limite' => $params['navigation.limite'], |
'total' => count($res2), |
'match' => $matches), |
'resultats' => $res2); |
return array('entete' => array( |
'depart' => $params['navigation.depart'], |
'limite' => $params['navigation.limite'], |
'total' => count($res2), |
'match' => $matches), |
'resultats' => $res2); |
|
} |
|
197,32 → 202,28 |
|
// joins: |
$other_join = self::sqlAddJoins($params, $champs_valides_non_formattes); |
$req = sprintf(<<<EOF |
SELECT SQL_CALC_FOUND_ROWS %s |
FROM tb_eflore.coste_v2_00 c |
LEFT JOIN tela_prod_wikini.florecoste_pages dsc ON c.page_wiki_dsc = dsc.tag AND dsc.latest = 'Y' |
LEFT JOIN tela_prod_wikini.florecoste_pages cle ON c.page_wiki_cle = cle.tag AND cle.latest = 'Y' |
%s |
WHERE %s ORDER BY c.num_nom LIMIT %u, %u -- %s |
EOF |
, |
$champs_valides, // dans le SELECT (parmi champs coste_v2_00) |
// autre join, si nécessaire |
$other_join ? $other_join : '', |
// where |
$constraints ? implode(' AND ', $constraints) : '1', |
$requete_tpl = "SELECT SQL_CALC_FOUND_ROWS %s". |
"FROM tb_eflore.coste_v2_00 c ". |
" LEFT JOIN tela_prod_wikini.florecoste_pages dsc ON c.page_wiki_dsc = dsc.tag AND dsc.latest = 'Y' ". |
" LEFT JOIN tela_prod_wikini.florecoste_pages cle ON c.page_wiki_cle = cle.tag AND cle.latest = 'Y' ". |
" %s ". |
"WHERE %s ORDER BY c.num_nom LIMIT %u, %u -- %s "; |
$req = sprintf($requete_tpl, |
$champs_valides, // dans le SELECT (parmi champs coste_v2_00) |
// autre join, si nécessaire |
$other_join ? $other_join : '', |
|
// limit |
$params['navigation.depart'], |
$params['navigation.limite'], |
__FILE__ . ':' . __LINE__); |
|
// where |
$constraints ? implode(' AND ', $constraints) : '1', |
|
// limit |
$params['navigation.depart'], |
$params['navigation.limite'], |
__FILE__ . ':' . __LINE__); |
|
return $req; |
} |
|
|
|
|
// SQL helpers |
// le préfix de coste_v2_00 est "c" |
// le préfix de florecoste_pages sur la description est est "dsc" |
229,15 → 230,16 |
// le préfix de florecoste_pages sur la clef de détermination est est "cle" |
static function sqlAddConstraint($params, $db) { |
$stack = array(); |
if(!empty($params['masque.ns'])) { |
if($params['recherche'] == 'etendue') |
$stack[] = 'c.nom_sci LIKE ' . $db->proteger('%' . trim($params['masque.ns']) . '%'); |
elseif($params['recherche'] == 'floue') |
if (!empty($params['masque.ns'])) { |
if ($params['recherche'] == 'etendue') { |
$stack[] = 'c.nom_sci LIKE '.$db->proteger('%' . trim($params['masque.ns']).'%'); |
} elseif($params['recherche'] == 'floue') { |
$stack[] = sprintf(self::$soundex_scheme, |
'c.nom_sci', |
$db->proteger('%' . trim($params['masque.ns']) . '%')); |
else |
$stack[] = 'c.nom_sci = ' . $db->proteger(trim($params['masque.ns'])); |
'c.nom_sci', |
$db->proteger('%'.trim($params['masque.ns']).'%')); |
} else { |
$stack[] = 'c.nom_sci = '.$db->proteger(trim($params['masque.ns'])); |
} |
} |
|
// le masque sur texte est toujours un LIKE() "étendue", sauf si "floue" spécifié |
244,11 → 246,11 |
if(!empty($params['masque.txt'])) { |
if($params['recherche'] == 'floue') { |
$stack[] = sprintf(self::$soundex_scheme, |
'dsc.body', |
$db->proteger('%' . trim($params['masque.txt']) . '%')); |
'dsc.body', |
$db->proteger('%'.trim($params['masque.txt']).'%')); |
} |
else { |
$stack[] = 'dsc.body LIKE ' . $db->proteger('%' . trim($params['masque.txt']) . '%'); |
$stack[] = 'dsc.body LIKE '.$db->proteger('%'.trim($params['masque.txt']).'%'); |
} |
} |
|
255,42 → 257,44 |
if(!empty($params['masque.titre'])) { |
if($params['recherche'] == 'stricte') { |
$stack[] = sprintf('(dsc.tag = %1$s OR cle.tag = %1$s)', |
$db->proteger(trim($params['masque.titre']))); |
$db->proteger(trim($params['masque.titre']))); |
} |
else { |
$stack[] = sprintf('(dsc.tag LIKE %1$s OR cle.tag LIKE %1$s)', |
$db->proteger('%' . trim($params['masque.titre']) . '%')); |
$db->proteger('%'.trim($params['masque.titre']).'%')); |
} |
} |
|
if(array_key_exists('masque.famille', $params)) { |
$stack[] = 'b.famille LIKE ' . $db->proteger(trim($params['masque.famille'])); |
$stack[] = 'b.famille LIKE '.$db->proteger(trim($params['masque.famille'])); |
} |
|
if(array_key_exists('masque.page', $params)) { |
$stack[] = 'c.page = ' . intval($params['masque.page']); |
$stack[] = 'c.page = '.intval($params['masque.page']); |
} |
|
if(array_key_exists('masque.tome', $params)) { |
$stack[] = 'c.tome = ' . intval($params['masque.tome']); |
$stack[] = 'c.tome = '.intval($params['masque.tome']); |
} |
|
if(array_key_exists('masque.nt', $params)) { |
$stack[] = 'c.flore_bdtfx_nt = ' . intval($params['masque.nt']); |
$stack[] = 'c.flore_bdtfx_nt = '.intval($params['masque.nt']); |
} |
|
// ajout de la contrainte sur coste:nn ou bdtfx:nn si un composant d'URL supplémentaire |
// comportant un #id existe, cf self::requestFilterIds() |
$o_stack = array(); |
if(array_key_exists('_ids', $params) && $params['_ids']) { |
if($params['_ids']['coste']) { |
if (array_key_exists('_ids', $params) && $params['_ids']) { |
if ($params['_ids']['coste']) { |
$o_stack[] = sprintf("c.num_nom IN (%s)", implode(',', $params['_ids']['coste'])); |
} |
if($params['_ids']['bdtfx']) { |
if ($params['_ids']['bdtfx']) { |
$o_stack[] = sprintf("c.flore_bdtfx_nn IN (%s)", implode(',', $params['_ids']['bdtfx'])); |
} |
} |
if($o_stack) $stack[] = '(' . implode(' OR ', $o_stack) . ')'; |
if ($o_stack) { |
$stack[] = '(' . implode(' OR ', $o_stack) . ')'; |
} |
|
return $stack; |
} |
303,10 → 307,9 |
$champs = $params['retour.champs']; |
// champs coste_v2_00 |
$c = self::addSQLToFieldSynonym(explode(',', $champs)); |
if(isset($c['*'])) { |
if (isset($c['*'])) { |
$t = array_diff_key(self::$allow_champs, array_flip(self::$special_champs)); |
} |
else { |
} else { |
// just loop below |
$t = $c; |
} |
329,7 → 332,7 |
// XXX: PHP-5.3 |
$ret = array(); |
foreach($t as $k => $v) { |
if(strpos($k, ':') !== FALSE) { |
if (strpos($k, ':') !== FALSE) { |
$ret[] = "$v AS \"$k\""; |
} else { |
$ret[] = "$v AS $k"; |
393,30 → 396,35 |
// TODO: use filter_input(INPUT_GET); |
// renvoie FALSE ou NULL si absent ou invalide |
$p['navigation.limite'] = filter_var(@$params['navigation.limite'], |
FILTER_VALIDATE_INT, |
array('options' => array('default' => NULL, |
'min_range' => 1, |
'max_range' => _COSTE_TEXTE_MAX_RESULT_LIMIT))); |
FILTER_VALIDATE_INT, |
array('options' => array( |
'default' => NULL, |
'min_range' => 1, |
'max_range' => _COSTE_TEXTE_MAX_RESULT_LIMIT))); |
$p['navigation.depart'] = filter_var(@$params['navigation.depart'], |
FILTER_VALIDATE_INT, |
array('options' => array('default' => NULL, |
'min_range' => 0, |
'max_range' => _COSTE_TEXTE_MAX_COSTE_NN))); |
FILTER_VALIDATE_INT, |
array('options' => array( |
'default' => NULL, |
'min_range' => 0, |
'max_range' => _COSTE_TEXTE_MAX_COSTE_NN))); |
$p['masque.page'] = filter_var(@$params['masque.page'], |
FILTER_VALIDATE_INT, |
array('options' => array('default' => NULL, |
'min_range' => 0, |
'max_range' => _COSTE_TEXTE_MAX_COSTE_PAGE))); |
FILTER_VALIDATE_INT, |
array('options' => array( |
'default' => NULL, |
'min_range' => 0, |
'max_range' => _COSTE_TEXTE_MAX_COSTE_PAGE))); |
$p['masque.tome'] = filter_var(@$params['masque.tome'], |
FILTER_VALIDATE_INT, |
array('options' => array('default' => NULL, |
'min_range' => 0, |
'max_range' => _COSTE_TEXTE_MAX_COSTE_TOME))); |
FILTER_VALIDATE_INT, |
array('options' => array( |
'default' => NULL, |
'min_range' => 0, |
'max_range' => _COSTE_TEXTE_MAX_COSTE_TOME))); |
$p['masque.nt'] = filter_var(@$params['masque.nt'], |
FILTER_VALIDATE_INT, |
array('options' => array('default' => NULL, |
'min_range' => 0, |
'max_range' => _COSTE_TEXTE_MAX_BDTFX_NT))); |
FILTER_VALIDATE_INT, |
array('options' => array( |
'default' => NULL, |
'min_range' => 0, |
'max_range' => _COSTE_TEXTE_MAX_BDTFX_NT))); |
|
// on filtre les NULL, FALSE et '', mais pas les 0, d'où le callback() |
// TODO: PHP-5.3 |
443,8 → 451,8 |
} |
|
return array( |
'coste' => array_slice($ids_coste, 0, intval(_COSTE_TEXTE_MAX_RESULT_LIMIT/2) ), |
'bdtfx' => array_slice($ids_bdtfx, 0, intval(_COSTE_TEXTE_MAX_RESULT_LIMIT/2) ) |
'coste' => array_slice($ids_coste, 0, intval(_COSTE_TEXTE_MAX_RESULT_LIMIT / 2) ), |
'bdtfx' => array_slice($ids_bdtfx, 0, intval(_COSTE_TEXTE_MAX_RESULT_LIMIT / 2) ) |
); |
} |
|
466,16 → 474,16 |
* le paramètre \"recherche\" affecte les masques \"ns\" et \"texte\" |
* le paramètre \"famille\" est traité via LIKE et accepte les caractères '_' et '%' |
* le paramètre \"retour.format\" est inutilisé pour l'instant", |
implode(',', array_keys(self::$allow_champs)), |
implode(',', self::$allow_params), |
self::$default_params['retour.champs'] |
implode(',', array_keys(self::$allow_champs)), |
implode(',', self::$allow_params), |
self::$default_params['retour.champs'] |
); |
} |
|
static function getNNCoste($refnn) { |
if(is_numeric($refnn)) { |
if (is_numeric($refnn)) { |
$t = intval($refnn); |
if($t >= 1 && $t < _COSTE_TEXTE_MAX_COSTE_NN) return $t; |
if ($t >= 1 && $t < _COSTE_TEXTE_MAX_COSTE_NN) return $t; |
} |
return FALSE; |
} |