diff --git a/htdocs/lib/databases/mysql.lib.php b/htdocs/lib/databases/mysql.lib.php index 67d6bb5ef8cec8c749bf4383bf8a0d2f7128acd6..be0ebcef89e97428007d4c3cf74391f69b6cc4db 100644 --- a/htdocs/lib/databases/mysql.lib.php +++ b/htdocs/lib/databases/mysql.lib.php @@ -79,7 +79,7 @@ class DoliDb \param pass Mot de passe \param name Nom de la database \param port Port of database server - \return int 1 en cas de succ�s, 0 sinon + \return int 1 en cas de succes, 0 sinon */ function DoliDb($type='mysql', $host, $user, $pass, $name='', $port=0) { @@ -95,12 +95,14 @@ class DoliDb $this->transaction_opened=0; + //print "Name DB: $host,$user,$pass,$name<br>"; + if (! function_exists("mysql_connect")) { $this->connected = 0; $this->ok = 0; - $this->error="Mysql PHP functions for using MySql driver are not available in this version of PHP"; - dolibarr_syslog("DoliDB::DoliDB : Mysql PHP functions for using Mysql driver are not available in this version of PHP",LOG_ERR); + $this->error="Mysql PHP functions for using MySql driver are not available in this version of PHP. Try to use another driver."; + dolibarr_syslog("DoliDB::DoliDB : Mysql PHP functions for using Mysql driver are not available in this version of PHP. Try to use another driver.",LOG_ERR); return $this->ok; } @@ -350,7 +352,7 @@ class DoliDb if (! $this->database_name) { - // Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE) + // Ordre SQL ne necessitant pas de connexion a une base (exemple: CREATE DATABASE) $ret = mysql_query($query, $this->db); } else @@ -381,7 +383,7 @@ class DoliDb */ function fetch_object($resultset=0) { - // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } return mysql_fetch_object($resultset); } @@ -393,7 +395,7 @@ class DoliDb */ function fetch_array($resultset=0) { - // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } return mysql_fetch_array($resultset); } @@ -406,7 +408,7 @@ class DoliDb */ function fetch_row($resultset=0) { - // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } return @mysql_fetch_row($resultset); } diff --git a/htdocs/lib/databases/mysqli.lib.php b/htdocs/lib/databases/mysqli.lib.php index 1ad31c35a8d63c349c43f71f52afdb1c72d460e2..3a59a77dd97d8c680ee34ab1988608fa437568ed 100644 --- a/htdocs/lib/databases/mysqli.lib.php +++ b/htdocs/lib/databases/mysqli.lib.php @@ -22,27 +22,27 @@ /** * \file htdocs/lib/databases/mysqli.lib.php - * \brief Fichier de la classe permettant de g�rer une base mysql + * \brief Class file to manage Dolibarr database access for a Mysql database * \version $Id$ */ -// Pour compatibilit� lors de l'upgrade +// For compatibility during upgrade if (! defined('DOL_DOCUMENT_ROOT')) define('DOL_DOCUMENT_ROOT', '../..'); if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php"); /** * \class DoliDb - * \brief Classe permettant de g�r�r la database de dolibarr + * \brief Class to manage Dolibarr database access for a Mysql database */ class DoliDb { - //! Handler de base + //! Database handler var $db; - //! Nom du gestionnaire + //! Database type var $type='mysqli'; - //! Charset + //! Charset used to force charset when creating database var $forcecharset='latin1'; - //! Collate + //! Collate used to force collate when creating database var $forcecollate='latin1_swedish_ci'; //! Version min database var $versionmin=array(4,1,0); @@ -79,7 +79,7 @@ class DoliDb \param pass Mot de passe \param name Nom de la database \param port Port of database server - \return int 1 en cas de succ�s, 0 sinon + \return int 1 en cas de succes, 0 sinon */ function DoliDb($type='mysqli', $host, $user, $pass, $name='', $port=0) { @@ -101,8 +101,8 @@ class DoliDb { $this->connected = 0; $this->ok = 0; - $this->error="Mysqli PHP functions are not available in this version of PHP. Try to use another driver."; - dolibarr_syslog("DoliDB::DoliDB : Mysql PHP functions are not available in this version of PHP. Try to use another driver.",LOG_ERR); + $this->error="Mysqli PHP functions for using Mysqli driver are not available in this version of PHP. Try to use another driver."; + dolibarr_syslog("DoliDB::DoliDB : Mysqli PHP functions for using Mysqli driver are not available in this version of PHP. Try to use another driver.",LOG_ERR); return $this->ok; } @@ -116,6 +116,7 @@ class DoliDb } // Essai connexion serveur + // We do not try to connect to database, only to server. Connect to database is done later in constrcutor $this->db = $this->connect($host, $user, $pass, '', $port); if ($this->db) @@ -132,7 +133,7 @@ class DoliDb dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mysqli_connect_error=".$this->error,LOG_ERR); } - // Si connexion serveur ok et si connexion base demand�e, on essaie connexion base + // Si connexion serveur ok et si connexion base demandee, on essaie connexion base if ($this->connected && $name) { if ($this->select_db($name)) @@ -141,13 +142,15 @@ class DoliDb $this->database_name = $name; $this->ok = 1; - // If client connected with different charset than Dolibarr database - // (La base Dolibarr was forced to this->forcecharset during install) - /*if (mysqli_client_encoding ( $this->db ) != $this->getDefaultCharacterSetDatabase()) + // If client connected with different charset than Dolibarr HTML output + $clientmustbe=''; + if (eregi('UTF-8',$conf->character_set_client)) $clientmustbe='utf8'; + if (eregi('ISO-8859-1',$conf->character_set_client)) $clientmustbe='latin1'; + if (mysqli_client_encoding($this->db) != $clientmustbe) { - $this->query("SET NAMES '".$this->forcecharset."'", $this->db); - $this->query("SET CHARACTER SET '".$this->forcecharset."'", $this->db); - }*/ + $this->query("SET NAMES '".$clientmustbe."'", $this->db); + //$this->query("SET CHARACTER SET ". $this->forcecharset); + } } else { @@ -155,13 +158,26 @@ class DoliDb $this->database_name = ''; $this->ok = 0; $this->error=$this->error(); - dolibarr_syslog("DoliDB::DoliDB : Erreur Select_db"); + dolibarr_syslog("DoliDB::DoliDB : Erreur Select_db ".$this->error,LOG_ERR); } } else { // Pas de selection de base demandee, ok ou ko $this->database_selected = 0; + + if ($this->connected) + { + // If client connected with different charset than Dolibarr HTML output + $clientmustbe=''; + if (eregi('UTF-8',$conf->character_set_client)) $clientmustbe='utf8'; + if (eregi('ISO-8859-1',$conf->character_set_client)) $clientmustbe='latin1'; + if (mysqli_client_encoding($this->db) != $clientmustbe) + { + $this->query("SET NAMES '".$clientmustbe."'", $this->db); + //$this->query("SET CHARACTER SET ". $this->forcecharset); + } + } } return $this->ok; @@ -190,7 +206,7 @@ class DoliDb /** - * \brief Connection vers le serveur + * \brief Connexion to server * \param host database server host * \param login login * \param passwd password @@ -201,7 +217,7 @@ class DoliDb */ function connect($host, $login, $passwd, $name, $port=0) { - dolibarr_syslog("DoliDB::connect host=$host, port=$port, login=$login, passwd=--hidden--, name=$name"); + dolibarr_syslog("DoliDB::connect host=$host, port=$port, login=$login, passwd=--hidden--, name=$name",LOG_DEBUG); $newhost=$host; $newport=$port; @@ -210,17 +226,8 @@ class DoliDb if (! $newport) $newport=3306; $this->db = @mysqli_connect($newhost, $login, $passwd, $name, $newport); - // Force recors to latin1 if database is in utf8 by default - // Removed becasue faile on my PHP-Mysql. - // De plus, la base est forcement en latin1 avec - // les nouvelles version de Dolibarr car force par l'install Dolibarr. - //$this->query('SET NAMES '.$this->forcecharset); + //print "Resultat fonction connect: ".$this->db; - if ($this->db) - { - $this->query("SET NAMES '".$this->forcecharset."'", $this->db); - $this->query("SET CHARACTER SET '".$this->forcecharset."'", $this->db); - } return $this->db; } @@ -350,7 +357,7 @@ class DoliDb $query = trim($query); if (! $this->database_name) { - // Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE + // Ordre SQL ne necessitant pas de connexion a une base (exemple: CREATE DATABASE) $ret = mysqli_query($this->db,$query); } else @@ -381,7 +388,7 @@ class DoliDb */ function fetch_object($resultset=0) { - // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion if (! is_object($resultset)) { $resultset=$this->results; } return mysqli_fetch_object($resultset); } @@ -395,7 +402,7 @@ class DoliDb function fetch_array($resultset=0) { - // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion if (! is_object($resultset)) { $resultset=$this->results; } return mysqli_fetch_array($resultset); } @@ -408,7 +415,7 @@ class DoliDb function fetch_row($resultset=0) { - // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion if (! is_bool($resultset)) { if (! is_object($resultset)) { $resultset=$this->results; } @@ -416,7 +423,7 @@ class DoliDb } else { - // si le curseur est un bool�en on retourne la valeur 0 + // si le curseur est un booleen on retourne la valeur 0 return 0; } } @@ -521,11 +528,11 @@ class DoliDb /** - * \brief Formatage (par la base de donn�es) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS) - * afin de retourner une donn�e toujours au format universel date tms unix. + * \brief Formatage (par la base de donn�es) d'un champ de la base au format TMS ou Date (YYYY-MM-DD HH:MM:SS) + * afin de retourner une donn�e toujours au format universel date TMS unix. * Fonction � utiliser pour g�n�rer les SELECT. - * \param param Date au format text � convertir - * \return date Date au format tms. + * \param param Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS' + * \return date Date au format TMS. * \TODO Remove unix_timestamp functions */ function pdate($param) @@ -536,8 +543,8 @@ class DoliDb /** * \brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date. * Fonction � utiliser pour g�n�rer les INSERT, UPDATE ou les clauses WHERE - * \param param Date tms � convertir - * \return date Date au format text YYYYMMDDHHMMSS. + * \param param Date TMS � convertir + * \return date Date au format texte YYYYMMDDHHMMSS. */ function idate($param) { @@ -688,20 +695,23 @@ class DoliDb /** - \brief Cr�ation d'une nouvelle base de donn�e - \param database nom de la database � cr�er - \return resource resource d�finie si ok, null si k - \remarks Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated + * \brief Create a new database + * \param database Database name to create + * \return resource resource defined if OK, null if KO + * \remarks Do not use function xxx_create_db (xxx=mysql, ...) as they are deprecated + * We force to create database with charset this->forcecharset and collate this->forcecollate */ function DDLCreateDb($database) { // ALTER DATABASE dolibarr_db DEFAULT CHARACTER SET latin DEFAULT COLLATE latin1_swedish_ci $sql = 'CREATE DATABASE '.$database; $sql.= ' DEFAULT CHARACTER SET '.$this->forcecharset.' DEFAULT COLLATE '.$this->forcecollate; + + dolibarr_syslog($sql,LOG_DEBUG); $ret=$this->query($sql); if (! $ret) { - // On r�essaie pour compatibilit� avec Mysql < 4.1.1 + // We try again for compatibility with Mysql < 4.1.1 $sql = 'CREATE DATABASE '.$database; $ret=$this->query($sql); } @@ -721,7 +731,7 @@ class DoliDb $like = ''; if ($table) $like = "LIKE '".$table."'"; $sql="SHOW TABLES FROM ".$database." ".$like.";"; - // $sql; + //print $sql; $result = $this->query($sql); while($row = $this->fetch_row($result)) { @@ -799,7 +809,7 @@ class DoliDb $sql .= ",".implode(',',$sqlk); $sql .=") type=".$type; - dolibarr_syslog($sql); + dolibarr_syslog($sql,LOG_DEBUG); if(! $this -> query($sql)) return -1; else @@ -816,7 +826,7 @@ class DoliDb { $sql="DESC ".$table." ".$field; - dolibarr_syslog($sql); + dolibarr_syslog($sql,LOG_DEBUG); $this->results = $this->query($sql); return $this->results; } @@ -850,6 +860,7 @@ class DoliDb $sql .= " ".$field_desc['extra']; $sql .= " ".$field_position; + dolibarr_syslog($sql,LOG_DEBUG); if(! $this -> query($sql)) return -1; else @@ -902,7 +913,8 @@ class DoliDb * \brief Return charset used to store data in database * \return string Charset */ - function getDefaultCharacterSetDatabase(){ + function getDefaultCharacterSetDatabase() + { $resql=$this->query('SHOW VARIABLES LIKE \'character_set_database\''); if (!$resql) { @@ -913,7 +925,12 @@ class DoliDb return $liste['Value']; } - function getListOfCharacterSet(){ + /** + * \brief Return list of available charset that can be used to store data in database + * \return array List of Charset + */ + function getListOfCharacterSet() + { $resql=$this->query('SHOW CHARSET'); $liste = array(); if ($resql) @@ -937,7 +954,8 @@ class DoliDb * \brief Return collation used in database * \return string Collation value */ - function getDefaultCollationDatabase(){ + function getDefaultCollationDatabase() + { $resql=$this->query('SHOW VARIABLES LIKE \'collation_database\''); if (!$resql) { @@ -948,7 +966,12 @@ class DoliDb return $liste['Value']; } - function getListOfCollation(){ + /** + * \brief Return list of available collation that can be used for database + * \return array Liste of Collation + */ + function getListOfCollation() + { $resql=$this->query('SHOW COLLATION'); $liste = array(); if ($resql)