<?php
/**
* SQL Manager
*
* @version $Id$
* @copyright 2009
*
* Ce fichier permet l'utilisation sécirisé de MySQL
*/
/** Documentation Technique
*
* ---------------
* Ouverture d'un objet, définition du serveur
*
* Pour ouvrir un objet $obj pour se connecter à un serveur $serv, on tape :
* $obj = DB_Driver::Open($serv);
* Si une connexion vers le serveur avait déjà été ouverte, alors $obj retournera
* l'objet qui avait déjà été initialisé. Si aucun serveur est spécifié, alors
* le serveur SQL défini dans le fichier de configuration sera utilisé.
*
* ----------------
* Définir les paramètres de connexion
* Object: DB_Driver()
* Method: SetConfig($User, $Pass, $Base, $Prefix)
*
* ---- Liste des arguments
* --$User : Utilisateur utilisé pour la connexion.
* --$Pass : Mot de passe à utiliser.
* --$Base : Non de la base de donnée à utiliser
* --$Prefix : Préfixe à utiliser pour les tables.
*
* ---- Valeur de retour
* Retourne false si la connexion a échoué, sinon retourne un identifiant de connexion.
*
* -----------------
* Définir la table de donnée courante
* Object: DB_Driver
* Value: table
*
* Contient le non de la table utilisé pour les oparations. Pour changr de table
* courante, changer cette valeur.
*
* -----------------
* Lire une base de données
* Object: DB_Driver
* Method: Select($condition = array(), $Colone = array('*'), $Sort)
*
* Permet de lire une table de données. La table lut est fixé par la valeur table
* de l'objet.
*
* ---- Liste des arguments
* --$condition (défaut: array()) : Tableau conteant les informations pour trier
* les éléments (pour définir le WHERE). Dans se tableau, les clé doivent être
* des noms de colone de la table et les valeurs représente à quel valeur doit
* etre la colone pour que le resultat soit affiché.
* Exemple: pour faire WHERE ma_colone = 'ma valeur' on doit envoyer le tableau
* array('ma_colone' => 'ma valeur').
*
* --$Colone (défaut: array('*')) : tableau représentant les colones que l'on
* veux récupérer dans la table. Par défaut on retourne toutes les colones de la
* table.
*
* --$Sort (defaut: NULL) : Nom de la colone que l'on veut utiliser pour l'ordre
* d'affichage DESC, ou alors on ajoute un - devant le nom pour avoir l'ordre
* ASC. Si ce paramètre vaut NULL, alors les enregistrements ne seront pas triés.
* Peut aussi être un tableau assiciatif (pour utiliser une limite).
* $Sort['order'] : voir $Sort en mode chaine de caractère.
* $Sort['nbr'] : Nombre d'enregistrement à prendre.
* $Sort['start'] : Numéro du premier enregistrement à prendre ($Sort['nbr']
* doit être défini.
*
* ---- Valeur de retour
* retourne le resultat de mysql_query() avec la requette construite.
*
*-----------------
* Effacer des données dans une table
* Object: DB_Driver
* Method: DeleteFrom($condition = array())
*
* Utilise la table courante pour l'effacement.
*
* ---- Liste des arguments
* --$condition : tableau des conditions que doit respecter un enregistrement
* pour être effacé. Pour en savoir plus, allez voir dans Select().
*
* -----------------
* Insert un enregistrement
* Object: DB_Driver
* Method: InsertInto($infos)
*
* Utilise la table courante pour l'insertion.
*
* ---- Liste des arguments
* --$infos : tableau représentant les valeurs à ajouter dans la table. Sous la
* forme: array( 'nom d'une colone' => 'valeur qui sera dedans'). Exemple :
* $sql->InsertInto(array(
* 'pseudo' => 'bontiv',
* 'pass' => 'EITR354RYSIEY4DSERREE',
* 'identifiant' => 'titou'
* ));
*
* ---- Valeur de retour
* Si la table pocède une clée auto_incrémenté, alors retourne la valeur de cette
* clé qui identifie le nouvel enregistrement. S'il n'y a pas de clé, alors
* retourne 0.
* **/
include_once "alert.php";
class DB_Driver {
private $DB_User;
private $DB_Prefix;
private $DB_Pass;
private $DB_Base;
public $table;
protected $result;
private $conID;
static private $server = array();
static public function Open($server = NULL) {
$server = ($server === NULL)?($GLOBALS['SQL_SERVER']):($server);
if (array_key_exists($server, self::$server)) {
return self::$server[$server];
} else {
return new self($server);
}
}
function __construct($server){
self::$server[$server] = $this;
}
protected function Connect(){
return mysql_connect(
array_search($this, self::$server),
$this->DB_User,
$this->DB_Pass)
and mysql_select_db($this->DB_Base);
}
protected function Query($query){
if (!Alert::Open()->SendAlert('DB_Driver', 'query', $query)) {
return false;
}
$this->Connect();
$this->result = @mysql_query($query);
if (mysql_errno()) {
echo "<br><b>Erreur ".mysql_errno()." MySQL:</b><br>"
.'<i>'.mysql_error().'</i><br>'
.'<u>Query: </u>'.$query;
trigger_error('MySQL: Requette impossible.', E_USER_ERROR);
return false;
}
return $this->result;
}
static protected function ProtectArray($array){
if ($array != array()) {
$Keys = array_keys($array);
$Values = array_values($array);
$Values = array_map('mysql_escape_string', $Values);
$Keys = array_map('mysql_escape_string', $Keys);
$array = array_combine($Keys, $Values);
}
return $array;
}
static protected function CreateWhere($condition) {
if (!is_array($condition) && $condition != null) {
return ' WHERE '.$condition;
}
$condition = self::ProtectArray($condition);
$query = '';
if ($condition != null && count($condition) != 0) {
$query .= ' WHERE ';
$and = false;
foreach($condition as $Col => $Val){
if ($and)
$query .= ' and ';
$query .= "`$Col`='$Val'";
$and = true;
}
}
return $query;
}
static protected function CreateOrder($Col){
$type = 'DESC';
$return ='';
$nbr = null;
$start = 0;
if (is_array($Col)) {
$nbr = (isset($Col['nbr']))?($Col['nbr']):(NULL);
$start = (isset($Col['start']))?($Col['start']):(0);
$Col = (isset($Col['order']))?($Col['order']):(NULL);
}
if ($Col != NULL && substr($Col, 0, 1) == '-') {
$type = 'ASC';
$Col = substr($Col, 1, strlen($Col) - 1);
}
if ($Col != NULL) {
$return = " ORDER BY `".mysql_escape_string($Col)."` $type";
}
if ($nbr) {
settype($nbr, 'integer');
settype($start, 'integer');
$return .= " LIMIT $start, $nbr";
}
return $return;
}
public function SetConfig($User, $Pass, $Base, $Prefix) {
$this->DB_User = $User;
$this->DB_Pass = $Pass;
$this->DB_Prefix = $Prefix;
$this->DB_Base = $Base;
return $this->Connect();
}
public function Select($condition = array(), $Colone = array('*'), $Order = NULL) {
$Colone = array_map('mysql_escape_string', $Colone);
if ($Colone = array('*')) {
$query = "SELECT *";
} else {
$query = "SELECT `".implode('`,`', $Colone).'`';
}
$query .= ' FROM `'.$this->DB_Prefix.mysql_escape_string($this->table).'`';
$query .= self::CreateWhere($condition);
$query .= self::CreateOrder($Order);
$query.=';';
return $this->Query($query);
}
public function DeleteFrom($condition = array()){
$query = 'DELETE FROM `'.$this->table.'`'
.self::CreateWhere($condition).';';
$this->Query($query);
}
public function InsertInto($infos){
$infos = self::ProtectArray($infos);
$keys = array_keys($infos);
$values = array_values($infos);
$query = 'INSERT INTO `'.$this->table.'` (';
$and = false;
foreach($keys as $col){
if ($and)
$query .= ', ';
$query .= "`$col`";
$and = true;
}
$query .= ') VALUES (';
$and = false;
foreach($values as $val){
if ($and)
$query .= ', ';
$query .= "'$val'";
$and = true;
}
$query .= ');';
$this->Query($query);
return mysql_insert_id();
}
public function Update($sets, $conditions) {
$query = 'UPDATE `'.$this->table.'` SET';
$sets = self::ProtectArray($sets);
$and = false;
foreach($sets as $col=>$var){
if ($and)
$query .= ',';
$query .= " `$col`='$var'";
$and = true;
}
$query .= self::CreateWhere($conditions);
$query .= ';';
return $this->Query($query);
}
}
class Data {
private $dbase;
public $table;
protected $data;
public $row;
function __construct($table, $database = NULL){
$this->dbase = ($database == NULL)?('NULL'):('\''.addcslashes($database, '\'').'\'');
$this->table = $table;
}
function __call($method, $args){
$com = '$sql = DB_Driver::Open('.$this->dbase.');';
$com.= '$sql->table = \''.$this->table.'\';';
$com.= 'return $sql->'.$method.'(';
$and = false;
foreach($args as $param){
if ($and)
$com.= ',';
$com.= var_export($param, true);
$and = true;
}
$fun = create_function('', $com.');');
$this->data = call_user_func($fun);
}
function __get($key){
return (isset($this->row[$key]))?($this->row[$key]):(null);
}
function next(){
$this->row = mysql_fetch_array($this->data);
return ($this->row === FALSE)?(FALSE):(TRUE);
}
}
$DB_Driver = DB_Driver::Open($SQL_SERVER);
$DB_Driver->SetConfig($SQL_USER, $SQL_PASS, $SQL_DATABASE, $SQL_PREFIXE);
unset($SQL_PASS, $SQL_USER, $SQL_PREFIXE, $SQL_DATABASE);
?>