[SPIP] v3.2.11 -> v3.2.12
[lhc/web/www.git] / www / ecrire / req / mysql.php
index 5cd2c0d..ae9cdb3 100644 (file)
@@ -243,7 +243,7 @@ function spip_mysql_query($query, $serveur = '', $requeter = true) {
        if (defined('_DEBUG_SLOW_QUERIES') and _DEBUG_SLOW_QUERIES) {
                if (isset($GLOBALS['debug']['aucasou'])) {
                        list(, $id, , $infos) = $GLOBALS['debug']['aucasou'];
-                       $debug .= "BOUCLE$id @ " . $infos[0] . " | ";
+                       $debug .= "BOUCLE$id @ " . (isset($infos[0]) ? $infos[0] : '') . " | ";
                }
                $debug .= $_SERVER['REQUEST_URI'] . ' + ' . $GLOBALS['ip'];
                $debug = ' /* ' . mysqli_real_escape_string($link, str_replace('*/', '@/', $debug)) . ' */';
@@ -524,9 +524,10 @@ define('_SQL_PREFIXE_TABLE_MYSQL', '/([,\s])spip_/S');
  * @param string $query Requête à préparer
  * @param string $db Nom de la base de donnée
  * @param string $prefixe Préfixe de tables à appliquer
+ * @param bool $echappe_textes Pour ne pas essayer de re-echapper une chaine deja echappee qu'on traite en recursif
  * @return string           Requête préparée
  */
-function _mysql_traite_query($query, $db = '', $prefixe = '') {
+function _mysql_traite_query($query, $db = '', $prefixe = '', $echappe_textes = true) {
 
        if ($GLOBALS['mysql_rappel_nom_base'] and $db) {
                $pref = '`' . $db . '`.';
@@ -546,12 +547,22 @@ function _mysql_traite_query($query, $db = '', $prefixe = '') {
                // propager le prefixe en cas de requete imbriquee
                // il faut alors echapper les chaine avant de le faire, pour ne pas risquer de
                // modifier une requete qui est en fait juste du texte dans un champ
-               if (stripos($suite, "SELECT") !== false) {
-                       list($suite, $textes) = query_echappe_textes($suite);
-                       if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite, $r)) {
-                               $suite = $r[1] . _mysql_traite_query($r[2], $db, $prefixe);
+               if (stripos($suite, 'SELECT') !== false) {
+                       if ($echappe_textes) {
+                               list($suite_echap, $textes) = query_echappe_textes($suite);
+                       }
+                       else {
+                               $suite_echap = $suite;
+                       }
+                       if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite_echap, $r)) {
+                               $suite_echap = $r[1] . _mysql_traite_query($r[2], $db, $prefixe, false);
+                               if ($echappe_textes) {
+                                       $suite = query_reinjecte_textes($suite_echap, $textes);
+                               }
+                               else {
+                                       $suite = $suite_echap;
+                               }
                        }
-                       $suite = query_reinjecte_textes($suite, $textes);
                }
        }
        $r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1' . $pref, $query) . $suite;
@@ -710,9 +721,9 @@ function spip_mysql_create(
 /**
  * Adapte pour Mysql la déclaration SQL d'une colonne d'une table
  *
- * @param string $query
- *     Définition SQL d'un champ de table
- * @return string
+ * @param string|array $query
+ *     Définition SQL d'un champ de table ou liste de déclarations
+ * @return string|array
  *     Définition SQL adaptée pour MySQL d'un champ de table
  */
 function _mysql_remplacements_definitions_table($query) {
@@ -722,9 +733,17 @@ function _mysql_remplacements_definitions_table($query) {
 
        $remplace = array(
                '/VARCHAR(\s*[^\s\(])/is' => 'VARCHAR(255)\\1',
+               '/^TIMESTAMP($| NULL DEFAULT NULL)/is' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
        );
 
-       $query = preg_replace(array_keys($remplace), $remplace, $query);
+       if (is_string($query)) {
+               $query = preg_replace(array_keys($remplace), $remplace, $query);
+       } elseif (is_array($query)) {
+               $keys = array_keys($remplace);
+               foreach ($query as $k => $q) {
+                       $query[$k] = preg_replace($keys, $remplace, $q);
+               }
+       }
 
        return $query;
 }
@@ -1681,7 +1700,8 @@ function spip_get_lock($nom, $timeout = 0) {
        $nom = "$bd:$prefixe:$nom" . _LOCK_TIME;
 
        $connexion['last'] = $q = "SELECT GET_LOCK(" . _q($nom) . ", $timeout) AS n";
-       $q = @sql_fetch(mysql_query($q));
+
+       $q = @sql_fetch(mysqli_query(_mysql_link(), $q));
        if (!$q) {
                spip_log("pas de lock sql pour $nom", _LOG_ERREUR);
        }