Accueil > > > ABDMYSQL V1.4.8 ACCÈS AUX BASES DE DONNÉES MYSQL.
ABDMYSQL V1.4.8 ACCÈS AUX BASES DE DONNÉES MYSQL.
Information sur la source
Description
Cette classe permet d'accéder aux bases de données MySQL. Elle permet de se connecter, déconnecter, exécuter différentes requêtes, savoir si une table existe, la renommer, la supprimer, de connaitre le nombre de résultats d'une requête, d'exécuter plusieurs requêtes à la suite, de faire un remplacement de chaine de caractères, de sécuriser une valeur contre l'SQL Injection, de faire une sauvegarde d'une base de données (structure seule au format SQL, données seules (format SQL ou XML), ou les deux au format SQL) ou encore de savoir combien d'enregistrements contient une table (avec la possibilité d'ajouter des conditions), de récupérer le contenu d'une table dans un tableau associatif, etc. Cette classe intègre en plus une protection contre l'inclusion répétée du fichier et une gestion interne des erreurs via des constantes prédéfinies, la gestion d'exceptions, et la possibilité d'enregistrer les erreurs (paramétrable) dans un fichier journal au format XML. Fonctionnalité très importante : La classe libère automatiquement toutes les ressources non libérées lors de sa destruction pour alléger le serveur !
Source
- <?php
-
- # \
- # | Application : ABDMySQL
- # | Version : 1.4.8
- # | Auteur : Psykocrash (SERRAJ Younes)
- # | Messagerie : bonsite [at] hotmail [dot] com
- # | Date de modification : Dimanche 20 mai 2007
- # | Langage : PHP5
- # | URL : http://www.phpcs.com/codes/ABDMYSQL_38954.aspx
- # | Licence : http://www.gnu.org/licenses/lgpl.txt
- # | +-------------------------------------------------------+
- # | ABDMySQL. Accès aux bases de données MySQL.
- # | Copyright (C) 2007 SERRAJ Younes - Tous droits réservés.
- # |
- # | Cette bibliothèque est un logiciel libre ; vous pouvez la redistribuer ou
- # | la modifier suivant les termes de la Licence Générale Publique Limitée
- # | GNU telle que publiée par la Free Software Foundation dans la version 2.1
- # | de la License.
- # |
- # | Cette bibliothèque est distribuée dans l’espoir qu’elle sera utile, mais
- # | SANS AUCUNE GARANTIE : sans même la garantie implicite de
- # | COMMERCIABILISABILITÉ ou d’ADÉQUATION À UN OBJECTIF PARTICULIER. Consultez
- # | la Licence Générale Publique Limitée pour plus de détails.
- # |
- # | Vous devriez avoir reçu une copie de la Licence Générale Publique Limitée
- # | avec cette bibliothèque ; si ce n’est pas le cas, écrivez à la :
- # | Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- # | MA 02111-1307, USA.
- # | +-------------------------------------------------------+
- # /
-
- if (!defined("ABDMySQL_INCLUDED")) // Protection pour que le fichier ne soit inclus qu'une seule fois
- {
- define("ABDMySQL_INCLUDED", true);
-
- # CLASSE DE GESTION DE BASE DE DONNEE MySQL #
-
- // CONSTANTES GLOBALES
- define('ABDMYSQL_XML_ENCODING', 'UTF-8');
-
- // CONSTANTES D'ERREURS
- define('ERR_ABDMYSQL_CANNOT_CONNECT', -15001);
- define('ERR_ABDMYSQL_NOT_CONNECTED', -15002);
- define('ERR_ABDMYSQL_ALREADY_CONNECTED', -15003);
- define('ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST', -15004);
- define('ERR_ABDMYSQL_CANNOT_FOUND_FILE', -15005);
- define('ERR_ABDMYSQL_CANNOT_OPEN_FILE', -15006);
- define('ERR_ABDMYSQL_CANNOT_WRITE_FILE', -15007);
- define('ERR_ABDMYSQL_CANNOT_SELECT_DATABASE', -15008);
- define('ERR_ABDMYSQL_REQUIERE_VERSION_5', -15009);
- define('ERR_ABDMYSQL_INCOMPATIBLE_PARAMETERS', -15010);
- define('ERR_ABDMYSQL_CANNOT_OPEN_GZFILE', -15011);
- define('ERR_ABDMYSQL_CANNOT_WRITE_GZFILE', -15012);
- define('ERR_ABDMYSQL_INVALID_DATA_FORMAT', -15013);
- define('ERR_ABDMYSQL_DATA_MISSING', -15014);
- define('ERR_ABDMYSQL_INVALID_DATA', -15015);
-
- // MESSAGES D'ERREURS PREDEFINIS
- define('ERRMSG_ABDMYSQL_CANNOT_CONNECT', "Impossible d'établire une connexion.");
- define('ERRMSG_ABDMYSQL_NOT_CONNECTED', 'Non connecté.');
- define('ERRMSG_ABDMYSQL_ALREADY_CONNECTED', 'Connexion déjà établie.');
- define('ERRMSG_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST', "Impossible d'exécuter la requête.");
- define('ERRMSG_ABDMYSQL_CANNOT_OPEN_FILE', "Impossible d'ouvrir le fichier.");
- define('ERRMSG_ABDMYSQL_CANNOT_WRITE_FILE', "Impossible d'écrire dans le fichier.");
- define('ERRMSG_ABDMYSQL_CANNOT_SELECT_DATABASE', 'Impossible de sélectionner la base de données.');
- define('ERRMSG_ABDMYSQL_UNKNOWN_ERROR', 'Erreur inconnue.');
- define('ERRMSG_ABDMYSQL_REQUIERE_VERSION_5', "Cette action nécessite d'avoir au minimum la version 5 de MySQL.");
- define('ERRMSG_ABDMYSQL_INCOMPATIBLE_PARAMETERS', 'Paramètres incompatibles.');
- define('ERRMSG_ABDMYSQL_CANNOT_OPEN_GZFILE', "Impossible d'ouvrir le fichier compressé avec gzip.");
- define('ERRMSG_ABDMYSQL_CANNOT_WRITE_GZFILE', "Impossible d'écrire dans le fichier compressé avec gzip.");
- define('ERRMSG_ABDMYSQL_INVALID_DATA_FORMAT', 'Format de donnée(s) invalide pour cette opération.');
- define('ERRMSG_ABDMYSQL_DATA_MISSING', 'Paramètre(s) manquant(s).');
- define('ERRMSG_ABDMYSQL_INVALID_DATA', 'Paramètre(s) incorrect(s).');
-
- // INTERFACE
-
- interface ABDMySQL_Datetime_Interface
- {
- public function getDate();
- public function getTime();
- public function getDatetime();
- }
-
- interface ABDMySQL_Interface
- {
- // Fonctions générales
- public function connect($hostname='localhost', $username, $password, $database='');
- public function getMySQLLink();
- public function getRequestsCount();
- public function getLastInsertID();
- public function close();
- public function makeSafe(&$value);
-
- // Bases de données
- public function selectDatabase($name);
- public function getDatabasesList();
- public function databaseExists($name);
- public function databasesExists();
- public function deleteDatabase($name);
-
- // Tables
- public function tableExists($name);
- public function tablesExists();
- public function getTablesList();
- public function getTableStruct($name);
- public function getTableData($name);
- public function getFullTable($name);
- public function renameTable($oldName, $newName);
- public function deleteTable($name);
-
- // Vues
- public function createView($name, $columns, $table);
- public function deleteView($name);
-
- // Logs
- public function activate_errorsLog($filepath, $includeDetails=false, $includeMySQLError=false);
- public function desactivate_errorsLog();
-
- // Requêtes
- public function select($request);
- public function insert($request);
- public function update($request);
- public function replace($table, $row, $substring, $replacewith, $condition='');
- public function query_without_results($request);
- public function query($requests, $regexp_separator = '/;\n/m');
- public function delete($table, $condition='');
- public function rowsCount($table, $condition='');
-
- // Traitement des ressources
- public function isMySQLResource($resource);
- public function fetchAll($result, $resultType = MYSQL_ASSOC);
- public function freeResult($result);
- public function freeResults();
- public function resultsCount($result);
-
- // Backups
- public function saveCurrentDatabaseStruct_SQL($auto_increment=false, $output_file='', $append=false, $compressed=false);
- public function saveCurrentDatabaseData_SQL($output_file='', $append=false, $compressed=false);
- public function saveCurrentDatabaseData_XML($output_file='', $append=false, $compressed=false);
- }
-
- // CLASSES
- class ABDMySQL_Datetime implements ABDMySQL_Datetime_Interface
- {
- public function getDate()
- {
- return gmdate('Y-m-d');
- }
-
- public function getTime()
- {
- return gmdate('H:i:s');
- }
-
- public function getDatetime()
- {
- return gmdate('Y-m-d H:i:s');
- }
- }
-
- class ABDMySQL implements ABDMySQL_Interface
- {
- protected $app_name = 'ABDMySQL';
- protected $app_version = '1.4.8';
-
- protected $mysql_link = 0;
- private $mysql_version = false;
- protected $database = '';
- protected $requestsCount = 0;
- protected $logErrors = false;
- protected $errorsLogPath = '';
- protected $includeDetails = false;
- protected $includeMySQLError = false;
- protected $results = array();
-
- public $MySQLDatetime = NULL;
-
- function __destruct()
- {
- $this->close();
- }
-
- # Fonctions générales #
- public function connect($hostname='localhost', $username, $password, $database='')
- { // Connexion à la base de données
- $this->MySQLDatetime = new ABDMySQL_Datetime();
- if ($this->isConnected() == true) $this->_logError(ERR_ABDMYSQL_ALREADY_CONNECTED, 'connect'); // Si une connexion est déjà établie, Erreur.
- $this->mysql_link = mysql_connect($hostname, $username, $password, false, MYSQL_CLIENT_COMPRESS); // Tentative de connexion au serveur.
- if (!$this->mysql_link) $this->_logError(ERR_ABDMYSQL_CANNOT_CONNECT, 'connect', 'Hostname: \'' . $hostname . '\', Username: \'' . $username . "'"); // Si la connexion à échouée, Erreur.
- if (trim($database) != '') $this->selectDatabase($database); // Si la sélection d'une base de données a échouée, Erreur.
- $this->getMySQLVersion();
- }
-
- private function getMySQLVersion()
- {
- $this->mysql_version = substr(mysql_get_server_info(), 0, 1);
- }
-
- public function getMySQLLink()
- {
- return $this->mysql_link;
- }
-
- public function getRequestsCount()
- {
- return $this->requestsCount;
- }
-
- public function getLastInsertID()
- {
- return mysql_insert_id();
- }
-
- protected function isConnected()
- { // Vérification de l'existance d'une connexion
- if (!$this->mysql_link) return false;
- else return true;
- }
-
- public function close()
- {
- if ($this->isConnected() == true)
- {
- foreach($this->results as $result) $this->freeResult($result);
- mysql_close($this->mysql_link); // Fermeture de la connexion
- $this->mysql_link = false;
- $this->requestsCount = 0; // Initialisation du nombre de requêtes
- $this->database_name = ''; // Supression du nom de la base de données
- }
- }
-
- public function makeSafe(&$value)
- {
- $value = mysql_real_escape_string($value, $this->mysql_link);
- return $value;
- }
-
- protected function xmlEncode($value)
- {
- return htmlspecialchars(utf8_encode($value));
- }
-
- # Bases de données #
- public function selectDatabase($name)
- {
- if (!mysql_select_db($name, $this->mysql_link))
- {
- $this->_logError(ERR_ABDMYSQL_CANNOT_SELECT_DATABASE, 'selectDatabase', "Param: '" . $name . "'"); // Si la sélection d'une base de données a échouée, Erreur.
- }
- else
- {
- $this->database = $name; // Mémorisation du nom de la base de données.
- }
- }
-
- public function databaseExists($name)
- { // Vérification de l'existance d'une table
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'databaseExists'); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($name); // Protection contre l'SQL Injection.
- $databasesList = $this->getDatabasesList();
- if (!in_array($name, $databasesList)) return false; // Si aucune base de données de ce nom n'existe, renvoit la valeur 'false'.
- else return true; // Si une base de données de ce nom existe, renvoit de la valeur 'true'.
- }
-
- public function databasesExists()
- {
- $argsCount = func_num_args();
- if ($argsCount < 1) $this->logError(ERR_ABDMYSQL_DATA_MISSING, 'databasesExists');
- $argsList = func_get_args();
- $databasesList = $this->getDatabasesList();
- for ($i = 0; $i < $argsCount; $i++)
- {
- if (!in_array($argsList[$i], $databasesList)) return false;
- }
- return true;
- }
-
- public function getDatabasesList()
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'getDatabasesList'); // Si aucune connexion n'est établie, Erreur.
- $request = 'SHOW DATABASES'; // Construction de la requête.
- $result = mysql_query($request, $this->mysql_link); // Exécution d'une requête.
- $this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
- if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'getDatabasesList'); // Si la requête n'a pas été effectuée correctement, Erreur.
- $liste = array();
- while ($db = mysql_fetch_array($result))
- array_push($liste, $db['Database']);
- $this->freeResult($result);
- return $liste;
- }
-
- public function deleteDatabase($name)
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'deleteDatabase'); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($name); // Protection contre l'SQL Injection.
- $request = 'DROP DATABASE `' . $name . '`'; // Construction de la requête.
- $this->query_without_results($request);
- }
-
- # Tables #
- public function tableExists($name)
- { // Vérification de l'existance d'une table
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'tableExists'); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($name); // Protection contre l'SQL Injection.
- $tablesList = $this->getTablesList();
- if (!in_array($name, $tablesList)) return false;
- else return true; // Si une table de ce nom existe, renvoit de la valeur 'true'.
- }
-
- public function tablesExists()
- {
- $argsCount = func_num_args();
- if ($argsCount < 1) $this->logError(ERR_ABDMYSQL_DATA_MISSING, 'tablesExists');
- $argsList = func_get_args();
- $tablesList = $this->getTablesList();
- for ($i = 0; $i < $argsCount; $i++)
- {
- if (!in_array($argsList[$i], $tablesList)) return false;
- }
- return true;
- }
-
- public function getTablesList($database='')
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'getTablesList'); // Si aucune connexion n'est établie, Erreur.
- if (trim($database) == '') $database = $this->database;
- $request = 'SHOW TABLES FROM ' . $database; // Construction de la requête.
- $result = mysql_query($request, $this->mysql_link); // Exécution d'une requête.
- $this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
- if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'getTablesList', "Param: '" . $database . "'"); // Si la requête n'a pas été effectuée correctement, Erreur.
- $liste = array();
- while ($db = mysql_fetch_array($result))
- array_push($liste, $db['Tables_in_' . $database]);
- $this->freeResult($result);
- return $liste;
- }
-
- public function getTableStruct($name)
- { // Renvoit la structure d'une table
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'getTableStruct'); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($name); // Protection contre l'SQL Injection.
- if (!$this->tableExists($name)) return false;
- $table = array();
- $table['config'] = array();
- $table['config']['FullText'] = array();
- $table['config']['PrimaryKey'] = array();
- $result_table_status = $this->select('SHOW TABLE STATUS');
- $table_status = mysql_fetch_array($result_table_status);
- $this->freeResult($result_table_status);
- $result_table_columns = $this->select('SHOW COLUMNS FROM `' . $name . '`');
- while($champs = mysql_fetch_array($result_table_columns))
- {
- // Type
- $table['columns'][$champs['Field']]['Type'] = strtoupper($champs['Type']);
-
- // Null
- if ($champs['Null'] == "NO") $table['columns'][$champs['Field']]['Null'] = false;
- else $table['columns'][$champs['Field']]['Null'] = true;
-
- // AutoIncrement
- if ($champs['Extra'] == "auto_increment") $table['columns'][$champs['Field']]['AutoIncrement'] = true;
- else $table['columns'][$champs['Field']]['AutoIncrement'] = false;
-
- // PrimaryKey
- if ($champs['Key'] == "PRI")
- {
- $table['columns'][$champs['Field']]['PrimaryKey'] = true;
- array_push($table['config']['PrimaryKey'], $champs['Field']);
- }
- else
- {
- $table['columns'][$champs['Field']]['PrimaryKey'] = false;
- }
- }
- $this->freeResult($result_table_columns);
- $result_index = $this->select('SHOW INDEX FROM `' . $name . '`');
- if ($result_index)
- {
- while($champs = mysql_fetch_array($result_index))
- {
- if ($champs['Index_type']=="FULLTEXT")
- {
- $table['columns'][$champs['Column_name']]['FullText'] = true;
- array_push($table['config']['FullText'], $champs['Column_name']);
- }
- else
- {
- $table['columns'][$champs['Column_name']]['FullText'] = false;
- }
- }
- }
- $this->freeResult($result_index);
- $table['config']['Engine'] = $table_status['Engine'];
- if ($table_status['Auto_increment'] > 0) $table['config']['AutoIncrement'] = $table_status['Auto_increment'];
- return $table;
- }
-
- public function getTableData($name)
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'getTableData'); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($name);
- $result = $this->select('SELECT * FROM `' . $name . '`');
- $tableau = $this->fetchAll($result);
- $this->freeResult($result);
- return $tableau;
- }
-
- public function getFullTable($name)
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'getTableData'); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($name);
- $table = $this->getTableStruct($name);
- $table['content'] = $this->getTableData($name);
- return $table;
- }
-
- public function renameTable($oldName, $newName)
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'renameTable'); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($oldName); // Protection contre l'SQL Injection.
- $this->makeSafe($newName); // Protection contre l'SQL Injection.
- $request = 'ALTER TABLE `' . $oldName . '` RENAME `' . $newName . '`'; // Construction de la requête.
- $this->query_without_results($request);
- }
-
- public function deleteTable($name)
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'deleteTable'); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($name); // Protection contre l'SQL Injection.
- $request = 'DROP TABLE `' . $name . '`'; // Construction de la requête.
- $this->query_without_results($request);
- }
-
- # Vues #
- public function createView($name, $columns, $table)
- {
- if ($this->mysql_version < 5) $this->_logError(ERR_ABDMYSQL_REQUIERE_VERSION_5, 'createView'); // Si la version de MySQL est trop ancienne, Erreur.
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'createView'); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($name); // Protection contre l'SQL Injection.
- $this->makeSafe($table); // Protection contre l'SQL Injection.
- $request = 'CREATE VIEW `' . $name . '` AS SELECT ' . $columns . ' FROM `' . $table . '`'; // Construction de la requête.
- $this->query_without_results($request);
- }
-
- public function deleteView($name)
- {
- if ($this->mysql_version < 5) $this->_logError(ERR_ABDMYSQL_REQUIERE_VERSION_5, "deleteView"); // Si la version de MySQL est trop ancienne, Erreur.
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, "deleteView"); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($name); // Protection contre l'SQL Injection.
- $request = 'DROP VIEW `' . $name . '`'; // Construction de la requête.
- $this->query_without_results($request);
- }
-
- # Logs #
- public function activate_errorsLog($filepath, $includeDetails=false, $includeMySQLError=false)
- {
- if ($filepath == '') return ERR_ABDMYSQL_CANNOT_FOUND_FILE; // Si aucun fichier n'est spécifié, Erreur.
- if (!$this->makeLogFile($filepath)) false;
- $this->logErrors = true; // Activation de l'enregistrement des erreurs.
- $this->errorsLogPath = $filepath; // Mémorisation de l'adresse du fichier journal.
- $this->includeDetails = $includeDetails; // Définit si les détails doivent apparaitre dans le fichier journal.
- $this->includeMySQLError = $includeMySQLError; // Définit si le message d'erreur de mysql doit apparaitre dans le fichier journal.
- return true; // Activation réussie.
- }
-
- public function desactivate_errorsLog()
- {
- $this->logErrors = false; // Désactivation de l'enregistrement des erreurs.
- $this->errorsLogPath = ''; // Effacement de l'adresse du fichier journal de la mémoire.
- return true; // Désactivation réussie.
- }
-
- protected function makeLogFile($filepath)
- {
- $document_structure = '<?xml version="1.0" encoding="' . ABDMYSQL_XML_ENCODING . '" ?>'
- . "\n" . '<!-- ' . $this->app_name . ' version ' . $this->app_version . ' -->'
- . "\n\n" . '<ABDMySQL_Errors>' . "\n" . '</ABDMySQL_Errors>' . "\n";
- if (!is_writable($filepath))
- {
- if (file_exists($filepath)) $this->_logError(ERR_ABDMYSQL_CANNOT_WRITE_FILE, "makeFileLog"); // Si le fichier existe mais n'est pas accessible en écriture, Erreur.
- if (file_put_contents($filepath, $document_structure) < 1) return ERR_ABDMYSQL_CANNOT_WRITE_FILE; // Si le fichier n'existe pas et est impossible à créer, Erreur.
- }
- elseif (!filesize($filepath))
- {
- if (file_put_contents($filepath, $document_structure) < 1) return ERR_ABDMYSQL_CANNOT_WRITE_FILE; // Si le fichier n'existe pas et est impossible à créer, Erreur.
- }
- }
-
- protected function _logError($errorcode, $calledFunctionName, $details='')
- {
- if ($this->logErrors !== true || $this->errorsLogPath == '' || !file_exists($this->errorsLogPath) || !is_writable($this->errorsLogPath)) throw new Exception(ERRMSG_ABDMYSQL_UNKNOWN_ERROR, $errorcode); // Si l'enregistrement des erreurs n'est pas activé ou si le fichier journal n'existe pas, déclanchement de l'exception.
- switch ($errorcode)
- {
- case ERR_ABDMYSQL_CANNOT_CONNECT:
- $message = ERRMSG_ABDMYSQL_CANNOT_CONNECT;
- break;
- case ERR_ABDMYSQL_NOT_CONNECTED:
- $message = ERRMSG_ABDMYSQL_NOT_CONNECTED;
- break;
- case ERR_ABDMYSQL_ALREADY_CONNECTED:
- $message = ERRMSG_ABDMYSQL_ALREADY_CONNECTED;
- break;
- case ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST:
- $message = ERRMSG_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST;
- break;
- case ERR_ABDMYSQL_CANNOT_OPEN_FILE:
- $message = ERRMSG_ABDMYSQL_CANNOT_OPEN_FILE;
- break;
- case ERR_ABDMYSQL_CANNOT_WRITE_FILE:
- $message = ERRMSG_ABDMYSQL_CANNOT_WRITE_FILE;
- break;
- case ERR_ABDMYSQL_CANNOT_SELECT_DATABASE:
- $message = ERRMSG_ABDMYSQL_CANNOT_SELECT_DATABASE;
- break;
- case ERR_ABDMYSQL_REQUIERE_VERSION_5:
- $message = ERRMSG_ABDMYSQL_REQUIERE_VERSION_5;
- break;
- case ERR_ABDMYSQL_INCOMPATIBLE_PARAMETERS:
- $message = ERRMSG_ABDMYSQL_INCOMPATIBLE_PARAMETERS;
- break;
- case ERR_ABDMYSQL_CANNOT_OPEN_GZFILE:
- $message = ERRMSG_ABDMYSQL_CANNOT_OPEN_GZFILE;
- break;
- case ERR_ABDMYSQL_CANNOT_WRITE_GZFILE:
- $message = ERRMSG_ABDMYSQL_CANNOT_WRITE_GZFILE;
- break;
- case ERR_ABDMYSQL_INVALID_DATA_FORMAT:
- $message = ERRMSG_ABDMYSQL_INVALID_DATA_FORMAT;
- break;
- case ERR_ABDMYSQL_DATA_MISSING:
- $message = ERRMSG_ABDMYSQL_DATA_MISSING;
- break;
- case ERR_ABDMYSQL_INVALID_DATA:
- $message = ERRMSG_ABDMYSQL_INVALID_DATA;
- break;
- default:
- $message = ERRMSG_ABDMYSQL_UNKNOWN_ERROR;
- break;
- }
-
- $this->makeLogFile($this->errorsLogPath);
-
- $dom = new DomDocument();
- $dom->load($this->errorsLogPath);
-
- $node_error = $dom->createElement("error");
- $node_error->setAttribute("date", $this->xmlEncode(gmdate('D M d H:i:s Y')));
- $node_error->setAttribute("remote_addr", $this->xmlEncode($_SERVER['REMOTE_ADDR']));
- $node_error->setAttribute("called_function", $this->xmlEncode($calledFunctionName));
- $node_error->setAttribute("error_code", $errorcode);
-
- //$message = mb_convert_encoding($message, ABDMYSQL_XML_ENCODING);
- $node_message = $dom->createElement("message", $this->xmlEncode(utf8_encode($message)));//htmlentities(trim($message), ENT_COMPAT, ABDMYSQL_XML_ENCODING));
-
- if ($this->includeDetails == true && trim($details) != '')
- {
- $node_details = $dom->createElement("details", $this->xmlEncode(trim($details)));
- }
-
- if ($this->includeMySQLError == true)
- {
- $node_mysql_error = $dom->createElement("mysql_error", $this->xmlEncode(mysql_error()));
- }
-
- $node_error->appendChild($node_message);
- $node_error->appendChild($node_details);
- $node_error->appendChild($node_mysql_error);
-
- $racine = $dom->getElementsByTagName("ABDMySQL_Errors")->item(0);
-
- $racine->appendChild($node_error);
-
- $dom->save($this->errorsLogPath);
-
- throw new Exception($message, $errorcode); // Enregistrement réussit, déclanchement de l'exception.
- }
-
- # Requêtes #
- public function select($request)
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'select'); // Si aucune connexion n'est établie, Erreur.
- $result = mysql_query($request, $this->mysql_link); // Exécution d'une requête.
- array_push($this->results, $result);
- $this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
- if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'select', "Request :'" . $request . "'"); // Si la requête n'a pas été effectuée correctement, Erreur.
- return $result; // Renvoit du résultat de la requête.
- }
-
- public function insert($request)
- { // Alias
- $this->query_without_results($request);
- }
-
- public function update($request)
- { // Alias
- $this->query_without_results($request);
- }
-
- public function replace($table, $row, $substring, $replacewith, $condition='')
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'replace'); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($table);
- $this->makeSafe($row);
- $this->makeSafe($substring);
- $this->makeSafe($replacewith);
- if ($condition == '') $condition = '1';
- $request = "UPDATE `" . $table . "` SET " . $row . " = REPLACE(" . $row . ", '" . $substring . "', '" . $replacewith . "') WHERE " . $condition;
- $this->query_without_results($request);
- }
-
- public function query_without_results($request)
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'query_whitout_results'); // Si aucune connexion n'est établie, Erreur.
- $result = mysql_unbuffered_query($request, $this->mysql_link); // Exécution d'une requête.
- $this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
- if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'query_whitout_results', "Request :'" . $request . "'"); // Si la requête n'a pas été effectuée correctement, Erreur.
- }
-
- public function query($requests, $regexp_separator = '/;\n/m')
- { // Pour les requêtes multiples. Attention : Renvoit simplement true/false
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'query'); // Si aucune connexion n'est établie, Erreur.
-
- // Suppression des lignes commençants par le caractère '#' signalant un commentaire ;
- $lines = preg_replace('/^(\#(.*))$/m', '', $requests);
-
- // Séparation des requêtes ligne par ligne :
- $lines = preg_split($regexp_separator, $lines, -1, PREG_SPLIT_NO_EMPTY);
-
- // Pour chaque requête (ligne) :
- foreach ($lines as $nothing => $line)
- {
- $line = trim($line);
- if ($line == '') continue; // Si la ligne est vide, on continue la boucle.
- $result = mysql_unbuffered_query($line, $this->mysql_link); // Exécution d'une requête.
- if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'query', "Line: '" . $line . "'"); // Si la requête n'a pas été effectuée correctement, Erreur.
- $this->freeResult($result);
- $this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
- }
- }
-
- public function delete($table, $condition="")
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'delete'); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($table); // Protection contre l'SQL Injection.
- $request = 'DELETE FROM `' . $table . '`'; // Construction de la requête (1 sur 2).
- if ($condition != '') $request .= ' WHERE ' . $condition; // Construction de la requête (2 sur 2).
- $result = mysql_query($request, $this->mysql_link); // Exécution d'une requête.
- $this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
- if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'delete', "Request :'" . $request . "'"); // Si la requête n'a pas été effectuée correctement, Erreur.
- }
-
- public function rowsCount($table, $condition='')
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'rowsCount'); // Si aucune connexion n'est établie, Erreur.
- $this->makeSafe($table); // Protection contre l'SQL Injection.
- $request = 'SELECT COUNT( * ) FROM `' . $table . '`'; // Construction de la requête (1 sur 2).
- if (trim($condition)!="") $request .= ' WHERE ' . $condition; // Construction de la requête (2 sur 2).
- $result = mysql_query($request, $this->mysql_link); // Exécution d'une requête.
- $this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
- if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'rowsCount', "Request :'" . $request . "'"); // Si la requête n'a pas été effectuée correctement, Erreur.
- $resultat = mysql_fetch_row($result);
- $this->freeResult($result);
- return $resultat[0];
- }
-
- # Traitement des ressources #
- public function isMySQLResource($resource)
- {
- if (is_resource($resource) && (get_resource_type($resource) == 'mysql result')) return true;
- else return false;
- }
-
- public function fetchAll($result, $resultType = MYSQL_ASSOC)
- {
- if (!$this->isMySQLResource($result)) $this->logError(ERR_ABDMYSQL_INVALID_DATA_FORMAT, 'fetchAll');
- if ($resultType !== MYSQL_ASSOC && $resultType !== MYSQL_NUM && $resultType !== MYSQL_BOTH) $this->logError(ERR_ABDMYSQL_INVALID_DATA, 'fetchAll');
- $tableau = array();
- if ($this->resultsCount($result) < 1) return $tableau;
- mysql_data_seek($result, 0);
- while ($tuple = mysql_fetch_array($result, $resultType))
- {
- array_push($tableau, $tuple);
- }
- return $tableau;
- }
-
- public function freeResult($result)
- {
- if ($this->isMySQLResource($result)) mysql_free_result($result);
- }
-
- public function freeResults()
- {
- $argsCount = func_num_args();
- if ($argsCount < 1) $this->logError(ERR_ABDMYSQL_DATA_MISSING, 'freeResults');
- $argsList = func_get_args();
- for ($i = 0; $i < $argsCount; $i++)
- {
- if ($this->isMySQLResource($argsList[$i])) mysql_free_result($argsList[$i]);
- }
- }
-
- public function resultsCount($result)
- {
- if (!$result) $this->logError(ERR_ABDMYSQL_INVALID_DATA_FORMAT, 'resultsCount');
- return mysql_num_rows($result);
- }
-
- # Backups #
- public function saveCurrentDatabaseStruct_SQL($auto_increment = false, $output_file = '', $append = false, $compressed = false)
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'saveCurrentDatabaseStruct_SQL'); // Si aucune connexion n'est établie, Erreur.
- $resultat = '# ' . "\n"
- . '# ' . $this->app_name . "\n"
- . '# Version ' . $this->app_version . "\n"
- . '# ' . "\n"
- . '# Exportation de la structure de la base de données sous forme de requêtes SQL' . "\n"
- . '# ' . "\n"
- . '# Fait le ' . gmdate('d/m/Y à H:i:s') . "\n"
- . '# ' . "\n"
- . '# Base de données : `' . $this->database . '`' . "\n"
- . '# ' . "\n\n";
- $tablesList = $this->getTablesList();
- foreach ($tablesList as $nothing => $table)
- {
- $table_struct = $this->getTableStruct($table);
- $resultat .= 'CREATE TABLE `' . $table . "` (\n";
- foreach ($table_struct['columns'] as $column_name => $column_params)
- {
- $resultat .= '`' . $column_name . '` ' . $column_params['Type'] . ' ';
- if ($column_params['Null'] == false) $resultat .= 'NOT ';
- $resultat .= 'NULL ';
- if ($column_params['AutoIncrement'] == true) $resultat .= 'AUTO_INCREMENT ';
- $resultat .= ",\n";
- }
- if (count($table_struct['config']['PrimaryKey']) > 0)
- {
- $resultat .= 'PRIMARY KEY ( ';
- $spacer = '';
- foreach ($table_struct['config']['PrimaryKey'] as $nothing => $column_name)
- {
- $resultat .= $spacer . '`' . $column_name . '`';
- $spacer = ', ';
- }
- $resultat .= " ) ,\n";
- }
- if (count($table_struct['config']['FullText']) > 0)
- {
- $resultat .= 'FULLTEXT KEY ( ';
- $spacer = '';
- foreach ($table_struct['config']['FullText'] as $nothing => $column_name)
- {
- $resultat .= $spacer . '`' . $column_name . '`';
- $spacer = ', ';
- }
- $resultat .= " )\n";
- }
- $resultat .= ') ENGINE=' . $table_struct['config']['Engine'];
- if ($auto_increment == true && isset($table_struct['config']['AutoIncrement'])) $resultat .= ' AUTO_INCREMENT=' . $table_struct['config']['AutoIncrement'];
- $resultat .= ";\n\n";
- }
- if ($output_file!='')
- {
- $this->saveData('saveCurrentDatabaseStruct_SQL', $output_file, $resultat, $append, $compressed);
- } else return $resultat;
- }
-
- public function saveCurrentDatabaseData_SQL($output_file='', $append=false, $compressed=false)
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'saveCurrentDatabaseData_SQL'); // Si aucune connexion n'est établie, Erreur.
- $resultat = '# ' . "\n"
- . '# ' . $this->app_name . "\n"
- . '# Version ' . $this->app_version . "\n"
- . '# ' . "\n"
- . '# Exportation du contenu de la base de données sous forme de requêtes SQL' . "\n"
- . '# ' . "\n"
- . '# Fait le ' . gmdate('d/m/Y à H:i:s') . "\n"
- . '# ' . "\n"
- . '# Base de données : `' . $this->database . '`' . "\n"
- . '# ' . "\n\n";
- $tablesList = $this->getTablesList();
- foreach ($tablesList as $nothing => $table)
- {
- $fulltable = $this->getFullTable($table);
- if (count($fulltable['content']) > 0)
- {
- $spacer = '';
- $spacer_lines = '';
- $resultat .= 'INSERT INTO `' . $table . '` (';
- $columns = $this->getTableStruct($table);
- foreach ($columns['columns'] as $column_name => $nothing)
- {
- $resultat .= $spacer . '`' . $column_name . '`';
- $spacer = ', ';
- }
- $spacer = '';
- $resultat .= ") VALUES \n";
-
- foreach ($fulltable['content'] as $nothing => $line)
- {
- $resultat .= $spacer_lines . '(';
- $spacer = '';
- foreach ($line as $nothing => $column_value)
- {
- $resultat .= $spacer;
- if (is_numeric($column_value)) $resultat .= $column_value;
- else $resultat .= "'" . $this->makeSafe($column_value) . "'";
- $spacer = ', ';
- }
- $resultat .= ')';
- $spacer_lines = ",\n";
- }
- $resultat .= ";\n\n";
- }
- }
- if ($output_file!='')
- {
- $this->saveData('saveCurrentDatabaseData_SQL', $output_file, $resultat, $append, $compressed);
- } else return $resultat;
- }
-
- public function saveCurrentDatabaseData_XML($output_file='', $append=false, $compressed=false)
- {
- if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'saveCurrentDatabaseData_XML'); // Si aucune connexion n'est établie, Erreur.
- $resultat = '<!-- ' . "\n"
- . '- ' . $this->app_name . "\n"
- . '- Version ' . $this->app_version . "\n"
- . '- ' . "\n"
- . '- Exportation du contenu de la base de données au format XML' . "\n"
- . '- ' . "\n"
- . '- Fait le ' . gmdate('d/m/Y à H:i:s') . "\n"
- . '- ' . "\n"
- . '- Base de données : `' . $this->database . '`' . "\n"
- . '-->' . "\n\n";
-
- $resultat .= '<' . htmlspecialchars($this->database) . '>' . "\n";
- $tablesList = $this->getTablesList();
- foreach ($tablesList as $nothing => $table)
- {
- $tableData = $this->getTableData($table);
- $resultat .= ' <!-- ' . htmlspecialchars($table) . ' -->' . "\n";
- if (count($tableData) > 0)
- {
- foreach ($tableData as $nothing => $line)
- {
- $resultat .= ' <' . htmlspecialchars($table) . '>' . "\n";
- foreach ($line as $column_name => $column_value)
- {
- $resultat .= ' <' . htmlspecialchars($column_name) . '>'
- . htmlspecialchars($column_value)
- . '</' . htmlspecialchars($column_name) . '>' . "\n";
- }
- $resultat .= ' </' . htmlspecialchars($table) . '>' . "\n";
- }
- $resultat .= "\n";
- }
- }
- $resultat .= '</' . htmlspecialchars($this->database) . '>' . "\n";
- if ($output_file!='')
- {
- $this->saveData('saveCurrentDatabaseData_XML', $output_file, $resultat, $append, $compressed);
- } else return $resultat;
- }
-
- protected function saveData($calledFunctionName, $output_file, $content, $append=false, $compressed=false)
- {
- if ($append==true && $compressed==true) $this->_logError(ERR_ABDMYSQL_INCOMPATIBLE_PARAMETERS, $calledFunctionName . '->saveData', 'append=true AND compressed=true'); // Si deux paramètres sont incompatibles, Erreur.
- if ($compressed==false)
- {
- if ($append==true) $open_param = 'a';
- else $open_param = 'w';
- if (!$handle = fopen($output_file, $open_param)) $this->_logError(ERR_ABDMYSQL_CANNOT_OPEN_FILE, $calledFunctionName . '->saveData', 'File Path: \'' . $output_file . "'"); // Si l'ouverture du fichier a échouée, Erreur.
- if (fwrite($handle, $content) === false)
- {
- fclose($handle);
- $this->_logError(ERR_ABDMYSQL_CANNOT_WRITE_FILE, $calledFunctionName . '->saveData', "File Path: '".$output_file . "'");
- }
- fclose($handle);
- }
- else
- {
- if (!$handle = gzopen($output_file, 'wb9')) $this->_logError(ERR_ABDMYSQL_CANNOT_OPEN_GZFILE, $calledFunctionName . '->saveData', "File Path: '".$output_file . "'"); // Si l'ouverture du fichier a échouée, Erreur.
- if (gzwrite($handle, $content) === false)
- {
- fclose($handle);
- $this->_logError(ERR_ABDMYSQL_CANNOT_WRITE_GZFILE, $calledFunctionName . '->saveData', "File Path: '".$output_file . "'");
- }
- gzclose($handle);
- }
- }
- }
- }
- ?>
<?php
# \
# | Application : ABDMySQL
# | Version : 1.4.8
# | Auteur : Psykocrash (SERRAJ Younes)
# | Messagerie : bonsite [at] hotmail [dot] com
# | Date de modification : Dimanche 20 mai 2007
# | Langage : PHP5
# | URL : http://www.phpcs.com/codes/ABDMYSQL_38954.aspx
# | Licence : http://www.gnu.org/licenses/lgpl.txt
# | +-------------------------------------------------------+
# | ABDMySQL. Accès aux bases de données MySQL.
# | Copyright (C) 2007 SERRAJ Younes - Tous droits réservés.
# |
# | Cette bibliothèque est un logiciel libre ; vous pouvez la redistribuer ou
# | la modifier suivant les termes de la Licence Générale Publique Limitée
# | GNU telle que publiée par la Free Software Foundation dans la version 2.1
# | de la License.
# |
# | Cette bibliothèque est distribuée dans l’espoir qu’elle sera utile, mais
# | SANS AUCUNE GARANTIE : sans même la garantie implicite de
# | COMMERCIABILISABILITÉ ou d’ADÉQUATION À UN OBJECTIF PARTICULIER. Consultez
# | la Licence Générale Publique Limitée pour plus de détails.
# |
# | Vous devriez avoir reçu une copie de la Licence Générale Publique Limitée
# | avec cette bibliothèque ; si ce n’est pas le cas, écrivez à la :
# | Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# | MA 02111-1307, USA.
# | +-------------------------------------------------------+
# /
if (!defined("ABDMySQL_INCLUDED")) // Protection pour que le fichier ne soit inclus qu'une seule fois
{
define("ABDMySQL_INCLUDED", true);
# CLASSE DE GESTION DE BASE DE DONNEE MySQL #
// CONSTANTES GLOBALES
define('ABDMYSQL_XML_ENCODING', 'UTF-8');
// CONSTANTES D'ERREURS
define('ERR_ABDMYSQL_CANNOT_CONNECT', -15001);
define('ERR_ABDMYSQL_NOT_CONNECTED', -15002);
define('ERR_ABDMYSQL_ALREADY_CONNECTED', -15003);
define('ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST', -15004);
define('ERR_ABDMYSQL_CANNOT_FOUND_FILE', -15005);
define('ERR_ABDMYSQL_CANNOT_OPEN_FILE', -15006);
define('ERR_ABDMYSQL_CANNOT_WRITE_FILE', -15007);
define('ERR_ABDMYSQL_CANNOT_SELECT_DATABASE', -15008);
define('ERR_ABDMYSQL_REQUIERE_VERSION_5', -15009);
define('ERR_ABDMYSQL_INCOMPATIBLE_PARAMETERS', -15010);
define('ERR_ABDMYSQL_CANNOT_OPEN_GZFILE', -15011);
define('ERR_ABDMYSQL_CANNOT_WRITE_GZFILE', -15012);
define('ERR_ABDMYSQL_INVALID_DATA_FORMAT', -15013);
define('ERR_ABDMYSQL_DATA_MISSING', -15014);
define('ERR_ABDMYSQL_INVALID_DATA', -15015);
// MESSAGES D'ERREURS PREDEFINIS
define('ERRMSG_ABDMYSQL_CANNOT_CONNECT', "Impossible d'établire une connexion.");
define('ERRMSG_ABDMYSQL_NOT_CONNECTED', 'Non connecté.');
define('ERRMSG_ABDMYSQL_ALREADY_CONNECTED', 'Connexion déjà établie.');
define('ERRMSG_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST', "Impossible d'exécuter la requête.");
define('ERRMSG_ABDMYSQL_CANNOT_OPEN_FILE', "Impossible d'ouvrir le fichier.");
define('ERRMSG_ABDMYSQL_CANNOT_WRITE_FILE', "Impossible d'écrire dans le fichier.");
define('ERRMSG_ABDMYSQL_CANNOT_SELECT_DATABASE', 'Impossible de sélectionner la base de données.');
define('ERRMSG_ABDMYSQL_UNKNOWN_ERROR', 'Erreur inconnue.');
define('ERRMSG_ABDMYSQL_REQUIERE_VERSION_5', "Cette action nécessite d'avoir au minimum la version 5 de MySQL.");
define('ERRMSG_ABDMYSQL_INCOMPATIBLE_PARAMETERS', 'Paramètres incompatibles.');
define('ERRMSG_ABDMYSQL_CANNOT_OPEN_GZFILE', "Impossible d'ouvrir le fichier compressé avec gzip.");
define('ERRMSG_ABDMYSQL_CANNOT_WRITE_GZFILE', "Impossible d'écrire dans le fichier compressé avec gzip.");
define('ERRMSG_ABDMYSQL_INVALID_DATA_FORMAT', 'Format de donnée(s) invalide pour cette opération.');
define('ERRMSG_ABDMYSQL_DATA_MISSING', 'Paramètre(s) manquant(s).');
define('ERRMSG_ABDMYSQL_INVALID_DATA', 'Paramètre(s) incorrect(s).');
// INTERFACE
interface ABDMySQL_Datetime_Interface
{
public function getDate();
public function getTime();
public function getDatetime();
}
interface ABDMySQL_Interface
{
// Fonctions générales
public function connect($hostname='localhost', $username, $password, $database='');
public function getMySQLLink();
public function getRequestsCount();
public function getLastInsertID();
public function close();
public function makeSafe(&$value);
// Bases de données
public function selectDatabase($name);
public function getDatabasesList();
public function databaseExists($name);
public function databasesExists();
public function deleteDatabase($name);
// Tables
public function tableExists($name);
public function tablesExists();
public function getTablesList();
public function getTableStruct($name);
public function getTableData($name);
public function getFullTable($name);
public function renameTable($oldName, $newName);
public function deleteTable($name);
// Vues
public function createView($name, $columns, $table);
public function deleteView($name);
// Logs
public function activate_errorsLog($filepath, $includeDetails=false, $includeMySQLError=false);
public function desactivate_errorsLog();
// Requêtes
public function select($request);
public function insert($request);
public function update($request);
public function replace($table, $row, $substring, $replacewith, $condition='');
public function query_without_results($request);
public function query($requests, $regexp_separator = '/;\n/m');
public function delete($table, $condition='');
public function rowsCount($table, $condition='');
// Traitement des ressources
public function isMySQLResource($resource);
public function fetchAll($result, $resultType = MYSQL_ASSOC);
public function freeResult($result);
public function freeResults();
public function resultsCount($result);
// Backups
public function saveCurrentDatabaseStruct_SQL($auto_increment=false, $output_file='', $append=false, $compressed=false);
public function saveCurrentDatabaseData_SQL($output_file='', $append=false, $compressed=false);
public function saveCurrentDatabaseData_XML($output_file='', $append=false, $compressed=false);
}
// CLASSES
class ABDMySQL_Datetime implements ABDMySQL_Datetime_Interface
{
public function getDate()
{
return gmdate('Y-m-d');
}
public function getTime()
{
return gmdate('H:i:s');
}
public function getDatetime()
{
return gmdate('Y-m-d H:i:s');
}
}
class ABDMySQL implements ABDMySQL_Interface
{
protected $app_name = 'ABDMySQL';
protected $app_version = '1.4.8';
protected $mysql_link = 0;
private $mysql_version = false;
protected $database = '';
protected $requestsCount = 0;
protected $logErrors = false;
protected $errorsLogPath = '';
protected $includeDetails = false;
protected $includeMySQLError = false;
protected $results = array();
public $MySQLDatetime = NULL;
function __destruct()
{
$this->close();
}
# Fonctions générales #
public function connect($hostname='localhost', $username, $password, $database='')
{ // Connexion à la base de données
$this->MySQLDatetime = new ABDMySQL_Datetime();
if ($this->isConnected() == true) $this->_logError(ERR_ABDMYSQL_ALREADY_CONNECTED, 'connect'); // Si une connexion est déjà établie, Erreur.
$this->mysql_link = mysql_connect($hostname, $username, $password, false, MYSQL_CLIENT_COMPRESS); // Tentative de connexion au serveur.
if (!$this->mysql_link) $this->_logError(ERR_ABDMYSQL_CANNOT_CONNECT, 'connect', 'Hostname: \'' . $hostname . '\', Username: \'' . $username . "'"); // Si la connexion à échouée, Erreur.
if (trim($database) != '') $this->selectDatabase($database); // Si la sélection d'une base de données a échouée, Erreur.
$this->getMySQLVersion();
}
private function getMySQLVersion()
{
$this->mysql_version = substr(mysql_get_server_info(), 0, 1);
}
public function getMySQLLink()
{
return $this->mysql_link;
}
public function getRequestsCount()
{
return $this->requestsCount;
}
public function getLastInsertID()
{
return mysql_insert_id();
}
protected function isConnected()
{ // Vérification de l'existance d'une connexion
if (!$this->mysql_link) return false;
else return true;
}
public function close()
{
if ($this->isConnected() == true)
{
foreach($this->results as $result) $this->freeResult($result);
mysql_close($this->mysql_link); // Fermeture de la connexion
$this->mysql_link = false;
$this->requestsCount = 0; // Initialisation du nombre de requêtes
$this->database_name = ''; // Supression du nom de la base de données
}
}
public function makeSafe(&$value)
{
$value = mysql_real_escape_string($value, $this->mysql_link);
return $value;
}
protected function xmlEncode($value)
{
return htmlspecialchars(utf8_encode($value));
}
# Bases de données #
public function selectDatabase($name)
{
if (!mysql_select_db($name, $this->mysql_link))
{
$this->_logError(ERR_ABDMYSQL_CANNOT_SELECT_DATABASE, 'selectDatabase', "Param: '" . $name . "'"); // Si la sélection d'une base de données a échouée, Erreur.
}
else
{
$this->database = $name; // Mémorisation du nom de la base de données.
}
}
public function databaseExists($name)
{ // Vérification de l'existance d'une table
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'databaseExists'); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($name); // Protection contre l'SQL Injection.
$databasesList = $this->getDatabasesList();
if (!in_array($name, $databasesList)) return false; // Si aucune base de données de ce nom n'existe, renvoit la valeur 'false'.
else return true; // Si une base de données de ce nom existe, renvoit de la valeur 'true'.
}
public function databasesExists()
{
$argsCount = func_num_args();
if ($argsCount < 1) $this->logError(ERR_ABDMYSQL_DATA_MISSING, 'databasesExists');
$argsList = func_get_args();
$databasesList = $this->getDatabasesList();
for ($i = 0; $i < $argsCount; $i++)
{
if (!in_array($argsList[$i], $databasesList)) return false;
}
return true;
}
public function getDatabasesList()
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'getDatabasesList'); // Si aucune connexion n'est établie, Erreur.
$request = 'SHOW DATABASES'; // Construction de la requête.
$result = mysql_query($request, $this->mysql_link); // Exécution d'une requête.
$this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'getDatabasesList'); // Si la requête n'a pas été effectuée correctement, Erreur.
$liste = array();
while ($db = mysql_fetch_array($result))
array_push($liste, $db['Database']);
$this->freeResult($result);
return $liste;
}
public function deleteDatabase($name)
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'deleteDatabase'); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($name); // Protection contre l'SQL Injection.
$request = 'DROP DATABASE `' . $name . '`'; // Construction de la requête.
$this->query_without_results($request);
}
# Tables #
public function tableExists($name)
{ // Vérification de l'existance d'une table
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'tableExists'); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($name); // Protection contre l'SQL Injection.
$tablesList = $this->getTablesList();
if (!in_array($name, $tablesList)) return false;
else return true; // Si une table de ce nom existe, renvoit de la valeur 'true'.
}
public function tablesExists()
{
$argsCount = func_num_args();
if ($argsCount < 1) $this->logError(ERR_ABDMYSQL_DATA_MISSING, 'tablesExists');
$argsList = func_get_args();
$tablesList = $this->getTablesList();
for ($i = 0; $i < $argsCount; $i++)
{
if (!in_array($argsList[$i], $tablesList)) return false;
}
return true;
}
public function getTablesList($database='')
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'getTablesList'); // Si aucune connexion n'est établie, Erreur.
if (trim($database) == '') $database = $this->database;
$request = 'SHOW TABLES FROM ' . $database; // Construction de la requête.
$result = mysql_query($request, $this->mysql_link); // Exécution d'une requête.
$this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'getTablesList', "Param: '" . $database . "'"); // Si la requête n'a pas été effectuée correctement, Erreur.
$liste = array();
while ($db = mysql_fetch_array($result))
array_push($liste, $db['Tables_in_' . $database]);
$this->freeResult($result);
return $liste;
}
public function getTableStruct($name)
{ // Renvoit la structure d'une table
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'getTableStruct'); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($name); // Protection contre l'SQL Injection.
if (!$this->tableExists($name)) return false;
$table = array();
$table['config'] = array();
$table['config']['FullText'] = array();
$table['config']['PrimaryKey'] = array();
$result_table_status = $this->select('SHOW TABLE STATUS');
$table_status = mysql_fetch_array($result_table_status);
$this->freeResult($result_table_status);
$result_table_columns = $this->select('SHOW COLUMNS FROM `' . $name . '`');
while($champs = mysql_fetch_array($result_table_columns))
{
// Type
$table['columns'][$champs['Field']]['Type'] = strtoupper($champs['Type']);
// Null
if ($champs['Null'] == "NO") $table['columns'][$champs['Field']]['Null'] = false;
else $table['columns'][$champs['Field']]['Null'] = true;
// AutoIncrement
if ($champs['Extra'] == "auto_increment") $table['columns'][$champs['Field']]['AutoIncrement'] = true;
else $table['columns'][$champs['Field']]['AutoIncrement'] = false;
// PrimaryKey
if ($champs['Key'] == "PRI")
{
$table['columns'][$champs['Field']]['PrimaryKey'] = true;
array_push($table['config']['PrimaryKey'], $champs['Field']);
}
else
{
$table['columns'][$champs['Field']]['PrimaryKey'] = false;
}
}
$this->freeResult($result_table_columns);
$result_index = $this->select('SHOW INDEX FROM `' . $name . '`');
if ($result_index)
{
while($champs = mysql_fetch_array($result_index))
{
if ($champs['Index_type']=="FULLTEXT")
{
$table['columns'][$champs['Column_name']]['FullText'] = true;
array_push($table['config']['FullText'], $champs['Column_name']);
}
else
{
$table['columns'][$champs['Column_name']]['FullText'] = false;
}
}
}
$this->freeResult($result_index);
$table['config']['Engine'] = $table_status['Engine'];
if ($table_status['Auto_increment'] > 0) $table['config']['AutoIncrement'] = $table_status['Auto_increment'];
return $table;
}
public function getTableData($name)
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'getTableData'); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($name);
$result = $this->select('SELECT * FROM `' . $name . '`');
$tableau = $this->fetchAll($result);
$this->freeResult($result);
return $tableau;
}
public function getFullTable($name)
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'getTableData'); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($name);
$table = $this->getTableStruct($name);
$table['content'] = $this->getTableData($name);
return $table;
}
public function renameTable($oldName, $newName)
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'renameTable'); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($oldName); // Protection contre l'SQL Injection.
$this->makeSafe($newName); // Protection contre l'SQL Injection.
$request = 'ALTER TABLE `' . $oldName . '` RENAME `' . $newName . '`'; // Construction de la requête.
$this->query_without_results($request);
}
public function deleteTable($name)
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'deleteTable'); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($name); // Protection contre l'SQL Injection.
$request = 'DROP TABLE `' . $name . '`'; // Construction de la requête.
$this->query_without_results($request);
}
# Vues #
public function createView($name, $columns, $table)
{
if ($this->mysql_version < 5) $this->_logError(ERR_ABDMYSQL_REQUIERE_VERSION_5, 'createView'); // Si la version de MySQL est trop ancienne, Erreur.
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'createView'); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($name); // Protection contre l'SQL Injection.
$this->makeSafe($table); // Protection contre l'SQL Injection.
$request = 'CREATE VIEW `' . $name . '` AS SELECT ' . $columns . ' FROM `' . $table . '`'; // Construction de la requête.
$this->query_without_results($request);
}
public function deleteView($name)
{
if ($this->mysql_version < 5) $this->_logError(ERR_ABDMYSQL_REQUIERE_VERSION_5, "deleteView"); // Si la version de MySQL est trop ancienne, Erreur.
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, "deleteView"); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($name); // Protection contre l'SQL Injection.
$request = 'DROP VIEW `' . $name . '`'; // Construction de la requête.
$this->query_without_results($request);
}
# Logs #
public function activate_errorsLog($filepath, $includeDetails=false, $includeMySQLError=false)
{
if ($filepath == '') return ERR_ABDMYSQL_CANNOT_FOUND_FILE; // Si aucun fichier n'est spécifié, Erreur.
if (!$this->makeLogFile($filepath)) false;
$this->logErrors = true; // Activation de l'enregistrement des erreurs.
$this->errorsLogPath = $filepath; // Mémorisation de l'adresse du fichier journal.
$this->includeDetails = $includeDetails; // Définit si les détails doivent apparaitre dans le fichier journal.
$this->includeMySQLError = $includeMySQLError; // Définit si le message d'erreur de mysql doit apparaitre dans le fichier journal.
return true; // Activation réussie.
}
public function desactivate_errorsLog()
{
$this->logErrors = false; // Désactivation de l'enregistrement des erreurs.
$this->errorsLogPath = ''; // Effacement de l'adresse du fichier journal de la mémoire.
return true; // Désactivation réussie.
}
protected function makeLogFile($filepath)
{
$document_structure = '<?xml version="1.0" encoding="' . ABDMYSQL_XML_ENCODING . '" ?>'
. "\n" . '<!-- ' . $this->app_name . ' version ' . $this->app_version . ' -->'
. "\n\n" . '<ABDMySQL_Errors>' . "\n" . '</ABDMySQL_Errors>' . "\n";
if (!is_writable($filepath))
{
if (file_exists($filepath)) $this->_logError(ERR_ABDMYSQL_CANNOT_WRITE_FILE, "makeFileLog"); // Si le fichier existe mais n'est pas accessible en écriture, Erreur.
if (file_put_contents($filepath, $document_structure) < 1) return ERR_ABDMYSQL_CANNOT_WRITE_FILE; // Si le fichier n'existe pas et est impossible à créer, Erreur.
}
elseif (!filesize($filepath))
{
if (file_put_contents($filepath, $document_structure) < 1) return ERR_ABDMYSQL_CANNOT_WRITE_FILE; // Si le fichier n'existe pas et est impossible à créer, Erreur.
}
}
protected function _logError($errorcode, $calledFunctionName, $details='')
{
if ($this->logErrors !== true || $this->errorsLogPath == '' || !file_exists($this->errorsLogPath) || !is_writable($this->errorsLogPath)) throw new Exception(ERRMSG_ABDMYSQL_UNKNOWN_ERROR, $errorcode); // Si l'enregistrement des erreurs n'est pas activé ou si le fichier journal n'existe pas, déclanchement de l'exception.
switch ($errorcode)
{
case ERR_ABDMYSQL_CANNOT_CONNECT:
$message = ERRMSG_ABDMYSQL_CANNOT_CONNECT;
break;
case ERR_ABDMYSQL_NOT_CONNECTED:
$message = ERRMSG_ABDMYSQL_NOT_CONNECTED;
break;
case ERR_ABDMYSQL_ALREADY_CONNECTED:
$message = ERRMSG_ABDMYSQL_ALREADY_CONNECTED;
break;
case ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST:
$message = ERRMSG_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST;
break;
case ERR_ABDMYSQL_CANNOT_OPEN_FILE:
$message = ERRMSG_ABDMYSQL_CANNOT_OPEN_FILE;
break;
case ERR_ABDMYSQL_CANNOT_WRITE_FILE:
$message = ERRMSG_ABDMYSQL_CANNOT_WRITE_FILE;
break;
case ERR_ABDMYSQL_CANNOT_SELECT_DATABASE:
$message = ERRMSG_ABDMYSQL_CANNOT_SELECT_DATABASE;
break;
case ERR_ABDMYSQL_REQUIERE_VERSION_5:
$message = ERRMSG_ABDMYSQL_REQUIERE_VERSION_5;
break;
case ERR_ABDMYSQL_INCOMPATIBLE_PARAMETERS:
$message = ERRMSG_ABDMYSQL_INCOMPATIBLE_PARAMETERS;
break;
case ERR_ABDMYSQL_CANNOT_OPEN_GZFILE:
$message = ERRMSG_ABDMYSQL_CANNOT_OPEN_GZFILE;
break;
case ERR_ABDMYSQL_CANNOT_WRITE_GZFILE:
$message = ERRMSG_ABDMYSQL_CANNOT_WRITE_GZFILE;
break;
case ERR_ABDMYSQL_INVALID_DATA_FORMAT:
$message = ERRMSG_ABDMYSQL_INVALID_DATA_FORMAT;
break;
case ERR_ABDMYSQL_DATA_MISSING:
$message = ERRMSG_ABDMYSQL_DATA_MISSING;
break;
case ERR_ABDMYSQL_INVALID_DATA:
$message = ERRMSG_ABDMYSQL_INVALID_DATA;
break;
default:
$message = ERRMSG_ABDMYSQL_UNKNOWN_ERROR;
break;
}
$this->makeLogFile($this->errorsLogPath);
$dom = new DomDocument();
$dom->load($this->errorsLogPath);
$node_error = $dom->createElement("error");
$node_error->setAttribute("date", $this->xmlEncode(gmdate('D M d H:i:s Y')));
$node_error->setAttribute("remote_addr", $this->xmlEncode($_SERVER['REMOTE_ADDR']));
$node_error->setAttribute("called_function", $this->xmlEncode($calledFunctionName));
$node_error->setAttribute("error_code", $errorcode);
//$message = mb_convert_encoding($message, ABDMYSQL_XML_ENCODING);
$node_message = $dom->createElement("message", $this->xmlEncode(utf8_encode($message)));//htmlentities(trim($message), ENT_COMPAT, ABDMYSQL_XML_ENCODING));
if ($this->includeDetails == true && trim($details) != '')
{
$node_details = $dom->createElement("details", $this->xmlEncode(trim($details)));
}
if ($this->includeMySQLError == true)
{
$node_mysql_error = $dom->createElement("mysql_error", $this->xmlEncode(mysql_error()));
}
$node_error->appendChild($node_message);
$node_error->appendChild($node_details);
$node_error->appendChild($node_mysql_error);
$racine = $dom->getElementsByTagName("ABDMySQL_Errors")->item(0);
$racine->appendChild($node_error);
$dom->save($this->errorsLogPath);
throw new Exception($message, $errorcode); // Enregistrement réussit, déclanchement de l'exception.
}
# Requêtes #
public function select($request)
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'select'); // Si aucune connexion n'est établie, Erreur.
$result = mysql_query($request, $this->mysql_link); // Exécution d'une requête.
array_push($this->results, $result);
$this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'select', "Request :'" . $request . "'"); // Si la requête n'a pas été effectuée correctement, Erreur.
return $result; // Renvoit du résultat de la requête.
}
public function insert($request)
{ // Alias
$this->query_without_results($request);
}
public function update($request)
{ // Alias
$this->query_without_results($request);
}
public function replace($table, $row, $substring, $replacewith, $condition='')
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'replace'); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($table);
$this->makeSafe($row);
$this->makeSafe($substring);
$this->makeSafe($replacewith);
if ($condition == '') $condition = '1';
$request = "UPDATE `" . $table . "` SET " . $row . " = REPLACE(" . $row . ", '" . $substring . "', '" . $replacewith . "') WHERE " . $condition;
$this->query_without_results($request);
}
public function query_without_results($request)
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'query_whitout_results'); // Si aucune connexion n'est établie, Erreur.
$result = mysql_unbuffered_query($request, $this->mysql_link); // Exécution d'une requête.
$this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'query_whitout_results', "Request :'" . $request . "'"); // Si la requête n'a pas été effectuée correctement, Erreur.
}
public function query($requests, $regexp_separator = '/;\n/m')
{ // Pour les requêtes multiples. Attention : Renvoit simplement true/false
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'query'); // Si aucune connexion n'est établie, Erreur.
// Suppression des lignes commençants par le caractère '#' signalant un commentaire ;
$lines = preg_replace('/^(\#(.*))$/m', '', $requests);
// Séparation des requêtes ligne par ligne :
$lines = preg_split($regexp_separator, $lines, -1, PREG_SPLIT_NO_EMPTY);
// Pour chaque requête (ligne) :
foreach ($lines as $nothing => $line)
{
$line = trim($line);
if ($line == '') continue; // Si la ligne est vide, on continue la boucle.
$result = mysql_unbuffered_query($line, $this->mysql_link); // Exécution d'une requête.
if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'query', "Line: '" . $line . "'"); // Si la requête n'a pas été effectuée correctement, Erreur.
$this->freeResult($result);
$this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
}
}
public function delete($table, $condition="")
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'delete'); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($table); // Protection contre l'SQL Injection.
$request = 'DELETE FROM `' . $table . '`'; // Construction de la requête (1 sur 2).
if ($condition != '') $request .= ' WHERE ' . $condition; // Construction de la requête (2 sur 2).
$result = mysql_query($request, $this->mysql_link); // Exécution d'une requête.
$this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'delete', "Request :'" . $request . "'"); // Si la requête n'a pas été effectuée correctement, Erreur.
}
public function rowsCount($table, $condition='')
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'rowsCount'); // Si aucune connexion n'est établie, Erreur.
$this->makeSafe($table); // Protection contre l'SQL Injection.
$request = 'SELECT COUNT( * ) FROM `' . $table . '`'; // Construction de la requête (1 sur 2).
if (trim($condition)!="") $request .= ' WHERE ' . $condition; // Construction de la requête (2 sur 2).
$result = mysql_query($request, $this->mysql_link); // Exécution d'une requête.
$this->requestsCount++; // Incrémentation du nombre de requêtes effectuées.
if (!$result) $this->_logError(ERR_ABDMYSQL_CANNOT_CARRY_OUT_THE_REQUEST, 'rowsCount', "Request :'" . $request . "'"); // Si la requête n'a pas été effectuée correctement, Erreur.
$resultat = mysql_fetch_row($result);
$this->freeResult($result);
return $resultat[0];
}
# Traitement des ressources #
public function isMySQLResource($resource)
{
if (is_resource($resource) && (get_resource_type($resource) == 'mysql result')) return true;
else return false;
}
public function fetchAll($result, $resultType = MYSQL_ASSOC)
{
if (!$this->isMySQLResource($result)) $this->logError(ERR_ABDMYSQL_INVALID_DATA_FORMAT, 'fetchAll');
if ($resultType !== MYSQL_ASSOC && $resultType !== MYSQL_NUM && $resultType !== MYSQL_BOTH) $this->logError(ERR_ABDMYSQL_INVALID_DATA, 'fetchAll');
$tableau = array();
if ($this->resultsCount($result) < 1) return $tableau;
mysql_data_seek($result, 0);
while ($tuple = mysql_fetch_array($result, $resultType))
{
array_push($tableau, $tuple);
}
return $tableau;
}
public function freeResult($result)
{
if ($this->isMySQLResource($result)) mysql_free_result($result);
}
public function freeResults()
{
$argsCount = func_num_args();
if ($argsCount < 1) $this->logError(ERR_ABDMYSQL_DATA_MISSING, 'freeResults');
$argsList = func_get_args();
for ($i = 0; $i < $argsCount; $i++)
{
if ($this->isMySQLResource($argsList[$i])) mysql_free_result($argsList[$i]);
}
}
public function resultsCount($result)
{
if (!$result) $this->logError(ERR_ABDMYSQL_INVALID_DATA_FORMAT, 'resultsCount');
return mysql_num_rows($result);
}
# Backups #
public function saveCurrentDatabaseStruct_SQL($auto_increment = false, $output_file = '', $append = false, $compressed = false)
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'saveCurrentDatabaseStruct_SQL'); // Si aucune connexion n'est établie, Erreur.
$resultat = '# ' . "\n"
. '# ' . $this->app_name . "\n"
. '# Version ' . $this->app_version . "\n"
. '# ' . "\n"
. '# Exportation de la structure de la base de données sous forme de requêtes SQL' . "\n"
. '# ' . "\n"
. '# Fait le ' . gmdate('d/m/Y à H:i:s') . "\n"
. '# ' . "\n"
. '# Base de données : `' . $this->database . '`' . "\n"
. '# ' . "\n\n";
$tablesList = $this->getTablesList();
foreach ($tablesList as $nothing => $table)
{
$table_struct = $this->getTableStruct($table);
$resultat .= 'CREATE TABLE `' . $table . "` (\n";
foreach ($table_struct['columns'] as $column_name => $column_params)
{
$resultat .= '`' . $column_name . '` ' . $column_params['Type'] . ' ';
if ($column_params['Null'] == false) $resultat .= 'NOT ';
$resultat .= 'NULL ';
if ($column_params['AutoIncrement'] == true) $resultat .= 'AUTO_INCREMENT ';
$resultat .= ",\n";
}
if (count($table_struct['config']['PrimaryKey']) > 0)
{
$resultat .= 'PRIMARY KEY ( ';
$spacer = '';
foreach ($table_struct['config']['PrimaryKey'] as $nothing => $column_name)
{
$resultat .= $spacer . '`' . $column_name . '`';
$spacer = ', ';
}
$resultat .= " ) ,\n";
}
if (count($table_struct['config']['FullText']) > 0)
{
$resultat .= 'FULLTEXT KEY ( ';
$spacer = '';
foreach ($table_struct['config']['FullText'] as $nothing => $column_name)
{
$resultat .= $spacer . '`' . $column_name . '`';
$spacer = ', ';
}
$resultat .= " )\n";
}
$resultat .= ') ENGINE=' . $table_struct['config']['Engine'];
if ($auto_increment == true && isset($table_struct['config']['AutoIncrement'])) $resultat .= ' AUTO_INCREMENT=' . $table_struct['config']['AutoIncrement'];
$resultat .= ";\n\n";
}
if ($output_file!='')
{
$this->saveData('saveCurrentDatabaseStruct_SQL', $output_file, $resultat, $append, $compressed);
} else return $resultat;
}
public function saveCurrentDatabaseData_SQL($output_file='', $append=false, $compressed=false)
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'saveCurrentDatabaseData_SQL'); // Si aucune connexion n'est établie, Erreur.
$resultat = '# ' . "\n"
. '# ' . $this->app_name . "\n"
. '# Version ' . $this->app_version . "\n"
. '# ' . "\n"
. '# Exportation du contenu de la base de données sous forme de requêtes SQL' . "\n"
. '# ' . "\n"
. '# Fait le ' . gmdate('d/m/Y à H:i:s') . "\n"
. '# ' . "\n"
. '# Base de données : `' . $this->database . '`' . "\n"
. '# ' . "\n\n";
$tablesList = $this->getTablesList();
foreach ($tablesList as $nothing => $table)
{
$fulltable = $this->getFullTable($table);
if (count($fulltable['content']) > 0)
{
$spacer = '';
$spacer_lines = '';
$resultat .= 'INSERT INTO `' . $table . '` (';
$columns = $this->getTableStruct($table);
foreach ($columns['columns'] as $column_name => $nothing)
{
$resultat .= $spacer . '`' . $column_name . '`';
$spacer = ', ';
}
$spacer = '';
$resultat .= ") VALUES \n";
foreach ($fulltable['content'] as $nothing => $line)
{
$resultat .= $spacer_lines . '(';
$spacer = '';
foreach ($line as $nothing => $column_value)
{
$resultat .= $spacer;
if (is_numeric($column_value)) $resultat .= $column_value;
else $resultat .= "'" . $this->makeSafe($column_value) . "'";
$spacer = ', ';
}
$resultat .= ')';
$spacer_lines = ",\n";
}
$resultat .= ";\n\n";
}
}
if ($output_file!='')
{
$this->saveData('saveCurrentDatabaseData_SQL', $output_file, $resultat, $append, $compressed);
} else return $resultat;
}
public function saveCurrentDatabaseData_XML($output_file='', $append=false, $compressed=false)
{
if ($this->isConnected() == false) $this->_logError(ERR_ABDMYSQL_NOT_CONNECTED, 'saveCurrentDatabaseData_XML'); // Si aucune connexion n'est établie, Erreur.
$resultat = '<!-- ' . "\n"
. '- ' . $this->app_name . "\n"
. '- Version ' . $this->app_version . "\n"
. '- ' . "\n"
. '- Exportation du contenu de la base de données au format XML' . "\n"
. '- ' . "\n"
. '- Fait le ' . gmdate('d/m/Y à H:i:s') . "\n"
. '- ' . "\n"
. '- Base de données : `' . $this->database . '`' . "\n"
. '-->' . "\n\n";
$resultat .= '<' . htmlspecialchars($this->database) . '>' . "\n";
$tablesList = $this->getTablesList();
foreach ($tablesList as $nothing => $table)
{
$tableData = $this->getTableData($table);
$resultat .= ' <!-- ' . htmlspecialchars($table) . ' -->' . "\n";
if (count($tableData) > 0)
{
foreach ($tableData as $nothing => $line)
{
$resultat .= ' <' . htmlspecialchars($table) . '>' . "\n";
foreach ($line as $column_name => $column_value)
{
$resultat .= ' <' . htmlspecialchars($column_name) . '>'
. htmlspecialchars($column_value)
. '</' . htmlspecialchars($column_name) . '>' . "\n";
}
$resultat .= ' </' . htmlspecialchars($table) . '>' . "\n";
}
$resultat .= "\n";
}
}
$resultat .= '</' . htmlspecialchars($this->database) . '>' . "\n";
if ($output_file!='')
{
$this->saveData('saveCurrentDatabaseData_XML', $output_file, $resultat, $append, $compressed);
} else return $resultat;
}
protected function saveData($calledFunctionName, $output_file, $content, $append=false, $compressed=false)
{
if ($append==true && $compressed==true) $this->_logError(ERR_ABDMYSQL_INCOMPATIBLE_PARAMETERS, $calledFunctionName . '->saveData', 'append=true AND compressed=true'); // Si deux paramètres sont incompatibles, Erreur.
if ($compressed==false)
{
if ($append==true) $open_param = 'a';
else $open_param = 'w';
if (!$handle = fopen($output_file, $open_param)) $this->_logError(ERR_ABDMYSQL_CANNOT_OPEN_FILE, $calledFunctionName . '->saveData', 'File Path: \'' . $output_file . "'"); // Si l'ouverture du fichier a échouée, Erreur.
if (fwrite($handle, $content) === false)
{
fclose($handle);
$this->_logError(ERR_ABDMYSQL_CANNOT_WRITE_FILE, $calledFunctionName . '->saveData', "File Path: '".$output_file . "'");
}
fclose($handle);
}
else
{
if (!$handle = gzopen($output_file, 'wb9')) $this->_logError(ERR_ABDMYSQL_CANNOT_OPEN_GZFILE, $calledFunctionName . '->saveData', "File Path: '".$output_file . "'"); // Si l'ouverture du fichier a échouée, Erreur.
if (gzwrite($handle, $content) === false)
{
fclose($handle);
$this->_logError(ERR_ABDMYSQL_CANNOT_WRITE_GZFILE, $calledFunctionName . '->saveData', "File Path: '".$output_file . "'");
}
gzclose($handle);
}
}
}
}
?>
Conclusion
Si vous utilisez cette application, merci de me contacter par courrier électronique à l'adresse citée plus haut. Si vous avez des suggestions, n'hésitez surtout pas. C'est comme ça que nous pourrons, ensemble, faire évoluer cette application.
Historique
- 06 août 2006 15:05:07 :
- Ajout de fonctionnalité : Enregistrement des erreurs dans un fichier journal.
- 06 août 2006 15:18:25 :
- Correction de deux erreurs (sécurité).
- 07 août 2006 11:29:41 :
- Correction de bugs et amélioration du système de logs d'erreurs (Possibilité de choisir d'enregistrer ou non les requêtes qui n'ont pas pu être exécutées)
- 10 août 2006 01:56:59 :
- Correction de bugs, application d'une règle de nommage des fonctions et des variables pour une uniformisation du code et ajout d'une fonction permettant de sélectionner la base de données désirée.
- 14 août 2006 18:10:46 :
- Ajout de fonctionnalités :
- Possibilité de renommer/supprimer une table
- Possiblité de supprimer une base de données
-> Possibiltié de faire une SAUVEGARDE DE LA BASE DE DONNEES (Structure seule, donénes seules, ou les deux) avec choix entre récupérer les requêtes sql ou les enregistrer dans un fichier (overwrite ou append au choix) !!
- 14 août 2006 18:26:29 :
- - Correction de bugs
- Allégement du code (J'ai transformé les fonctions insert et update qui faisaient exactement la même chose en des alias de la fonction query_whitout_results().
- 18 août 2006 14:35:49 :
- Correction de bugs, amélioration du système de gestion des erreurs, et reprogrammation de la fonction rowsCount car elle devait avant sélectionner tous les tuples avant de les compter, ce qui demandait beaucoup trop de ressources.
- 18 août 2006 14:41:20 :
- Correction orthographique (whitout -> without).
- 21 août 2006 19:16:06 :
- Optimisation de la classe, mise en place d'une interface de classe, et protection des attributs et de certaines fonctions de la classe. Attention : Côté interface de classe, la version PHP5.2 bug lorsqu'il s'agit de déclarer des fonctions en mode protected. Je les aient donc mises en commentaire pour l'instant en attendant une correction du bug.
- 22 août 2006 14:43:09 :
- Ajout du zip contenant la classe et la licence.
- 25 août 2006 18:33:24 :
- Correction d'un p'tit bug, mise à jour des commentaires pour publier l'adresse du CVS.
- 27 août 2006 15:32:21 :
- Gestion des VIEWs.
- 27 août 2006 17:07:29 :
- Possibilité d'enregistrer la sauvegarde de la base de données au format gzip.
- 30 août 2006 17:18:19 :
- Ajout de 3 fonctions pour la gestion des dates/heures au format MySQL.
- 25 novembre 2006 00:41:27 :
- Gestion des exceptions, séparation de la gestion des dates dans une classe à part, correction de quelques bugs.
- 28 février 2007 15:19:46 :
- Ajout de la fonction freeResult(). La classe se charge maintenant de libérer toutes les ressources pour alléger le serveur.
- 28 février 2007 15:33:46 :
- Ajout de la fonction freeResult(). La classe se charge maintenant de libérer toutes les ressources pour alléger le serveur.
- 03 mars 2007 13:30:43 :
- Correction d'un bug lors de la libération des ressources.
- 26 mars 2007 22:04:43 :
- Correction d'un bug
- 26 avril 2007 18:46:19 :
- Ajout de la méthode replace().
Et enfin, j'ai choisis un nom pour la classe :D
- 26 avril 2007 18:46:38 :
- Ajout de la méthode replace().
Et enfin, j'ai choisis un nom pour la classe :D
- 03 mai 2007 15:20:19 :
- Ajout de nouvelles fonctionnalités (Liste des bases de données et les tables, vérifier si une base de données ou une table existe, il n'est plus obligatoire de spécifier une base de données lors de la connexion, possibilité de vérifier si une liste de tables ou de bases de données existent grâce à des fonctions à paramètres multiples, idem pour la libération de ressources).
- 12 mai 2007 01:49:10 :
- Ajout de la fonction fetchAll() qui permet de renvoyer un résultat sous forme de tableau. Correction de la fonction getMySQLVersion() qui ne fonctionnait qu'avec MySQL 5. Réorganisation de l'emplacement des méthodes dans la classe par catégories pour une maintenance plus facile.
- 16 mai 2007 00:47:04 :
- Très grande mise à jour : Ajout de méthodes pour récupérer la structure des tables et/ou leurs données sous forme de tableau, amélioration du système de backup, optimisation de la classe, amélioration de la fonction query grâce aux expressions régulières, utilisation de la compression de données de mysql, et correction de bugs. Passage de la classe en niveau Expert parce qu'elle commence à devenir plutôt complexe.
- 20 mai 2007 19:36:53 :
- Correction d'un bug important lors de l'exportation du contenu des bases de données. Intégration de l'XML (exportation des données (au choix) et enregistrement des erreurs au format XML). Amélioration de la gestion des erreurs et de la méthode fetchAll qui peux maintenant prendre un paramètre supplémentaire.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Formulaire avec select et update de bdd mysql [ par arnold002 ]
Bonjour à tous,J'ai un formulaire qui contient 2 champs de type select : classe et annee.Je veux associer chaque classe à chaque année
passage de variables de form vers bdd mysql [ par arnold002 ]
Bonjour,Mon problème n'avance pas...Mon form contient 2 champs select for($i<FONT color=#008000 s
Problème affichage BD multiples [ par ekipage2 ]
Bonjour,j'ai plusieurs BD : eleve / matières / et exercicesLorque l'élèv se connecte, il peut afficher la liste des exercices correspondants à sa clas
Recherche mysql [ par simon0000 ]
salut tous le monde ,j'ai une table mysql nomé ecole ou il ya
Retour des données d'une classe MySQL [ par Jerem_ ]
Salut, Depuis ce matin, j'asseye de coter une classe MySQL pour mon site. La classe marche très bien quand je fait une requete INSERT, etc .. M
Bug dans une double liste [ par stu76 ]
Bonjour, Malalam m'a donné des infos hier sur les doubles liste, et je le remercie car ca ma été super utile. J'ai presque résolu le prob sauf que je
Problème de code [ par stu76 ]
Bonjour tout le monde ,Voilà je planche sur un programme scolaire et j'ai un gros prob, je travaille sur un programme qui utilise trois base de d
Problème d'utilisation d'une classe MySQL du site [ par tataye ]
Bonjour,Je suis en train de faire des tests avec la classe SQL de FhX (source N°33135) et je rencontre actuellement quelques difficultés.J'ai fait un
inclusion d'une classe provenant d'un autre fichier [ par lilippx ]
salut, je me suis mis au php ce matin mais je bute sur un petit truc (dès le premier jour, ce n'est pas motivant...)je n'arrive pas à instancier un ob
Probleme POO [ par cedriclomb ]
Bonjour,Aujourd'hui au programme casse tete chinois ! :DVoila j'ai une classe B qui est une extends de Aun objet $b=new B;et ensuite $b->loadModule
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MYSQL_FETCH_ASSOCMYSQL_FETCH_ASSOC par moumenitaliano
Cliquez pour lire la suite par moumenitaliano
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|