php, base de données et couche d’abstraction 3 (Driver MySQL)

Guillaume Kulakowski par Guillaume Kulakowski dans php 5 février 2005 0
Tags : MySQL PHP SGBD
php

Je viens de porter quelques retouches à mes driver MySQL (Ceux que j’utilise pour PortaLL mon portail perso). J’en profite donc pour vous les présenter. A noter que je n’ai pas encore testé l’abstraction avec un autre SGBD, mais normalement tout devrait aller très bien ;-).

Au programme des fonctionnalités :

  • Connexion/déconnexion.
  • Fonctions de base MySQL.
  • Compteur de requête.
  • Liste des requêtes effectuées par une page.
  • Mise en forme des requêtes avant de les afficher pour une lecture et un débogage facilités.
<?
/*-------------------------------------------------------------------------
|   PortaLL 2.1.
========================================
|   Par LLaumgui
|   (c) 2004
========================================
|   Web: http://www.xperience-fr.net
|   eMail: llaumgui_AT_xperience-fr.net
+-------------------------------------------------------------------------- */

/**
* Gestion des relation avec une base de données mySQL.
* @package portall
* @author LLaumgui
* @version $Id
*/

class DataBase {


    var $data = array ("db_host"   => "",
                       "db_login"  => "",
                       "db_pass"   => "",
                       "db_name"   => "",
                       "debug_mod" => "");         // Information présente dans la conf_global.php.
    
    var $query             = "";                   // La requête.
    var $listQuery         = "";                     // La liste des requêtes (débug mod = 2).
    var $connectionServer;                           // Connexion au serveur.
    var $connectionDB;                               // Connexion à la base de donées.
    var $countQuery        = 0;                      // nombre de requêtes MySQL
    var $fetch_row          = array();               // mysql_fetch_row
                           
                    
/**
* Constructeur de la classe
*/
    function DataBase() {
        require ROOT_PATH."conf_global.php";
        
        $this->data['db_host']   = $CONF['DB_HOST'];
        $this->data['db_login']  = $CONF['DB_LOGIN'];
        $this->data['db_pass']   = $CONF['DB_PASSWORD'];
        $this->data['db_name']   = $CONF['DB_NAME'];
        $this->data['debug_mod'] = $CONF['DEBUG'];
    }


//####################################################################################################
//      Fonctions de base du SGBD.
//####################################################################################################
    /**
     * Connexion à la base de données
     * @author LLaumgui
     */
    function connect() {
    
        $this->connectionServer = mysql_connect($this->data['db_host'],
                                                 $this->data['db_login'],
                                                 $this->data['db_pass'])
                                   or die ("PortaLL ERROR: Cannot connect to mySQL server");
        
        $this->connectionDB     = mysql_select_db($this->data['db_name'],
                                                     $this->connectionServer)
                                   or die ("PortaLL ERROR: Cannot connect to database ".$this->data['db_name']."");
    }


