<?php

// ------------------------------------------------------------------------- //
// Classe d'accès à MySQL                                                    //
// ------------------------------------------------------------------------- //
// Auteur: Pierre CAILLEUX <cpierre@atomicx.net>                             //
// Web:                                                                      //
// ------------------------------------------------------------------------- //

/*
Cette classe vous permet d'accéder facilement à une base MySQL, et d'ex&cuter
des requètes de type INSERT, SELECT, etc.. (avec gestion des commandes LOCK
TABLE) et gestion des résultats (fetch_row, fetch_object, etc...) et gestion des
erreurs (avec un mode Debug).

Tout est automatique : récupération du nombre de ligne touchées, et id
d'auto_increment, etc...

.------------------------------------------------------------------------------------.
| EXEMPLE D'UTILISATION DE LA CLASSE MySQL - Pierre CAILLEUX                         |
|------------------------------------------------------------------------------------.
| $SQL = new MySQL() ;                                                               |
| $SQL->connect() ; pour la base par default ($mysql_db) ou $SQL->connect("mabase) ; |
| $SQL->selectDb("mabase") ;  pour changer de base                                   |
| $SQL->query("ici ma requete SQL") ;                                                |
|       while($ligne = $SQL->getRow()) print $ligne[0] ;                             |
|       $SQL->logOff() ;                                                             |
|                                                                                    |
.------------------------------------------------------------------------------------.
|       $SQL = new MySQL("toto","tata") ; la connexion se fait directement           |
|       $SQL->selectDb("mabase") ;  pour changer de base                             |
|       $SQL->query("ici ma requete SQL") ;                                          |
|       while($ligne = $SQL->getRow()) print $ligne[0] ;                             |
|       $SQL->logOff() ;                                                             |
|                                                                                    |
.------------------------------------------------------------------------------------.
*/

