[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / req / mysql.php
index 3532ea1..89d66fa 100644 (file)
@@ -3,7 +3,7 @@
 /* *************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2014                                                *
+ *  Copyright (c) 2001-2016                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
@@ -112,28 +112,29 @@ $GLOBALS['spip_mysql_functions_1'] = array(
 'utf-8'=>array('charset'=>'utf8','collation'=>'utf8_general_ci'))
                );
 
-// http://doc.spip.org/@spip_mysql_set_charset
+
 /**
- * @param $charset
- * @param string $serveur
- * @param bool $requeter
- * @param bool $requeter
- * @return resource
+ * Définit un charset pour la connexion avec Mysql
+ * 
+ * @param string $charset Charset à appliquer
+ * @param string $serveur Nom de la connexion
+ * @param bool $requeter  inutilisé
+ * @return resource       Ressource de résultats pour fetch()
  */
-function spip_mysql_set_charset($charset, $serveur='',$requeter=true,$requeter=true){
+function spip_mysql_set_charset($charset, $serveur='',$requeter=true){
        $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
        spip_log("changement de charset sql : "."SET NAMES "._q($charset), _LOG_DEBUG);
        return mysql_query($connexion['last'] = "SET NAMES "._q($charset));
 }
 
-// http://doc.spip.org/@spip_mysql_get_charset
-/**
 
- * @param array $charset
- * @param string $serveur
- * @param bool $requeter
- * @return array
- *
+/**
+ * Teste si le charset indiqué est disponible sur le serveur SQL
+ * 
+ * @param array|string $charset Nom du charset à tester.
+ * @param string $serveur       Nom de la connexion
+ * @param bool $requeter        inutilisé
+ * @return array                Description du charset (son nom est dans 'charset')
  */
 function spip_mysql_get_charset($charset=array(), $serveur='',$requeter=true){
        $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
@@ -182,12 +183,12 @@ function spip_mysql_query($query, $serveur='',$requeter=true) {
        // ajouter un debug utile dans log/mysql-slow.log ?
        $debug = '';
        if (defined('_DEBUG_SLOW_QUERIES') AND _DEBUG_SLOW_QUERIES){
-               if($GLOBALS['debug']['aucasou']){
+               if(isset($GLOBALS['debug']['aucasou'])){
                        list(,$id,, $infos) = $GLOBALS['debug']['aucasou'];
-                       $debug .= " BOUCLE$id @ ".$infos[0] ." | ";
+                       $debug .= "BOUCLE$id @ ".$infos[0] ." | ";
                }
-               $debug .= " " . $_SERVER['REQUEST_URI'].' + '.$GLOBALS['ip'];
-               $debug = ' /*'.str_replace('*/','@/',$debug).' */';
+               $debug .= $_SERVER['REQUEST_URI'].' + '.$GLOBALS['ip'];
+               $debug = ' /* '. mysql_real_escape_string(str_replace('*/','@/',$debug)). ' */';
        }
 
        $r = $link ? mysql_query($query.$debug, $link) : mysql_query($query.$debug);
@@ -486,9 +487,9 @@ function spip_mysql_create($nom, $champs, $cles, $autoinc=false, $temporary=fals
                return;
 
        $res = spip_mysql_query("SELECT version() as v");
-       if ($row = mysql_fetch_array($res)
-        && (version_compare($row['v'],'5.0','>=')))
-               spip_mysql_query("SET sql_mode=''");
+       if (($row = mysql_fetch_array($res)) && (version_compare($row['v'],'5.0','>='))) {
+               spip_mysql_query("SET sql_mode=''", $serveur);
+       }
 
        foreach($cles as $k => $v) {
                $keys .= "$s\n\t\t$k ($v)";
@@ -639,6 +640,7 @@ function spip_mysql_repair($table, $serveur='',$requeter=true)
        return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
 }
 
+define('_MYSQL_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
 // Recupere la definition d'une table ou d'une vue MySQL
 // colonnes, indexes, etc.
 // au meme format que la definition des tables de SPIP
@@ -656,11 +658,11 @@ function spip_mysql_showtable($nom_table, $serveur='',$requeter=true)
        if (!$requeter) return $s;
 
        list(,$a) = mysql_fetch_array($s ,MYSQL_NUM);
-       if (preg_match("/^[^(),]*\((([^()]*\([^()]*\)[^()]*)*)\)[^()]*$/", $a, $r)){
+       if (preg_match(_MYSQL_RE_SHOW_TABLE, $a, $r)){
                $desc = $r[1];
                // extraction d'une KEY éventuelle en prenant garde de ne pas
                // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
-               if (preg_match("/^(.*?),([^,]*KEY[ (].*)$/s", $desc, $r)) {
+               if (preg_match("/^(.*?),([^,]*\sKEY[ (].*)$/s", $desc, $r)) {
                  $namedkeys = $r[2];
                  $desc = $r[1];
                }
@@ -674,8 +676,8 @@ function spip_mysql_showtable($nom_table, $serveur='',$requeter=true)
                }
                $keys = array();
 
-               foreach(preg_split('/\)\s*,?/',$namedkeys) as $v) {
-                 if (preg_match("/^\s*([^(]*)\((.*)$/",$v,$r)) {
+               foreach(preg_split('/\)\s*(,|$)/',$namedkeys) as $v) {
+                 if (preg_match("/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/",$v,$r)) {
                        $k = str_replace("`", '', trim($r[1]));
                        $t = strtolower(str_replace("`", '', $r[2]));
                        if ($k && !isset($keys[$k])) $keys[$k] = $t; else $keys[] = $t;