J'ai créé y a quelques mois une classe pour me connecter à une base de données (MySQL ou PostgreSQL), elle fonctionne nickel (youhou) mais j'aimerai pouvoir l'améliorer, et surtour la sécuriser si elle ne l'est pas assez. Je désirerai donc vos avis divers, nottamment sur des points éventuels à modifier impérativement.
Merci.
Pour se connecter, je stocke les parametres de connexion dans un fichier .ini, qui est protégé en lecture par mon .htacess.
Voila la classe :
<?php
/**
mail : balistik . fonfon [at] gmail . com
date : 24/11/2009
Projet : gestionnaire de blog
**/
//Classe de connexion a la base de donnees pour Mysql ou PostgreSQL
//Contient plusieurs methodes
//connexion : realise la connexion a la BD
//preparation donnes : protehes les données avant l insertion avec mysql_real_escape_string et pg_escape_string
//requete : execute une requete SQL
//deconnexion : effectue la deconnexion a la BD
class connexionBD extends appControl{
var $m_nConnect = FALSE;
private $psConnect;
private $psHost;
private $psUserName;
private $psMdp;
private $psDB;
private $m_nSDB;
private $sResult;
private $messError;
//construction de l objet connexion
public function __construct(){
/**
* Declaration du tableau $database
* connect : 1 (MySQL) ou2(PostgreSQL)
* host : host de la bd
* username : login de connexion BD
* mdp : mot de passe
* dataBase : nom de la base de donnees
*/
$database = array();
if(file_exists(INC. DS .'app/inc/config/database.ini')){
$file = INC. DS .'app/inc/config/database.ini';
$database = parse_ini_file($file);
$this->psConnect = $database['connect']; //$psConnect;
$this->psHost = $database['host']; //$psHost;
$this->psUserName = $database['username']; //$psUsername;
$this->psMdp = $database['mdpBD']; //$psMdp;
$this->psDB = $database['dataBase']; // $psDB;
}
}
//destruction de l'instance de classe
public function __destruct(){
unset($this);
}
//Fonction connexion
public function connexion(){
//On teste si la connexion a la BD s effectue
try{
switch($this->psConnect){
case 1 :
$this->m_nConnect = mysql_connect($this->psHost,$this->psUserName,$this->psMdp);
$this->m_nSDB = mysql_select_db($this->psDB,$this->m_nConnect);
break;
case 2 :
$conn_string = "host=$this->psHost port=5432 dbname=$this->psDB user=$this->psUserName password=$this->psMdp";
$this->m_nConnect = pg_connect($conn_string);
$this->m_nSDB = true;
break;
}
if(!$this->m_nConnect){
throw new MyException ('<div class="msg_err">Probleme de connexion '.$this->psConnect.'<br />Resultat connexion : '.$this->m_nConnect.'</div>');
}//fin if
if(!$this->m_nSDB){
$mess = '<div class="msg_err">Probleme de connexion à la database MySQL' ;
$mess .= ' '.$this->psDB;
$mess .= '</div>';
throw new MyException($mess);
}
}catch(MyException $e){
echo $e->getError();
}//fin try/catch*/
}//fin methode
/**
* Fonction preparant les requetes SQL d insertion et de MAJ (update)
*
* @param $donnees au format JSON
* @return $donnesOK : tableaux de données protégés
*/
function prepareInsertionDonnees($donnees){
//TODO verifier tableau de retour
//TODO 2 : test avec des ' : mise en place des \
try{
$donnees = json_decode($donnees, true);
switch($this->psConnect){
case 1 :
foreach($donnees as $key=>$value){
$value = mysql_real_escape_string($value);
}
$donnesOK = $donnees;//print_r($donnees);
break;
case 2 :
foreach($donnees as $key=>$value){
$value = pg_escape_string($value);
}
$donnesOK = $donnees;//print_r($donnees);
break;
}
if(DEBUG == 2){
echo '<pre>'; print_r($donnesOK); echo '</pre>';
}
if(!$this->psConnect){
throw new MyException('Function prepareInsertionDonnees : probleme de psConnect');
}
return $donnesOK;
}catch(MyException $e){
echo $e->getError();
}//fin try/catch
}
//Fonction Requete
public function requete($requete) {
//On teste l execution d une requete SQL
try{
if(empty($requete)){
throw new MyException('Pas de requete SQL envoye');
}else{
$this->confirm = false;
switch($this->psConnect){
case 1 :
$this->sResult = mysql_query($requete);
$this->messError = mysql_error();
if(DEBUG == 2){ echo '<p>Requete MySQL : ' . $requete . '</p>'; }
break;
case 2 :
$this->sResult = pg_query($requete);
$this->messError = pg_result_error($requete);
if(DEBUG == 2){ echo '<p>Requete PostgreSQL : ' . $requete . '</p>'; }
break;
}
if(!$this->sResult){
$this->confirm = false;
throw new MyException('Probleme d execution de requete SQL :<br>'.$requete.'<br />Message : '.$this->messError);
}else{
$this->confirm = true;
}
}
}catch(MyException $e){
echo $e->getError();
}//fin try/catch
return $this->sResult;
}//fin methode
/**
* Enter description here...
*
* @param $resultat :tableau de resultat de la requete SQL
* @return $tabResult : tableau de resultat de la requete SQL
*/
public function recupDonnesRequete($resultat){
try{
$tabResult = array();
$aListe = array();
switch($this->psConnect){
case 1 :
while($aListe = mysql_fetch_object($resultat)){
$tabResult[] = $aListe;
}
break;
case 2 :
while($aListe = pg_fetch_object($resultat)){
$tabResult[] = $aListe;
}
break;
}
return $tabResult;
}catch(MyException $e){
echo $e->getError();
}//fin try/catch
}
//deconnexion de la base de donnees
public function deconnexion() {
switch($this->psConnect){
case 'mysql' :
$this->m_nConnect = mysql_close();
break;
case 'postgresql' :
$this->m_nConnect = pg_close();
break;
}
}//fin methode
}//fin classe
?>
Et voila à quoi ressemble le fichier database.ini :
Code : Tout sélectionner
;FICHIER contenant les informations de connexion\n;NE PAS EFFACER OU MODIFIER
[database]
connect = "2"
host = "localhost"
username = "mon_user"
mdpBD = "mon_mdp"
dataBase = "nom_db"