* @version $Id$ * @access public * @license http://opensource.org/licenses/gpl-3.0.html * MySQL data manipulation */ class mysql { /* * @parameters */ var $DB_HOST = DB_HOST; var $DB_USER = DB_USER; var $DB_PASS = DB_PASS; var $DB_NAME = DB_NAME; var $DB_LINK = ""; var $DB_ADMINMAIL = DB_ADMINMAIL; var $RESULT; var $DEBUG; protected $dispatcher = null; public function __construct() { $this->dispatcher = $GLOBALS['dispatcher']; } /** * mysql::DBInitialise() * Initialisation de la connexion * * @access public * @param string $user : utilisateur base de données * @param string $pass : password utilisateur base de données * @param string $serveur : serveur de base de données * @param string $bdd : nom de la base de données * @return boolean */ function DBInitialise($user = '', $pass = '', $serveur = '', $bdd = '') { // Notify the end of the current method $this->dispatcher->notify(new sfEvent($this, 'dbconnector.init', array('user' => $user, 'password' => $pass, 'host' => $serveur, 'db' => $bdd))); if ($user != '') { $this->DB_USER = $user; } if ($pass != '') { $this->DB_PASS = $pass; } if ($serveur != '') { $this->DB_HOST = $serveur; } if ($bdd != '') { $this->DB_NAME = $bdd; } return true; } /** * mysql::DBConnexion() * connexion Base de données * * @access public * @return boolean */ function DBConnexion() { // Notify the end of the current method $this->dispatcher->notify(new sfEvent($this, 'dbconnector.connect')); $this->DB_LINK = @mysqli_connect($this->DB_HOST, $this->DB_USER, $this->DB_PASS, $this->DB_NAME) or die($this->DBError(_t('divers','sql_connect_failed'))); // $this->DBSelectDB(); // remove 'ONLY_FULL_GROUP_BY' $sub_query = "SELECT REPLACE(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY', '')"; $this->DBQuery("SET SESSION sql_mode=($sub_query);"); // $sql_mode = $this->DBSelect("SELECT @@SESSION.sql_mode"); // print_r( $sql_mode); if(strtolower(CHARSET) == 'utf-8') { // utf8mb4 not supported before 5.5.3 version if((int) mysqli_get_server_version($this->DB_LINK) < (int) 50503) $this->DBQuery("SET NAMES utf8"); else $this->DBQuery("SET NAMES utf8mb4"); } return true; } /** * mysql::DBSelectDB() * Sélection de la Base de données * * @access public * @return boolean */ function DBSelectDB() { // Notify the end of the current method $this->dispatcher->notify(new sfEvent($this, 'dbconnector.selectDB')); mysqli_select_db($this->DB_NAME, $this->DB_LINK) or die($this->DBError(_t('divers','db_connect_failed'))); return true; } /** * mysql::DBError() * Gestion des erreurs MySQL * * @access private * @param string $message_err : message retourné par la requête * @param string $query : requête provoquant l'erreur * @return boolean */ function DBError($message_err, $query = -1) { // Notify the end of the current method $this->dispatcher->notify(new sfEvent($this, 'dbconnector.error')); if(is_bool($this->DB_LINK )) $erreur = $message_err . "
[ error n° " . mysqli_connect_errno(). " : " . mysqli_connect_error() . " ]
\n\n"; else $erreur = $message_err . "
[ error n° " . mysqli_errno( $this->DB_LINK ) . " : " . mysqli_error( $this->DB_LINK ) . " ]
\n\n"; if ($query != -1) { $this->_logDbError($query); $erreur .= "SQL query : $query
\n"; } $date = date("[D d/M/y H:i:s]
\n"); $erreur .= $date . PHP_EOL; $erreur .= "running script :" . $_SERVER["SCRIPT_NAME"] . getHttpParameters(). "
" . PHP_EOL;; $erreur .= "website : " .SITE_ROOT_URL . PHP_EOL; if(defined('MOD_DEBUG') && MOD_DEBUG == true) { echo $erreur; } if ($this->DB_ADMINMAIL != -1) @error_log ($erreur, 1, $this->DB_ADMINMAIL); } /** * mysql::DBInsert() * Insertion de données dans la BDD * * @access public * @param string $query : requête SQL * @param string $returnid : Si $returnid==1 ==> renvoie last_id() * @return integer || boolean : $result last_id() */ function DBInsert ($query, $returnid = -1) { // Notify the end of the current method $this->dispatcher->notify(new sfEvent($this, 'dbconnector.insert', array('query' => $query, 'lastid' => $returnid))); if (!($this->RESULT = $this->DBQuery($query))) return false; // Si returnid=1 on renvoie l'id de l'enregistrement // A utiliser uniquement si attribut auto_increment if ($returnid == 1) { $res = mysqli_insert_id($this->DB_LINK); } else { $res = true; } return $res; } /** * mysql::DBQuery() * effectue une requête en tous genres -UPDATE - DELETE - SELECT * * @access public * @param string $query : requête SQL * @param boolean $ignore_errors * @return boolean : $result */ function DBQuery ($query, $ignore_errors = false) { global $debugbar; // Notify the end of the current method $this->dispatcher->notify(new sfEvent($this, 'dbconnector.query', array('query' => $query))); if(defined('MOD_DEBUG') && MOD_DEBUG == true && isset($debugbar)) { $this->_logDbQuery($query); $debugbar["messages"]->addMessage($query, 'SQL'); } if($ignore_errors) { $this->RESULT = mysqli_query($this->DB_LINK, $query); } else { $this->RESULT = mysqli_query($this->DB_LINK, $query) or die($this->DbError(_t('divers','sql_query_failed'), $query)); } return $this->RESULT; } /** * mysql::DBSelect() * Requêtes - SELECT * * @access public * @param string $query : requête SQL * @param string $fetch : renvoie des données, valeur ASSOC (default), ARRAY, OBJECT * @param boolean $ignore_errors * @return array : $result */ function DBSelect ($query, $fetch = 'ASSOC', $ignore_errors = false) { // Notify the end of the current method $this->dispatcher->notify(new sfEvent($this, 'dbconnector.select', array('query' => $query, 'type' => $fetch))); if (!($this->RESULT = $this->DBQuery($query, $ignore_errors))) { @mysqli_free_result($this->RESULT); return false; } if ($fetch == 'ARRAY') { $i = 0; while ($data = @mysqli_fetch_array($this->RESULT)) { $table[$i] = $data; $i++; } } if ($fetch == 'OBJECT') { $i = 0; while ($data = @mysqli_fetch_object($this->RESULT)) { $table[$i] = $data; $i++; } } if ($fetch == 'ASSOC') { $i = 0; while ($data = @mysqli_fetch_assoc($this->RESULT)) { $table[$i] = $data; $i++; } } if (!isset($table)) $table = 0; return $table; } /** * mysql::DBescape() * Echappement des variables * * @access public * @param string/array $input * @return string/array : $output */ function DBescape ($input) { // Filter data event + return value $r = $this->dispatcher->filter(new sfEvent($this, 'dbconnector.escape', array('data' => $input)), $input); $input = $r->getReturnValue(); if(is_array($input)) { $output = array(); foreach ($input as $key => $value) { if(is_string($value)) { if (version_compare(phpversion(), '7.4.0', '<')) { if (get_magic_quotes_gpc()) $value=stripslashes($value); } // get_magic_quotes_gpc() renvoie FALSE mais des quotes sont quand même ajoutées ! $value=stripslashes($value); // @simo - since Linea v2.2+ convertBase64Images returns HTML with slashes, we strip them ! $output[$key] = mysqli_real_escape_string($this->DB_LINK, $value); } else { $output[$key] = $value; } } } else { // it is a simple string if(is_string($input)) { if (version_compare(phpversion(), '7.4.0', '<')) { if (get_magic_quotes_gpc()) $input=stripslashes($input); } $value=stripslashes($input); // @simo - since Linea v2.2+ convertBase64Images returns HTML with slashes, we strip them ! $output = mysqli_real_escape_string($this->DB_LINK, $input); } else { $output = $input; } } return $output; } /** * mysql::DBaffectedRow() * Retourne le nombre d'enregistrements affecté par la dernière requête * * @access public * @return integer : $res */ function DBaffectedRow() { // Notify the end of the current method $this->dispatcher->notify(new sfEvent($this, 'dbconnector.affected_rows')); $res = mysqli_affected_rows($this->DB_LINK); return $res; } /** * _logDbQuery() * @access private * @param string $q * @return void */ function _logDbQuery($q) { // Filter data event + return value $r = $this->dispatcher->filter(new sfEvent($this, 'dbconnector.log_query', array('query' => $q)), $q); $q = $r->getReturnValue(); if(defined('SQL_LOG_DEBUG') && SQL_LOG_DEBUG == 1) { $q = str_replace(array("\r", "\n", "\t"),"",$q); logfile(LOG_SQL_QUERIES, array($q, get_class())); } } /** * _logDbError() * @access private * @param string $q * @return void */ function _logDbError($q) { // Filter data event + return value $r = $this->dispatcher->filter(new sfEvent($this, 'dbconnector.log_error', array('query' => $q)), $q); $q = $r->getReturnValue(); $q = str_replace(array("\r", "\n", "\t"),"",$q); logfile(LOG_SQL_ERRORS, array($q, $_SERVER["SCRIPT_NAME"], get_class())); } /** * mysql::DBclose() * Retourne le nombre d'enregistrements affecté par la dernière requête * * @access public * @param string $query : requête SQL * @return boolean : $result */ function DBClose() { // Notify the end of the current method $this->dispatcher->notify(new sfEvent($this, 'dbconnector.close')); @mysqli_close($this->DB_LINK); } /** * mysql::DB_getVersion() * Retourne le numéro de version sous forme d'entier * * @access public * @return int */ function DB_get_version() { return mysqli_get_server_version ($this->DB_LINK); } } ?>