    /**
     * Requête simple
     * @author LLaumgui
     * @param (String) La requête à exécuter
     * @return (String) La requête
     */
    function query( $query ) {
    
        $this->query = mysql_query ($query) or die ($this->errorMsg($query));        // Requête mySQL.
        
        // Débugage
        if ($this->data['debug_mod'] > 0 ) { $this->countQuery++; }                                                // +1 requêtes.
        if ($this->data['debug_mod'] > 1 ) { $this->listQuery .= $query.'<br /><hr align="center" />'; }        // Ajoute les requète à la liste.
        
        return $this->query;
    }
    
    
    /**
     * Fonction mysql_fetch_array
     * @author LLaumgui
     * @param (String) La requête à exécuter
     * @return (array) Résultat de la commande mysql_fetch_array
     */
     function fetch_row( $query = "" ) {
    
        if ( empty($query) )
            { $this->fetch_row = mysql_fetch_array ($this->query); }
        else
            { $this->fetch_row = mysql_fetch_array ($query); }
        
        return $this->fetch_row;
    }
    
    
    /**
     * Fonction mysql_num_rows
     * @author LLaumgui
     * @param (String) La requête à exécuter
     * @return (int) Résultat de la commande mysql_num_rows
     */
    function num_rows( $query = "" ) {
    
        if ( empty($query) )
            { $num_rows = mysql_num_rows ($this->query); }
        else
            { $num_rows = mysql_num_rows ($query); }
        
        return $num_rows;
    }
    
    
//####################################################################################################
//      Fonctions évoluées
//####################################################################################################
    /**
     * Compteur de requète (Debug mod > 0)
     * @author LLaumgui
     * @return (int) Nombre de requêtes
     */
    function countQuery() {
    
        return $this->countQuery;
    }
    
    
    /**
     * Liste des requêtes utilisées pour une page (Debug mod > 1)
     * @author LLaumgui
     * @return (String) Liste des requêtes
     */
    function listQuery( $query = "" ) {
    
        $this->listQuery = $this->layout($this->listQuery, $separator = "<br />");
        
        return '<b><u><font size="+1">Debug mySQL :</font></u></b><br /><br />'.$this->listQuery;
    }
    
    
    /**
     * Message d'erreur en cas de problème sur une requète mySQL
     * @author LLaumgui
     * @return (String) Message d'erreur
     */
    function errorMsg( $query = "" ) {
            
        $msg_error = '<font color="#FF0000" size="6"><b>mySQL query error :</b></font><p> </p>';
        
        $msg_error .= '<p><b>mySQL error :</b> '.mysql_error().'</p>';
        
        $msg_error .= '<p><b>mySQL error code :</b> '.mysql_errno().'</p>';
        
        $msg_query = $this->layout($query);
        
        $msg_error .= '<span style="border: 1px solid #000000; width: 500px">'.$msg_query.'</span>';
        
        return errorMsg;
    }
    
    
    /**
     * Mise en forme du code mySQL
     * @author LLaumgui
     * @param (String) Liste des requêtes brute
     * @param (String) Séparateur de requêtes
     * @return (String) La liste des requêtes exécutées mise en forme
     */
    function layout( $text, $separator = "<br />" ) {
        
        if ($separator == '<br />' || $separator == '<br />' ) { $tab = '     '; } else { $tab = ''; }
        
        $text = preg_replace( '#SELECT\s(.+?)\sFROM\s#is' , '<span class="debug_command"><b>SELECT</b></span> \\1'.$separator.'<span class="debug_command"><b>FROM</b></span> ', $text );                        // SELECT xxx FROM
        $text = preg_replace( '#INSERT INTO\s(.+?)\sVALUES\s#is' , '<span class="debug_command"><b>INSERT INTO</b></span> \\1'.$separator.'<span class="debug_command"><b>VALUES</b></span> ', $text );            // INSERT xxx INTO
        $text = preg_replace( '#UPDATE\s(.+?)\sSET\s#is' , '<span class="debug_command"><b>UPDATE</b></span> \\1'.$separator.'<span class="debug_command"><b>SET</b></span> ', $text );            // UPDATE xxx SET
        $text = preg_replace( '#DELETE FROM\s#is' , '<span class="debug_command"><b>DELETE FROM</b></span> ', $text );                                                                                    // DELET FROM xxx
        $text = preg_replace( '#\sLEFT JOIN\s(.+?)\sON\s#is' , $separator.$tab.'<span class="debug_command"><b>LEFT JOIN</b></span> \\1 <span class="debug_command"><b>ON</b></span> ', $text );                    // LEFT JOIN xxx ON
            $text = preg_replace( '#\sWHERE\s#is' , $separator.'<span class="debug_command"><b>WHERE </b></span>', $text );                                                                            // WHERE
            $text = preg_replace( '#\sORDER BY\s#is' , $separator.'<span class="debug_command"><b>ORDER BY</b></span> ', $text );                                                                        // ORDER BY
            $text = preg_replace( '#\sLIMIT\s#is' , $separator.'<span class="debug_command"><b>LIMIT</b></span> ', $text );                                                                            // LIMIT
            $text = preg_replace( '#\sCOUNT\((.+?)\)\sAS\s#is' , ' <b>COUNT(</b>\\1<b>) AS</b> ', $text );
            
        return $text;
    }


    /**
     * Déconnexion de la base de données
     * @author LLaumgui
     */
    function close() {

        mysql_close( $this->connectionServer );
    }
    
    
}    // EOC


?>

Ce qui donne avec le mod débug activé :

Commentaires

Les commentaires pour ce poste sont fermés.