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)) . ' */';
* @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 . '`.';
// 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;
/**
* 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) {
$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;
}
$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);
}