Class MySQL {

/*
** Liste des variables
** de connexion à remplacer
** par les votres.
*/

var $mysql_user = "login" ;        /* Login de connexion           */
var $mysql_pass = "password" ;     /* Password de connexion        */
var $mysql_host = "mon_serveur" ;  /* Adresse du serveur           */
var $mysql_db   = "ma_base" ;      /* Base de donnée principale    */
var $mysql_port = 3306 ;           /* Port de connexion à MySQL    */

/*
** Liste des variables internes
*/

var $mysql_connect_id ;            /* ID de connexion à MySQL      */
var $mysql_resultat ;              /* ID de résultat               */
var $mysql_num_res ;               /* Nombre de lignes retournées  */
var $last_id_insert ;              /* Dernier Auto-ID inséré       */

var $sqlerreurno = 0 ;             /* n° de l'erreur mysql                 */
var $sqlerreurmsg = "" ;           /* n° de l'erreur mysql                 */
var $erreurmsg  = "" ;             /* message de l'erreur mysql    */
var $debug              = 0 ;      /* Afficher les erreurs                 */

// ----------------------------------------------------------------------------

/*
****    CONSTRUCTEUR AVEC ARGUMENTS MULTIPLES   ***
****    1 : login
****    2 : password
****    3 : host
****    4 : database
****    5 : port
*/

function MySQL()
{
    
$numargs = func_num_args();
    switch(
$numargs) {
        
// Sans argument, pas de connexion
        // (pour pouvoir changer un paramètre spécifique)
        
case 0  :       
        case
1  :       break ; // juste pour le style :-)

        // deux arguments : login et mot de passe
        
case 2  :       $this->mysql_user       = func_get_arg (0) ;
        
$this->mysql_pass       = func_get_arg (1) ;
        
$this->connect() ;
        break ;

        
// trois arguments : login, password, et adresse du serveur
        
case 3  :       $this->mysql_user       = func_get_arg (0) ;
        
$this->mysql_pass       = func_get_arg (1) ;
        
$this->mysql_host       = func_get_arg (2) ;
        
$this->connect() ;
        break ;

        
// quatre arguments : avec en plus la base de donnée à sélectionner             
        
case 4  :       $this->mysql_user       = func_get_arg (0) ;
        
$this->mysql_pass       = func_get_arg (1) ;
        
$this->mysql_host       = func_get_arg (2) ;
        
$this->mysql_db         = func_get_arg (3) ;
        
$this->connect() ;
        break ;

        
// Le port en plus
        
case 5  :       $this->mysql_user       = func_get_arg (0) ;
        
$this->mysql_pass       = func_get_arg (1) ;
        
$this->mysql_host       = func_get_arg (2) ;
        
$this->mysql_db         = func_get_arg (3) ;
        
$this->mysql_port       = func_get_arg (4) ;
        
$this->connect() ;
        break ;
    }
}

/* ---------------------------------------
** Fonction de connexion à la base
--------------------------------------- */

function connect($db="-")
{
    
/** Connexion à MySQL */
    
$this->erreurno = 0 ;
    
$this->mysql_connect_id =
       @
mysql_pconnect($this->mysql_host.":".$this->mysql_port,
                       
$this->mysql_user,
                       
$this->mysql_pass)
       or
$this->Erreur("Echec de connexion !") ;
    if(
$db!="-") $base = $db ;
    else
$base = $this->mysql_db ;

    
/** Sélection de la base de donnée */
    
@mysql_select_db($base, $this->mysql_connect_id)
    or
$this->Erreur("Séléction de la base IMPOSSIBLE !!") ;
}

/* ---------------------------------------
** Fonction de de-connexion à la base
--------------------------------------- */
function logOff()
{
    @
mysql_close($this->mysql_connect_id) ;
}

// ----------------------------------------------------------------------------

/* ---------------------------------------
** Selection d'une autre base de donnée
--------------------------------------- */

function selectDb($db)
{
    @
mysql_select_db($db, $this->mysql_connect_id)
    or
$this->Erreur("Séléction de la base IMPOSSIBLE !!") ;
}

// ----------------------------------------------------------------------------

/* ----------------------------------
** Fonction d'éxecution de requètes
---------------------------------- */

function query($query)
{
    
/** Exécution de la requète passée en paramètre */

    
$commande = strtoupper(substr($query, 0, 6));

    if(
$commande == "UNLOCK" || $commande == "LOCK T") {
        
$temp =         @mysql_query($query, $this->mysql_connect_id)
        or
$this->Erreur("Exécution de requète IMPOSSIBLE !!") ;
    } else {
        
$this->mysql_resultat =
            @
mysql_query($query, $this->mysql_connect_id)
            or
$this->Erreur("Exécution de requète IMPOSSIBLE !!") ;
    }

    if(
$this->sqlerreurno != 0) return false ;
    
/** Met à jour le nombre de lignes affectées par la requète envoyée */

    
if($commande == "SELECT")
        
$this->mysql_num_res = @mysql_num_rows($this->mysql_resultat) ;
    else
        
$this->mysql_num_res = @mysql_affected_rows($this->mysql_resultat) ;

    
/** En cas d'insertion retourne la valeur du dernier chanmps AUTO_INCREMENT */
    
if($commande == "INSERT")
        
$this->last_id_insert = @mysql_insert_id($this->mysql_connect_id) ;

    return
true ;
}

// ----------------------------------------------------------------------------


/* -----------------------------------------------------------------------------
** Execute une requete en verrouillant les tables
** passée en paramètre sous forme de chaine de caractères,
** avec une chaine  des droits correspondant R ou W (read ou write)
** les tables et les droits sont séparés par $separateur (<espace> par defaut).
** ATTENTION : toujours DE-verrouiller les tables avec unlockTables() ;
----------------------------------------------------------------------------- */

/*
**      Verrouillage des tables uniquement
*/
function lockTables($tables, $right, $separateur = " ")
{
    if(
sizeof($listeTable) != sizeof($listeDroits))
    {
        return
false ;
    }
    else
    {
        
$query = "LOCK TABLES " ;

        for(
$i=0; $i < sizeof($listeTable); $i++)
        {
            if(
$i != 0) $query .= ", " ;

            
$query .= $listeTable[$i] . " " ;
            switch(
strtoupper($listeDroits[$i]))
            {
            case
"R"        :       $query .= "READ" ;
                            break ;
            case
"W"        :       $query .= "WRITE" ;
                            break ;
            }
        }
        
$this->query($query) ;
        if(
$this->sqlerreurno != 0 ) return false ;
        else return
true ;
    }
}

/*
**      Verrouillage des tables et execution de la requete
**  puis déverrouillage des tables : utile pour une requete.
*/

function queryLock($requete, $tables, $right, $separateur = " ")
{
    
$listeTable             = explode($separateur, $tables) ;
    
$listeDroits    = explode($separateur, $right) ;

    if(
sizeof($listeTable) != sizeof($listeDroits)) {
        return
false ;
    }
    else {
        
$query = "LOCK TABLES " ;

        for(
$i=0; $i < sizeof($listeTable); $i++) {
            if(
$i != 0) $query .= ", " ;
            
$query .= $listeTable[$i] . " " ;
            switch(
strtoupper($listeDroits[$i])) {
            case
"R"        :       $query .= "READ" ;
                            break ;
            case
"W"        :       $query .= "WRITE" ;
                            break ;
            }
        }

        
$ret = $this->query($query) ;

        if(!
$ret) return false ;

        
$ret = $this->query($requete) ;

        if(!
$ret) return false ;

        
$ret = $this->unlockTables() ;

        if(!
$ret) return false ;        
        else return
true ;
        }       
}

/*
** De-verrouillage des tables
*/

function unlockTables()
{
    
$this->query("UNLOCK TABLES") ;
}

// ----------------------------------------------------------------------------


/* --------------------------------------------------------
**      Retourne une ligne de resultat sous différentes formes
-------------------------------------------------------- */

// Tableau à indice numériques : $ligne[0] ;
function getRow()
{
    
$ligne = mysql_fetch_row($this->mysql_resultat) ;
    return
$ligne ;
}

// Tableau à indice alphabétique : $ligne["ma_colonne"] ;               
function getArray()
{
    
$ligne = mysql_fetch_array($this->mysql_resultat) ;
    return
$ligne ;
}

// Objet : $ligne->ma_colonne ;
function getObject()
{
    
$ligne = mysql_fetch_object($this->mysql_resultat) ;
    return
$ligne ;
}                               

// ----------------------------------------------------------------------------


/* ------------------------------
** Fonction d'erreur
------------------------------ */

function Erreur($error_string)
{
    
/*
    ** Récuperation des messages et n° d'erreurs **
    */

    
$this->sqlerreurno = mysql_errno() ;
    
$this->erreurmsg = $error_string ;
    
$this->sqlerreurmsg = mysql_error() ;

    
/*
    ** En mode debug, on affiche le message et le n° de
    ** l'erreur en terminant le script.'

    if($this->debug == 1) {

    /*
    ** On ferme les balises susceptibles
    ** d'empecher l'affichage du message
    ** d'erreur.
    */

    
print "</li></dl></ol></table></script>" ;

    
/*
    ** On affiche l'erreur.
    */

    
print "<font color=\"#FF0000\"><p><strong>Erreur : </strong>";
    print
"$error_string </font><br>" ;
    print
mysql_error() . "Erreur n° : " . mysql_errno() ;

    
/*
    ** On arrete le script.
    */

    
die() ;
    }
}

// ----------------------------------------------------------------------------
}
?>