14-11-2007, 03:57 PM
Tiens, j'viens de ressortir du tiroir quelques trucs intéressants & donc voilà le dernier visage de cette dernière
Code PHP :
<?php
include_once( 'configuration.classe.php' );
interface iDatabase
{
public function ping();
public function get_TempsExecutionRequete( $requete );
public function enregistrements_affectes();
public function executer_requete( $requete );
public function selectionner( $table, $select, array $params = array() );
public function ajouter( $table, $set );
public function mettreajour( $table, $set, $where );
public function detruire( $table, $where );
public function vider( $table );
public function prepare( $nomRequete, $requete );
public function set( $nomVariable, $valeur );
public function execute( $nomRequete, $using );
}
interface iResultat
{
public function __construct( $query );
public function fetch_row();
public function fetch_array();
public function fetch_assoc();
public function fetch_object( $classname=NULL, $args=NULL );
public function nbre_enregistrements();
public function free();
}
abstract class Database
{
protected static $instance; //instance de la classe ( il ne peut n'y en avoir qu'une )
public $nbreRequetes; //nombre de requetes effectuées par cette classe
public $connexionOuverte = false; //indique si la connexion est ouverte
public $connexion = false; //connexion en cours
protected $erreurs = array();
protected $tempsExecution = 0.0;
public $debug = false;
public $executerRequetes = true;
protected $serveur;
protected $utilisateur;
protected $motdepasse;
protected $bdd;
protected $SGBD;
protected $fichierConfiguration;
abstract protected function ouvrir_connexion();
abstract protected function fermer_connexion();
abstract protected function parse_params( array $params );
protected function __construct( $fichierConfiguration )
{
$this->fichierConfiguration = $fichierConfiguration;
$configuration = Configuration::chargement_ini( $fichierConfiguration );
$this->serveur = $configuration['serveur'];
$this->utilisateur = $configuration['utilisateur'];
$this->motdepasse = $configuration['motdepasse'];
$this->bdd = $configuration['bdd'];
$this->SGBD = $configuration['sgbd'];
$this->ouvrir_connexion();
}
public function __destruct()
{
$this->fermer_connexion();
}
public function __toString()
{
$texte = '<p class=\'debugSQL\'><em>Affichage des informations concernant l\'instance de la classe SQL correspondant à la connexion :</em> <strong>'.$this->connexion.'</strong><br />'."\n";
$texte .= 'Serveur : <strong>'.$this->serveur.'</strong><br />'."\n";
$texte .= 'Base de données : <strong>'.$this->bdd.'</strong><br />'."\n";
$texte .= 'Type de base de données : <strong>'.$this->SGBD.'</strong><br />'."\n";
$texte .= 'Mode debug : <strong>';
if( $this->debug )
$texte .= 'on';
else
$texte .= 'off';
$texte .= '</strong><br />'."\n";
$texte .= 'Connexion ouverte : <strong>';
if( $this->connexionOuverte )
$texte .= 'oui';
else
$texte .= 'non';
$texte .= '</strong><br />'."\n";
$texte .= 'Nombre de requêtes effectuées avec cette instance : <strong>'.$this->nbreRequetes.'</strong><br />'."\n";
$texte .= 'Nombre d\'erreurs qui se sont produites avec cette instance : <strong>'.sizeof( $this->erreurs ).'</strong><br />'."\n";
$texte .= 'Temps d\'exécution totale des requêtes de cette instance : <strong>'.$this->tempsExecution.'</strong><br /><br />'."\n";
if( $this->debug )
$texte .= $this->debug();
$texte .= '</p>'."\n";
return $texte;
}
public function __sleep()
{
$this->fermer_connexion();
}
public function __wakeup()
{
$this->ouvrir_connexion();
}
protected function erreurSQL( $message )
{
$texte_erreur = '<span class=\'erreurSQL\'>'."\n";
$texte_erreur .= $message."\n";
$texte_erreur .= '</span>'."\n";
$this->erreurs[] = $texte_erreur;
}
public function debug()
{
$texte_debug = '<em>Debugage de la classe SQL correspondant à la connexion :</em> <strong>'.$this->connexion.'</strong><br />'."\n";
if( count( $this->erreurs ) > 0 )
{
foreach( $this->erreurs as $erreur )
{
$texte_debug .= $erreur.'<br />'."\n";
}
}
else
$texte_debug .= 'Aucune erreur ne s\'est produite durant cette instance.<br />'."\n";
$texte_debug .= 'Fin du debugage de la classe SQL.<br />'."\n";
return $texte_debug;
}
public function active_debug()
{
$this->debug = true;
}
public static function getInstance( $fichierConfiguration = './configuration/bdd.ini', $SGBD = 'MySQL' )
{
if( self::$instance === null )
{
switch( $SGBD )
{
case 'MySQL':
self::$instance = new MySQLDatabase( $fichierConfiguration );
break;
default:
throw new Exception( 'Ce type de SGBD n\'est pas valable !' );
break;
}
}
return self::$instance;
}
}
abstract class DatabaseResultat
{
protected $query;
public $resultat;
}
class MySQLDatabase extends Database implements iDatabase
{
protected function ouvrir_connexion()
{
$this->connexion = @mysql_connect($this->serveur, $this->utilisateur, $this->motdepasse) or die( mysql_error() );
@mysql_select_db($this->bdd, $this->connexion) or die( mysql_error() );
$this->connexionOuverte = true;
}
public function fermer_connexion()
{
if( $this->connexionOuverte )
@mysql_close( $this->connexion );
$this->connexionOuverte = false;
}
public function executer_requete( $requete )
{
$debut = microtime(true);
$query = @mysql_query( $requete );
$this->tempsExecution +=microtime(true) - $debut;
$this->nbreRequetes++;
if( $query === FALSE )
{
$texte_requete = 'Vérifiez la requête : <strong>'.$requete.'</strong><br />'."\n";
$texte_requete .= 'Erreur SQL : <strong>'.mysql_error().'</strong><br />'."\n";
$texte_requete .= 'Numéro de l\'erreur : <strong>'.mysql_errno().'</strong><br />'."\n";
$this->erreurSQL( $texte_requete );
return false;
}
if ( strtolower(substr($requete, 0, 6)) === 'select' )
return new MySQLResultat( $query );
else
return $this->enregistrements_affectes();
}
public function selectionner( $table, $select, array $params = array() )
{
$requete = "SELECT ".$select." FROM ".$table;
$requete .= $this->parse_params( $params );
return $this->executerRequetes ? $this->executer_requete( $requete ) : $requete;
}
public function ajouter( $table, $set )
{
$requete = "INSERT INTO ".$table." SET ".$set;
return $this->executerRequetes ? $this->executer_requete( $requete ) : $requete;
}
public function mettreajour( $table, $set, $where )
{
$requete = "UPDATE ".$table." SET ".$set." WHERE ".$where;
return $this->executerRequetes ? $this->executer_requete( $requete ) : $requete;
}
public function detruire( $table, $where )
{
$requete = "DELETE FROM ".$table." WHERE ".$where;
return $this->executerRequetes ? $this->executer_requete( $requete ) : $requete;
}
public function vider( $table )
{
$requete = "TRUNCATE TABLE ".$table;
return $this->executerRequetes ? $this->executer_requete( $requete ) : $requete;
}
public function prepare( $nomRequete, $requete )
{
$requete = "PREPARE ".$nomRequete." FROM '".$requete."'";
return $this->executerRequetes ? $this->executer_requete( $requete ) : $requete;
}
public function set( $nomVariable, $valeur )
{
$requete = "SET @".$nomVariable."='".$valeur."'";
return $this->executerRequetes ? $this->executer_requete( $requete ) : $requete;
}
public function execute( $nomRequete, $using )
{
$requete = "EXECUTE ".$nomRequete." USING ".$using;
return $this->executerRequetes ? $this->executer_requete( $requete ) : $requete;
}
public function enregistrements_affectes()
{
return mysql_affected_rows( $this->connexion );
}
public function get_TempsExecutionRequete( $requete )
{
$debut = microtime(true);
@mysql_query( $requete );
return microtime(true) - $debut;
}
public function ping()
{
return mysql_ping( $this->connexion );
}
protected function parse_params( array $params )
{
$retour = '';
if(array_key_exists('where', $params))
$retour .= ' WHERE '.$params['where'];
if(array_key_exists('leftJoin', $params))
{
if( is_array( $params['leftJoin'] ) )
{
$i = 0;
$taille = count( $params['leftJoin'] );
while( $i < $taille )
{
$retour .= ' LEFT JOIN '.$params['leftJoin'][$i];
$i++;
}
}
else
$retour .= ' LEFT JOIN '.$params['leftJoin'];
}
if(array_key_exists('order', $params))
$retour .= ' ORDER BY '.$params['order'];
if(array_key_exists('limit', $params))
$retour .= ' LIMIT '.$params['limit'];
return $retour;
}
}
class MySQLResultat extends DatabaseResultat implements iResultat
{
public function __construct( $query )
{
$this->query = $query;
}
public function fetch_row()
{
return $this->resultat = mysql_fetch_row( $this->query );
}
public function fetch_array()
{
return $this->resultat = mysql_fetch_array( $this->query );
}
public function fetch_assoc()
{
return $this->resultat = mysql_fetch_assoc( $this->query );
}
public function fetch_object( $nomClasse=NULL, $args=NULL )
{
return $this->resultat = mysql_fetch_object( $this->query, $nomClasse, $args );
}
public function nbre_enregistrements()
{
return $this->resultat = mysql_num_rows( $this->query );
}
public function free()
{
if( !mysql_free_result( $this->query ) )
throw new Exception( 'Impossible de libérer la mémoire !' );
unset( $this );
}
}
?>
C'autre chose, non ?
~L~