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é :