Bontiv-Sourceer source code viewer
Root | Help
./PhpMyCMS/inc/sql.php
<?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);
?>
Presented with Bontiv-Sourceer