13,21 → 13,26 |
* @version $Id$ |
* @copyright © 2012, Tela Botanica |
*/ |
// TODO : supprimer la méthode protegerRequete() |
require_once('Bdd2.php'); |
|
abstract class Cel { |
const TYPE_OBS = 'observation'; |
const TYPE_IMG = 'image'; |
const SQL_MODE_ASSOC = PDO::FETCH_ASSOC; |
const SQL_MODE_OBJET = PDO::FETCH_OBJ; |
const SQL_RETOUR_COMPLET = 'All'; |
const SQL_RETOUR_LIGNE = 'Row'; |
const SQL_RETOUR_COLONNE = 'Column'; |
const SQL_RETOUR_BRUT = 'Raw'; |
|
// TODO: delete wrappers |
const SQL_MODE_ASSOC = Bdd2::SQL_MODE_ASSOC; |
const SQL_MODE_OBJET = Bdd2::SQL_MODE_OBJET; |
const SQL_RETOUR_COMPLET = Bdd2::SQL_RETOUR_COMPLET; |
const SQL_RETOUR_LIGNE = Bdd2::SQL_RETOUR_LIGNE; |
const SQL_RETOUR_COLONNE = Bdd2::SQL_RETOUR_COLONNE; |
const SQL_RETOUR_BRUT = Bdd2::SQL_RETOUR_BRUT; |
|
public $config; |
private $ressources; |
protected $parametres = array(); |
protected $bdd; |
|
public static $bdd = null; |
|
protected $messages = array(); |
protected $debug = array(); |
protected $start; |
44,7 → 49,7 |
date_default_timezone_set($this->config['settings']['fuseauHoraire']); |
|
// Connection à la base de données |
$this->bdd = $this->connecterPDO($this->config, 'database_cel'); |
self::$bdd = new Bdd2($this->config, 'database_cel'); |
|
// Nettoyage du _GET (sécurité) |
$this->collecterParametres();// Récupération de tous les parametres de _GET, nettoyage et mise dans $this->parametres |
56,69 → 61,37 |
} |
|
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION de la BASE de DONNÉES |
|
protected function connecterPDO($config, $base = 'database_cel') { |
$cfg = $config[$base]; |
// ATTENTION : la connexin à la bdd peut échouer si l'host vaut localhost. Utiliser 127.0.0.1 à la place. |
$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec']; |
try { |
// Création de la connexion en UTF-8 à la BDD |
$PDO = new PDO($dsn, $cfg['username'], $cfg['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "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); |
} catch (PDOException $e) { |
echo 'La connexion à la base de donnée via PDO a échouée : ' .$dsn. $e->getMessage(); |
} |
return $PDO; |
return new Bdd2($config, $base); |
} |
|
/** |
* Protège automatiquement toutes les chaines comprises entre deux caractères '|'. |
* Puis execute la requete. |
* @see protegerRequete() |
* @param unknown_type $requete |
*/ |
public function requeter($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) { |
$requete = $this->protegerRequete($requete); |
return $this->executerRequete($requete, $retour, $mode); |
public static function db() { |
if(! self::$bdd) die('ERR: no DB available'); |
return self::$bdd; |
} |
|
/** |
* Protège automatiquement toutes les chaines comprises entre deux caractères '|'. |
* @see protegerRequete() |
* @param unknown_type $requete |
*/ |
protected function executer($requete) { |
$requete = $this->protegerRequete($requete); |
return $this->executerRequeteSimple($requete); |
// TODO: delete wrappers, en attendant que $this->bdd soit remplacé par Cel::db() partout. |
public function __get($prop) { |
if($prop == 'bdd') return self::$bdd; |
return $this->$prop; |
} |
|
/** |
* Méthode permettant de rechercher dans une requete SQL sous forme de chaine (String) les chaines |
* à protéger. Cela évite de protéger chaque variable avant de l'insérer dans une requete SQL. |
* Par contre, il est important que les chaine à protéger ne contiennent pas le caractère '|'. |
* |
* @param $requete |
*/ |
protected function protegerRequete($requete) { |
if (substr_count($requete, '|') % 2 === 0) { |
if (preg_match_all('/\|([^|]*)\|/', $requete, $correspondances, PREG_SET_ORDER)) { |
foreach ($correspondances as $chaine) { |
$chaine_protegee = $this->bdd->quote($chaine[1]); |
$requete = str_replace($chaine[0], $chaine_protegee, $requete); |
} |
} |
} else { |
$this->messages[] = "La requête a protéger contient un nombre impair de caractère de protection '|'."; |
$requete = false; |
} |
return $requete; |
// TODO: delete wrappers |
public function requeter() { |
return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args()); |
} |
|
protected function proteger($chaine) { |
return $this->bdd->quote($chaine); |
// TODO: delete wrappers |
protected function executer() { |
return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args()); |
} |
// TODO: delete wrappers |
protected function protegerRequete() { |
return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args()); |
} |
// TODO: delete wrappers |
protected function proteger() { |
return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args()); |
} |
|
protected function protegerTableau(Array $tableau) { |
foreach ($tableau as $id => $val) { |
127,55 → 100,18 |
return $tableau; |
} |
|
protected function executerRequeteSimple($requete) { |
$resultat = false; |
try { |
$resultat = $this->bdd->exec($requete); |
if ($resultat === false) { |
$this->debug[] = "La requête a échoué : $requete"; |
} |
} catch (PDOException $e) { |
$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete); |
} |
return $resultat; |
// TODO: delete wrappers |
protected function executerRequeteSimple() { |
return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args()); |
} |
|
public function executerRequete($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) { |
$resultat = false; |
try { |
switch ($retour) { |
case self::SQL_RETOUR_COMPLET : |
$resultat = $this->bdd->query($requete)->fetchAll($mode);// Retourne toutes les lignes |
break; |
case self::SQL_RETOUR_LIGNE : |
$resultat = $this->bdd->query($requete)->fetch($mode);// Retourne la première ligne |
break; |
case self::SQL_RETOUR_COLONNE : |
$resultat = $this->bdd->query($requete)->fetchColumn();// Retourne la première colonne de la première ligne |
break; |
case self::SQL_RETOUR_BRUT : |
$resultat = $this->bdd->query($requete);// Retourne l'objet brut pour être utilisé dans une boucle de type foreach |
break; |
default: |
$this->debug[] = "Le type de retour '$retour' est inconnu."; |
} |
if ($resultat === false) { |
$this->debug[] = "La requête a retourné aucun résultat : $requete"; |
} |
} catch (PDOException $e) { |
$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete); |
} |
return $resultat; |
// TODO: delete wrappers |
public function executerRequete() { |
return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args()); |
} |
|
protected function getTxt($id) { |
$sortie = ''; |
switch ($id) { |
case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break; |
case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break; |
default : $sortie = $id; |
} |
return $sortie; |
// TODO: delete wrappers |
protected function getTxt() { |
return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args()); |
} |
|
//+----------------------------------------------------------------------------------------------------------------+ |
231,7 → 167,7 |
foreach ($params_attendu as $num => $nom) { |
if (isset($params[$num]) && $params[$num] != '*') { |
if ($pourBDD) { |
$params[$num] = $this->bdd->quote($params[$num]); |
$params[$num] = self::$bdd->quote($params[$num]); |
} |
$sortie[$nom] = $params[$num]; |
} |
673,7 → 609,7 |
private function decoderMotsCles($utilisateur_id, $mots_cles, $type) { |
$mots = array(); |
if (! $this->etreNull($mots_cles)) { |
$utilisateur_id = $this->bdd->quote($utilisateur_id); |
$utilisateur_id = self::$bdd->quote($utilisateur_id); |
|
$mots_cles = $this->protegerMotsCles($mots_cles, $type); |
if (! $this->etreNull($mots_cles)) { |
705,7 → 641,7 |
if (! $this->etreNull($valeurs)) { |
$valeurs_a_proteger = explode($separateur_entree,trim(trim($valeurs), $separateur_entree)); |
foreach ($valeurs_a_proteger as $valeur) { |
$valeurs_protegees[] = $this->bdd->quote($valeur); |
$valeurs_protegees[] = self::$bdd->quote($valeur); |
} |
$valeurs = implode($separateur_sortie, $valeurs_protegees); |
} |