/trunk/jrest/services/RefTableStructure.php |
---|
New file |
0,0 → 1,88 |
<?php |
/** |
* Service fournissant des informations sur la structure d'une table des référentiels. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @category Php 5.2 |
* @package Referentiel |
* @author Jean-Pascal MILCENT <jpm@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> |
* @copyright 2010 Tela-Botanica |
* @version $Id$ |
*/ |
class RefTableStructure extends Ref { |
/** |
* Méthode principale appelée avec une requête de type GET. |
*/ |
public function getElement($param = array()) { |
// Initialisation des variables |
$info = array(); |
// Nour recherchons le type de requête demandé |
$p = $this->traiterParametresUrl(array('type', 'table'), $param, false); |
$type = $p['type']; |
$table = $p['table']; |
if (!is_null($type)) { |
if (!is_null($table)) { |
$methode = 'getElement'.$type; |
if (method_exists($this, $methode)) { |
//array_shift($param); |
$info = $this->$methode($table); |
} else { |
$this->messages[] = "Le type d'information demandé '$type' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "Veuillez préciser le nom de la table comme premier paramêtre."; |
} |
} else { |
$this->messages[] = "Veuillez préciser le type de requête."; |
} |
// Envoie sur la sortie standard |
$this->envoyer($info); |
} |
/* Méthode pour récupérer des informations sur les colonnes d'une table. |
* Appelée avec les paramêtres d'url suivant : |
* /RefTableStructure/colonnes/nom_de_la_table |
*/ |
public function getElementColonnes($table) { |
$requete = "SHOW COLUMNS FROM `$table` "; |
// Récupération des résultats |
try { |
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC); |
if ($donnees === false) { |
$this->messages[] = "La requête a retourné aucun résultat."; |
} |
$info['colonnes'] = $donnees; |
} catch (PDOException $e) { |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()); |
} |
return $info; |
} |
/* Méthode pour récupérer un tableau d'analyse de la table. |
* Appelée avec les paramêtres d'url suivant : |
* /RefTableStructure/analyse/nom_de_la_table |
*/ |
public function getElementAnalyse($table) { |
$requete = "SELECT * FROM `$table` PROCEDURE ANALYSE ( )"; |
// Récupération des résultats |
try { |
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC); |
if ($donnees === false) { |
$this->messages[] = "La requête a retourné aucun résultat."; |
} |
$info['analyses'] = $donnees; |
} catch (PDOException $e) { |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()); |
} |
return $info; |
} |
} |
?> |
/trunk/jrest/services/Ref.php |
---|
New file |
0,0 → 1,134 |
<?php |
/** |
* Classe mère abstraite contenant les méthodes génériques des services des Référentiels. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @category Php 5.2 |
* @package Referentiel |
* @author Jean-Pascal MILCENT <jpm@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> |
* @copyright 2010 Tela-Botanica |
* @version $Id$ |
*/ |
abstract class Ref { |
public $config; |
protected $bdd; |
protected $messages = array(); |
protected $debug = array(); |
protected $distinct = false; |
protected $orderby = null; |
protected $formatRetour = 'objet'; |
protected $start = 0; |
protected $limit = 150; |
public function __construct($config, $demarrer_session = true) { |
// Tableau contenant la config de Jrest |
$this->config = $config; |
// Connection à la base de données |
$this->bdd = $this->connecterPDO($this->config, 'database'); |
// Nettoyage du $_GET (sécurité) |
if (isset($_GET)) { |
$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour'); |
foreach ($get_params as $get) { |
$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';'); |
$_GET[$get] = str_replace($verifier, '', $_GET[$get]); |
if (isset($_GET[$get]) && $_GET[$get] != '') { |
$this->$get = $_GET[$get]; |
} else { |
$_GET[$get] = null; |
} |
} |
} |
} |
/** |
* Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET. |
*/ |
public function getRessource() { |
$this->getElement(array()); |
} |
protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = true) { |
// Traitements des messages d'erreurs et données |
if (count($this->messages) != 0) { |
header('HTTP/1.1 500 Internal Server Error'); |
$mime = 'text/html'; |
$encodage = 'utf-8'; |
$sortie = $this->messages; |
} else { |
$sortie = $donnees; |
if (is_null($donnees)) { |
$sortie = 'OK'; |
} |
} |
// Gestion de l'envoie du déboguage |
$this->envoyerDebogage(); |
// Encodage au format et JSON et envoie sur la sortie standard |
$contenu = $json ? json_encode($sortie) : $sortie; |
$this->envoyerContenu($encodage, $mime, $contenu); |
} |
protected function envoyerDebogage() { |
if (!is_array($this->debug)) { |
$this->debug[] = $this->debug; |
} |
if (count($this->debug) != 0) { |
foreach ($this->debug as $cle => $val) { |
if (is_array($val)) { |
$this->debug[$cle] = print_r($val, true); |
} |
} |
header('X-DebugJrest-Data:'.json_encode($this->debug)); |
} |
} |
protected function envoyerContenu($encodage, $mime, $contenu) { |
header("Content-Type: $mime; charset=$encodage"); |
print $contenu; |
} |
private function connecterPDO($config, $base = 'database') { |
$cfg = $config[$base]; |
$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec']; |
try { |
$PDO = new PDO($dsn, $cfg['username'], $cfg['password']); |
} catch (PDOException $e) { |
echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage(); |
} |
// Passe en UTF-8 la connexion à la BDD |
$PDO->exec("SET NAMES 'utf8'"); |
// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché) |
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
return $PDO; |
} |
protected function getTxt($id) { |
$sortie = ''; |
switch ($id) { |
case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break; |
default : $sortie = $id; |
} |
return $sortie; |
} |
protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) { |
$sortie = array(); |
foreach ($params_attendu as $num => $nom) { |
if (isset($params[$num]) && $params[$num] != '*') { |
if ($pourBDD) { |
$params[$num] = $this->bdd->quote($params[$num]); |
} |
$sortie[$nom] = $params[$num]; |
} |
} |
return $sortie; |
} |
} |
?> |
/trunk/jrest/services/RefReferentiel.php |
---|
New file |
0,0 → 1,90 |
<?php |
/** |
* Service fournissant des données de la table contenant le référentiel de travail. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @category Php 5.2 |
* @package Referentiel |
* @author Jean-Pascal MILCENT <jpm@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> |
* @copyright 2010 Tela-Botanica |
* @version $Id$ |
*/ |
class RefReferentiel extends Ref { |
/** |
* Méthode principale appelée avec une requête de type GET. |
*/ |
public function getElement($param = array()) { |
// Initialisation des variables |
$info = array(); |
// Nour recherchons le type de requête demandé |
$p = $this->traiterParametresUrl(array('type', 'projet'), $param, false); |
$type = $p['type']; |
$projet = $p['projet']; |
if (!is_null($type)) { |
if (!is_null($projet)) { |
$methode = 'getElement'.$type; |
if (method_exists($this, $methode)) { |
//array_shift($param); |
$info = $this->$methode($projet); |
} else { |
$this->messages[] = "Le type d'information demandé '$type' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "Veuillez préciser le nom de code du projet comme premier paramêtre (ex. : bdnff)."; |
} |
} else { |
$this->messages[] = "Veuillez préciser le type de requête."; |
} |
// Envoie sur la sortie standard |
$this->envoyer($info); |
} |
/* Méthode pour récupérer les noms d'un référentiel. |
* Appelée avec les paramêtres d'url suivant : |
* /RefReferentiel/tout/code_du_referentiel |
*/ |
public function getElementTout($projet) { |
$requete = ($this->distinct ? 'SELECT DISTINCT' : 'SELECT').' * '. |
"FROM `$projet` ". |
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'num_nom ASC').' '; |
//"LIMIT $this->start, $this->limit "; |
// Récupération des résultats |
try { |
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC); |
if ($donnees === false) { |
$this->messages[] = "La requête a retourné aucun résultat."; |
} |
} catch (PDOException $e) { |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()); |
} |
return $donnees; |
} |
/* Méthode pour récupérer le nombre de noms présents dans un référentiel. |
* Appelée avec les paramêtres d'url suivant : |
* /RefReferentiel/nombre/code_du_referentiel |
*/ |
public function getElementNombre($projet) { |
$requete = 'SELECT COUNT(*) AS nbre '. |
"FROM `$projet` "; |
// Récupération des résultats |
try { |
$nbre = $this->bdd->query($requete)->fetchColumn(); |
if ($nbre === false) { |
$this->messages[] = "La requête a retourné aucun résultat."; |
} |
} catch (PDOException $e) { |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()); |
} |
return $nbre; |
} |
} |
?> |