Completed
Push — master ( 4ba7bf...3ba68e )
by cam
01:14
created
ecrire/inc/editer.php 2 patches
Indentation   +442 added lines, -442 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 include_spip('base/abstract_sql');
23 23
 
@@ -59,56 +59,56 @@  discard block
 block discarded – undo
59 59
  *     Retour des traitements.
60 60
  **/
61 61
 function formulaires_editer_objet_traiter(
62
-	$type,
63
-	$id = 'new',
64
-	$id_parent = 0,
65
-	$lier_trad = 0,
66
-	$retour = '',
67
-	$config_fonc = 'articles_edit_config',
68
-	$row = [],
69
-	$hidden = ''
62
+    $type,
63
+    $id = 'new',
64
+    $id_parent = 0,
65
+    $lier_trad = 0,
66
+    $retour = '',
67
+    $config_fonc = 'articles_edit_config',
68
+    $row = [],
69
+    $hidden = ''
70 70
 ) {
71 71
 
72
-	$res = [];
73
-	// eviter la redirection forcee par l'action...
74
-	set_request('redirect');
75
-	if ($action_editer = charger_fonction("editer_$type", 'action', true)) {
76
-		[$id, $err] = $action_editer($id);
77
-	} else {
78
-		$action_editer = charger_fonction('editer_objet', 'action');
79
-		[$id, $err] = $action_editer($id, $type);
80
-	}
81
-	$id_table_objet = id_table_objet($type);
82
-	$res[$id_table_objet] = $id;
83
-	if ($err or !$id) {
84
-		$res['message_erreur'] = ($err ?: _T('erreur'));
85
-	} else {
86
-		// Un lien de trad a prendre en compte
87
-		if ($lier_trad) {
88
-			// referencer la traduction
89
-			$referencer_traduction = charger_fonction('referencer_traduction', 'action');
90
-			$referencer_traduction($type, $id, $lier_trad);
91
-			// actions de recopie de champs / liens sur le nouvel objet créé
92
-			$completer_traduction = charger_fonction('completer_traduction', 'inc');
93
-			$err = $completer_traduction($type, $id, $lier_trad);
94
-			if ($err) {
95
-				$res['message_erreur'] = $err;
96
-				return $res;
97
-			}
98
-		}
99
-
100
-		$res['message_ok'] = _T('info_modification_enregistree');
101
-		if ($retour) {
102
-			if (strncmp($retour, 'javascript:', 11) == 0) {
103
-				$res['message_ok'] .= '<script type="text/javascript">/*<![CDATA[*/' . substr($retour, 11) . '/*]]>*/</script>';
104
-				$res['editable'] = true;
105
-			} else {
106
-				$res['redirect'] = parametre_url($retour, $id_table_objet, $id);
107
-			}
108
-		}
109
-	}
110
-
111
-	return $res;
72
+    $res = [];
73
+    // eviter la redirection forcee par l'action...
74
+    set_request('redirect');
75
+    if ($action_editer = charger_fonction("editer_$type", 'action', true)) {
76
+        [$id, $err] = $action_editer($id);
77
+    } else {
78
+        $action_editer = charger_fonction('editer_objet', 'action');
79
+        [$id, $err] = $action_editer($id, $type);
80
+    }
81
+    $id_table_objet = id_table_objet($type);
82
+    $res[$id_table_objet] = $id;
83
+    if ($err or !$id) {
84
+        $res['message_erreur'] = ($err ?: _T('erreur'));
85
+    } else {
86
+        // Un lien de trad a prendre en compte
87
+        if ($lier_trad) {
88
+            // referencer la traduction
89
+            $referencer_traduction = charger_fonction('referencer_traduction', 'action');
90
+            $referencer_traduction($type, $id, $lier_trad);
91
+            // actions de recopie de champs / liens sur le nouvel objet créé
92
+            $completer_traduction = charger_fonction('completer_traduction', 'inc');
93
+            $err = $completer_traduction($type, $id, $lier_trad);
94
+            if ($err) {
95
+                $res['message_erreur'] = $err;
96
+                return $res;
97
+            }
98
+        }
99
+
100
+        $res['message_ok'] = _T('info_modification_enregistree');
101
+        if ($retour) {
102
+            if (strncmp($retour, 'javascript:', 11) == 0) {
103
+                $res['message_ok'] .= '<script type="text/javascript">/*<![CDATA[*/' . substr($retour, 11) . '/*]]>*/</script>';
104
+                $res['editable'] = true;
105
+            } else {
106
+                $res['redirect'] = parametre_url($retour, $id_table_objet, $id);
107
+            }
108
+        }
109
+    }
110
+
111
+    return $res;
112 112
 }
113 113
 
114 114
 /**
@@ -132,29 +132,29 @@  discard block
 block discarded – undo
132 132
  *     Tableau des erreurs
133 133
  **/
134 134
 function formulaires_editer_objet_verifier($type, $id = 'new', $oblis = []) {
135
-	$erreurs = [];
136
-	if (intval($id)) {
137
-		$conflits = controler_contenu($type, $id);
138
-		if ($conflits and is_countable($conflits) ? count($conflits) : 0) {
139
-			foreach ($conflits as $champ => $conflit) {
140
-				if (!isset($erreurs[$champ])) {
141
-					$erreurs[$champ] = '';
142
-				}
143
-				$erreurs[$champ] .= _T('alerte_modif_info_concourante') . "<br /><textarea readonly='readonly' class='forml'>" . entites_html($conflit['base']) . '</textarea>';
144
-			}
145
-		}
146
-	}
147
-	foreach ($oblis as $obli) {
148
-		$value = _request($obli);
149
-		if (is_null($value) or !(is_array($value) ? count($value) : strlen($value))) {
150
-			if (!isset($erreurs[$obli])) {
151
-				$erreurs[$obli] = '';
152
-			}
153
-			$erreurs[$obli] .= _T('info_obligatoire');
154
-		}
155
-	}
156
-
157
-	return $erreurs;
135
+    $erreurs = [];
136
+    if (intval($id)) {
137
+        $conflits = controler_contenu($type, $id);
138
+        if ($conflits and is_countable($conflits) ? count($conflits) : 0) {
139
+            foreach ($conflits as $champ => $conflit) {
140
+                if (!isset($erreurs[$champ])) {
141
+                    $erreurs[$champ] = '';
142
+                }
143
+                $erreurs[$champ] .= _T('alerte_modif_info_concourante') . "<br /><textarea readonly='readonly' class='forml'>" . entites_html($conflit['base']) . '</textarea>';
144
+            }
145
+        }
146
+    }
147
+    foreach ($oblis as $obli) {
148
+        $value = _request($obli);
149
+        if (is_null($value) or !(is_array($value) ? count($value) : strlen($value))) {
150
+            if (!isset($erreurs[$obli])) {
151
+                $erreurs[$obli] = '';
152
+            }
153
+            $erreurs[$obli] .= _T('info_obligatoire');
154
+        }
155
+    }
156
+
157
+    return $erreurs;
158 158
 }
159 159
 
160 160
 /**
@@ -199,154 +199,154 @@  discard block
 block discarded – undo
199 199
  *     Environnement du formulaire.
200 200
  **/
201 201
 function formulaires_editer_objet_charger(
202
-	$type,
203
-	$id = 'new',
204
-	$id_parent = 0,
205
-	$lier_trad = 0,
206
-	$retour = '',
207
-	$config_fonc = 'articles_edit_config',
208
-	$row = [],
209
-	$hidden = ''
202
+    $type,
203
+    $id = 'new',
204
+    $id_parent = 0,
205
+    $lier_trad = 0,
206
+    $retour = '',
207
+    $config_fonc = 'articles_edit_config',
208
+    $row = [],
209
+    $hidden = ''
210 210
 ) {
211 211
 
212
-	$table_objet = table_objet($type);
213
-	$table_objet_sql = table_objet_sql($type);
214
-	$id_table_objet = id_table_objet($type);
215
-	if (!is_array($row)) {
216
-		$row = [];
217
-	}
218
-
219
-	// on accepte pas une fonction de config inconnue si elle vient d'un modele
220
-	if (
221
-		$config_fonc
222
-		and !in_array($config_fonc, ['articles_edit_config', 'rubriques_edit_config', 'auteurs_edit_config'])
223
-		and $config_fonc !== $table_objet . '_edit_config'
224
-	) {
225
-		if (
226
-			$args = test_formulaire_inclus_par_modele()
227
-			and in_array($config_fonc, $args)
228
-		) {
229
-			$config_fonc = '';
230
-		}
231
-	}
232
-
233
-	$new = !is_numeric($id);
234
-	$lang_default = '';
235
-	// Appel direct dans un squelette
236
-	if (!$row) {
237
-		if (!$new or $lier_trad) {
238
-			if ($select = charger_fonction('precharger_' . $type, 'inc', true)) {
239
-				$row = $select($id, $id_parent, $lier_trad);
240
-				// si on a une fonction precharger, elle pu faire un reglage de langue
241
-				$lang_default = (!empty($row['lang']) ? $row['lang'] : null);
242
-			} else {
243
-				$row = sql_fetsel('*', $table_objet_sql, $id_table_objet . '=' . intval($id));
244
-			}
245
-			if (!$new) {
246
-				$md5 = controles_md5($row ?: []);
247
-			}
248
-		}
249
-		if (!$row) {
250
-			$row = [];
251
-			$trouver_table = charger_fonction('trouver_table', 'base');
252
-			if ($desc = $trouver_table($table_objet)) {
253
-				foreach ($desc['field'] as $k => $v) {
254
-					$row[$k] = '';
255
-				}
256
-			}
257
-		}
258
-	}
259
-
260
-	// Gaffe: sans ceci, on ecrase systematiquement l'article d'origine
261
-	// (et donc: pas de lien de traduction)
262
-	$id = ($new or $lier_trad)
263
-		? 'oui'
264
-		: $row[$id_table_objet];
265
-	$row[$id_table_objet] = $id;
266
-
267
-	$contexte = $row;
268
-	if (is_numeric($id_parent) && strlen($id_parent) && (!isset($contexte['id_parent']) or $new)) {
269
-		if (!isset($contexte['id_parent'])) {
270
-			unset($contexte['id_rubrique']);
271
-		}
272
-		$contexte['id_parent'] = $id_parent;
273
-	} elseif (!isset($contexte['id_parent'])) {
274
-		// id_rubrique dans id_parent si possible
275
-		if (isset($contexte['id_rubrique'])) {
276
-			$contexte['id_parent'] = $contexte['id_rubrique'];
277
-			unset($contexte['id_rubrique']);
278
-		} else {
279
-			$contexte['id_parent'] = '';
280
-		}
281
-		if (
282
-			!$contexte['id_parent']
283
-			and $preselectionner_parent_nouvel_objet = charger_fonction('preselectionner_parent_nouvel_objet', 'inc', true)
284
-		) {
285
-			$contexte['id_parent'] = $preselectionner_parent_nouvel_objet($type, $row);
286
-		}
287
-	}
288
-
289
-	$config = [];
290
-	if ($config_fonc) {
291
-		$contexte['config'] = $config = $config_fonc($contexte);
292
-		if (!$lang_default) {
293
-			$lang_default = $config['langue'] ?? session_get('lang') ;
294
-		}
295
-	}
296
-	$config = $config + [
297
-		'lignes' => 0,
298
-		'langue' => '',
299
-	];
300
-
301
-	$att_text = " class='textarea' "
302
-		. " rows='"
303
-		. ($config['lignes'] + 15)
304
-		. "' cols='40'";
305
-	if (isset($contexte['texte'])) {
306
-		[$contexte['texte'], $contexte['_texte_trop_long']] = editer_texte_recolle($contexte['texte'], $att_text);
307
-	}
308
-
309
-	// on veut conserver la langue de l'interface ;
310
-	// on passe cette donnee sous un autre nom, au cas ou le squelette
311
-	// voudrait l'exploiter
312
-	if (isset($contexte['lang'])) {
313
-		$contexte['langue'] = $contexte['lang'];
314
-		unset($contexte['lang']);
315
-	}
316
-
317
-	$contexte['_hidden'] = "<input type='hidden' name='editer_$type' value='oui' />\n" .
318
-		(!$lier_trad ? '' :
319
-			("\n<input type='hidden' name='lier_trad' value='" .
320
-				$lier_trad .
321
-				"' />" .
322
-				"\n<input type='hidden' name='changer_lang' value='" .
323
-				$lang_default .
324
-				"' />"))
325
-		. $hidden
326
-		. ($md5 ?? '');
327
-
328
-	// preciser que le formulaire doit passer dans un pipeline
329
-	$contexte['_pipeline'] = ['editer_contenu_objet', ['type' => $type, 'id' => $id]];
330
-
331
-	// preciser que le formulaire doit etre securise auteur/action
332
-	// n'est plus utile lorsque l'action accepte l'id en argument direct
333
-	// on le garde pour compat
334
-	$contexte['_action'] = ["editer_$type", $id];
335
-
336
-	// et in fine placer l'autorisation
337
-	include_spip('inc/autoriser');
338
-	if (intval($id)) {
339
-		if (!autoriser('modifier', $type, intval($id))) {
340
-			$contexte['editable'] = '';
341
-		}
342
-	}
343
-	else {
344
-		if (!autoriser('creer', $type, 0, null, ['id_parent' => $id_parent])) {
345
-			$contexte['editable'] = '';
346
-		}
347
-	}
348
-
349
-	return $contexte;
212
+    $table_objet = table_objet($type);
213
+    $table_objet_sql = table_objet_sql($type);
214
+    $id_table_objet = id_table_objet($type);
215
+    if (!is_array($row)) {
216
+        $row = [];
217
+    }
218
+
219
+    // on accepte pas une fonction de config inconnue si elle vient d'un modele
220
+    if (
221
+        $config_fonc
222
+        and !in_array($config_fonc, ['articles_edit_config', 'rubriques_edit_config', 'auteurs_edit_config'])
223
+        and $config_fonc !== $table_objet . '_edit_config'
224
+    ) {
225
+        if (
226
+            $args = test_formulaire_inclus_par_modele()
227
+            and in_array($config_fonc, $args)
228
+        ) {
229
+            $config_fonc = '';
230
+        }
231
+    }
232
+
233
+    $new = !is_numeric($id);
234
+    $lang_default = '';
235
+    // Appel direct dans un squelette
236
+    if (!$row) {
237
+        if (!$new or $lier_trad) {
238
+            if ($select = charger_fonction('precharger_' . $type, 'inc', true)) {
239
+                $row = $select($id, $id_parent, $lier_trad);
240
+                // si on a une fonction precharger, elle pu faire un reglage de langue
241
+                $lang_default = (!empty($row['lang']) ? $row['lang'] : null);
242
+            } else {
243
+                $row = sql_fetsel('*', $table_objet_sql, $id_table_objet . '=' . intval($id));
244
+            }
245
+            if (!$new) {
246
+                $md5 = controles_md5($row ?: []);
247
+            }
248
+        }
249
+        if (!$row) {
250
+            $row = [];
251
+            $trouver_table = charger_fonction('trouver_table', 'base');
252
+            if ($desc = $trouver_table($table_objet)) {
253
+                foreach ($desc['field'] as $k => $v) {
254
+                    $row[$k] = '';
255
+                }
256
+            }
257
+        }
258
+    }
259
+
260
+    // Gaffe: sans ceci, on ecrase systematiquement l'article d'origine
261
+    // (et donc: pas de lien de traduction)
262
+    $id = ($new or $lier_trad)
263
+        ? 'oui'
264
+        : $row[$id_table_objet];
265
+    $row[$id_table_objet] = $id;
266
+
267
+    $contexte = $row;
268
+    if (is_numeric($id_parent) && strlen($id_parent) && (!isset($contexte['id_parent']) or $new)) {
269
+        if (!isset($contexte['id_parent'])) {
270
+            unset($contexte['id_rubrique']);
271
+        }
272
+        $contexte['id_parent'] = $id_parent;
273
+    } elseif (!isset($contexte['id_parent'])) {
274
+        // id_rubrique dans id_parent si possible
275
+        if (isset($contexte['id_rubrique'])) {
276
+            $contexte['id_parent'] = $contexte['id_rubrique'];
277
+            unset($contexte['id_rubrique']);
278
+        } else {
279
+            $contexte['id_parent'] = '';
280
+        }
281
+        if (
282
+            !$contexte['id_parent']
283
+            and $preselectionner_parent_nouvel_objet = charger_fonction('preselectionner_parent_nouvel_objet', 'inc', true)
284
+        ) {
285
+            $contexte['id_parent'] = $preselectionner_parent_nouvel_objet($type, $row);
286
+        }
287
+    }
288
+
289
+    $config = [];
290
+    if ($config_fonc) {
291
+        $contexte['config'] = $config = $config_fonc($contexte);
292
+        if (!$lang_default) {
293
+            $lang_default = $config['langue'] ?? session_get('lang') ;
294
+        }
295
+    }
296
+    $config = $config + [
297
+        'lignes' => 0,
298
+        'langue' => '',
299
+    ];
300
+
301
+    $att_text = " class='textarea' "
302
+        . " rows='"
303
+        . ($config['lignes'] + 15)
304
+        . "' cols='40'";
305
+    if (isset($contexte['texte'])) {
306
+        [$contexte['texte'], $contexte['_texte_trop_long']] = editer_texte_recolle($contexte['texte'], $att_text);
307
+    }
308
+
309
+    // on veut conserver la langue de l'interface ;
310
+    // on passe cette donnee sous un autre nom, au cas ou le squelette
311
+    // voudrait l'exploiter
312
+    if (isset($contexte['lang'])) {
313
+        $contexte['langue'] = $contexte['lang'];
314
+        unset($contexte['lang']);
315
+    }
316
+
317
+    $contexte['_hidden'] = "<input type='hidden' name='editer_$type' value='oui' />\n" .
318
+        (!$lier_trad ? '' :
319
+            ("\n<input type='hidden' name='lier_trad' value='" .
320
+                $lier_trad .
321
+                "' />" .
322
+                "\n<input type='hidden' name='changer_lang' value='" .
323
+                $lang_default .
324
+                "' />"))
325
+        . $hidden
326
+        . ($md5 ?? '');
327
+
328
+    // preciser que le formulaire doit passer dans un pipeline
329
+    $contexte['_pipeline'] = ['editer_contenu_objet', ['type' => $type, 'id' => $id]];
330
+
331
+    // preciser que le formulaire doit etre securise auteur/action
332
+    // n'est plus utile lorsque l'action accepte l'id en argument direct
333
+    // on le garde pour compat
334
+    $contexte['_action'] = ["editer_$type", $id];
335
+
336
+    // et in fine placer l'autorisation
337
+    include_spip('inc/autoriser');
338
+    if (intval($id)) {
339
+        if (!autoriser('modifier', $type, intval($id))) {
340
+            $contexte['editable'] = '';
341
+        }
342
+    }
343
+    else {
344
+        if (!autoriser('creer', $type, 0, null, ['id_parent' => $id_parent])) {
345
+            $contexte['editable'] = '';
346
+        }
347
+    }
348
+
349
+    return $contexte;
350 350
 }
351 351
 
352 352
 /**
@@ -357,29 +357,29 @@  discard block
 block discarded – undo
357 357
  * @return array
358 358
  */
359 359
 function coupe_trop_long($texte) {
360
-	$aider = charger_fonction('aider', 'inc');
361
-	if (strlen($texte) > 28 * 1024) {
362
-		$texte = str_replace("\r\n", "\n", $texte);
363
-		$pos = strpos($texte, "\n\n", 28 * 1024);  // coupe para > 28 ko
364
-		if ($pos > 0 and $pos < 32 * 1024) {
365
-			$debut = substr($texte, 0, $pos) . "\n\n<!--SPIP-->\n";
366
-			$suite = substr($texte, $pos + 2);
367
-		} else {
368
-			$pos = strpos($texte, ' ', 28 * 1024);  // sinon coupe espace
369
-			if (!($pos > 0 and $pos < 32 * 1024)) {
370
-				$pos = 28 * 1024;  // au pire (pas d'espace trouv'e)
371
-				$decalage = 0; // si y'a pas d'espace, il ne faut pas perdre le caract`ere
372
-			} else {
373
-				$decalage = 1;
374
-			}
375
-			$debut = substr($texte, 0, $pos + $decalage); // Il faut conserver l'espace s'il y en a un
376
-			$suite = substr($texte, $pos + $decalage);
377
-		}
378
-
379
-		return ([$debut, $suite]);
380
-	} else {
381
-		return ([$texte, '']);
382
-	}
360
+    $aider = charger_fonction('aider', 'inc');
361
+    if (strlen($texte) > 28 * 1024) {
362
+        $texte = str_replace("\r\n", "\n", $texte);
363
+        $pos = strpos($texte, "\n\n", 28 * 1024);  // coupe para > 28 ko
364
+        if ($pos > 0 and $pos < 32 * 1024) {
365
+            $debut = substr($texte, 0, $pos) . "\n\n<!--SPIP-->\n";
366
+            $suite = substr($texte, $pos + 2);
367
+        } else {
368
+            $pos = strpos($texte, ' ', 28 * 1024);  // sinon coupe espace
369
+            if (!($pos > 0 and $pos < 32 * 1024)) {
370
+                $pos = 28 * 1024;  // au pire (pas d'espace trouv'e)
371
+                $decalage = 0; // si y'a pas d'espace, il ne faut pas perdre le caract`ere
372
+            } else {
373
+                $decalage = 1;
374
+            }
375
+            $debut = substr($texte, 0, $pos + $decalage); // Il faut conserver l'espace s'il y en a un
376
+            $suite = substr($texte, $pos + $decalage);
377
+        }
378
+
379
+        return ([$debut, $suite]);
380
+    } else {
381
+        return ([$texte, '']);
382
+    }
383 383
 }
384 384
 
385 385
 /**
@@ -390,25 +390,25 @@  discard block
 block discarded – undo
390 390
  * @return array
391 391
  */
392 392
 function editer_texte_recolle($texte, $att_text) {
393
-	if (
394
-		(strlen($texte) < 29 * 1024)
395
-		or (include_spip('inc/layer') and ($GLOBALS['browser_name'] != 'MSIE'))
396
-	) {
397
-		return [$texte, ''];
398
-	}
399
-
400
-	include_spip('inc/barre');
401
-	$textes_supplement = "<br /><span style='color: red'>" . _T('info_texte_long') . "</span>\n";
402
-	$nombre = 0;
403
-
404
-	while (strlen($texte) > 29 * 1024) {
405
-		$nombre++;
406
-		[$texte1, $texte] = coupe_trop_long($texte);
407
-		$textes_supplement .= '<br />' .
408
-			"<textarea id='texte$nombre' name='texte_plus[$nombre]'$att_text>$texte1</textarea>\n";
409
-	}
410
-
411
-	return [$texte, $textes_supplement];
393
+    if (
394
+        (strlen($texte) < 29 * 1024)
395
+        or (include_spip('inc/layer') and ($GLOBALS['browser_name'] != 'MSIE'))
396
+    ) {
397
+        return [$texte, ''];
398
+    }
399
+
400
+    include_spip('inc/barre');
401
+    $textes_supplement = "<br /><span style='color: red'>" . _T('info_texte_long') . "</span>\n";
402
+    $nombre = 0;
403
+
404
+    while (strlen($texte) > 29 * 1024) {
405
+        $nombre++;
406
+        [$texte1, $texte] = coupe_trop_long($texte);
407
+        $textes_supplement .= '<br />' .
408
+            "<textarea id='texte$nombre' name='texte_plus[$nombre]'$att_text>$texte1</textarea>\n";
409
+    }
410
+
411
+    return [$texte, $textes_supplement];
412 412
 }
413 413
 
414 414
 /**
@@ -419,17 +419,17 @@  discard block
 block discarded – undo
419 419
  * @param int $longueur
420 420
  */
421 421
 function titre_automatique($champ_titre, $champs_contenu, $longueur = null) {
422
-	if (!_request($champ_titre)) {
423
-		$titrer_contenu = charger_fonction('titrer_contenu', 'inc');
424
-		if (!is_null($longueur)) {
425
-			$t = $titrer_contenu($champs_contenu, null, $longueur);
426
-		} else {
427
-			$t = $titrer_contenu($champs_contenu);
428
-		}
429
-		if ($t) {
430
-			set_request($champ_titre, $t);
431
-		}
432
-	}
422
+    if (!_request($champ_titre)) {
423
+        $titrer_contenu = charger_fonction('titrer_contenu', 'inc');
424
+        if (!is_null($longueur)) {
425
+            $t = $titrer_contenu($champs_contenu, null, $longueur);
426
+        } else {
427
+            $t = $titrer_contenu($champs_contenu);
428
+        }
429
+        if ($t) {
430
+            set_request($champ_titre, $t);
431
+        }
432
+    }
433 433
 }
434 434
 
435 435
 /**
@@ -449,20 +449,20 @@  discard block
 block discarded – undo
449 449
  * @return string
450 450
  */
451 451
 function inc_titrer_contenu_dist($champs_contenu, $c = null, $longueur = 50) {
452
-	// trouver un champ texte non vide
453
-	$t = '';
454
-	foreach ($champs_contenu as $champ) {
455
-		if ($t = _request($champ, $c)) {
456
-			break;
457
-		}
458
-	}
459
-
460
-	if ($t) {
461
-		include_spip('inc/texte_mini');
462
-		$t = couper($t, $longueur, '...');
463
-	}
464
-
465
-	return $t;
452
+    // trouver un champ texte non vide
453
+    $t = '';
454
+    foreach ($champs_contenu as $champ) {
455
+        if ($t = _request($champ, $c)) {
456
+            break;
457
+        }
458
+    }
459
+
460
+    if ($t) {
461
+        include_spip('inc/texte_mini');
462
+        $t = couper($t, $longueur, '...');
463
+    }
464
+
465
+    return $t;
466 466
 }
467 467
 
468 468
 /**
@@ -484,26 +484,26 @@  discard block
 block discarded – undo
484 484
  *      - array sinon couples ('$prefixe$colonne => md5)
485 485
  **/
486 486
 function controles_md5(array $data, string $prefixe = 'ctr_', string $format = 'html') {
487
-	$ctr = [];
488
-	foreach ($data as $key => $val) {
489
-		$m = md5($val ?? '');
490
-		$k = $prefixe . $key;
491
-
492
-		switch ($format) {
493
-			case 'html':
494
-				$ctr[$k] = "<input type='hidden' value='$m' name='$k' />";
495
-				break;
496
-			default:
497
-				$ctr[$k] = $m;
498
-				break;
499
-		}
500
-	}
501
-
502
-	if ($format === 'html') {
503
-		return "\n\n<!-- controles md5 -->\n" . join("\n", $ctr) . "\n\n";
504
-	} else {
505
-		return $ctr;
506
-	}
487
+    $ctr = [];
488
+    foreach ($data as $key => $val) {
489
+        $m = md5($val ?? '');
490
+        $k = $prefixe . $key;
491
+
492
+        switch ($format) {
493
+            case 'html':
494
+                $ctr[$k] = "<input type='hidden' value='$m' name='$k' />";
495
+                break;
496
+            default:
497
+                $ctr[$k] = $m;
498
+                break;
499
+        }
500
+    }
501
+
502
+    if ($format === 'html') {
503
+        return "\n\n<!-- controles md5 -->\n" . join("\n", $ctr) . "\n\n";
504
+    } else {
505
+        return $ctr;
506
+    }
507 507
 }
508 508
 
509 509
 /**
@@ -542,80 +542,80 @@  discard block
 block discarded – undo
542 542
  *     - post : le contenu posté
543 543
  **/
544 544
 function controler_contenu($type, $id, $options = [], $c = false, $serveur = '') {
545
-	include_spip('inc/filtres');
546
-
547
-	$table_objet = table_objet($type);
548
-	$spip_table_objet = table_objet_sql($type);
549
-	$trouver_table = charger_fonction('trouver_table', 'base');
550
-	$desc = $trouver_table($table_objet, $serveur);
551
-
552
-	// Appels incomplets (sans $c)
553
-	if (!is_array($c)) {
554
-		$c = [];
555
-		foreach ($desc['field'] as $champ => $ignore) {
556
-			if (_request($champ)) {
557
-				$c[$champ] = _request($champ);
558
-			}
559
-		}
560
-	}
561
-
562
-	// Securite : certaines variables ne sont jamais acceptees ici
563
-	// car elles ne relevent pas de autoriser(article, modifier) ;
564
-	// il faut passer par instituer_XX()
565
-	// TODO: faut-il passer ces variables interdites
566
-	// dans un fichier de description separe ?
567
-	unset($c['statut']);
568
-	unset($c['id_parent']);
569
-	unset($c['id_rubrique']);
570
-	unset($c['id_secteur']);
571
-
572
-	// Gerer les champs non vides
573
-	if (isset($options['nonvide']) and is_array($options['nonvide'])) {
574
-		foreach ($options['nonvide'] as $champ => $sinon) {
575
-			if ($c[$champ] === '') {
576
-				$c[$champ] = $sinon;
577
-			}
578
-		}
579
-	}
580
-
581
-	// N'accepter que les champs qui existent
582
-	// [TODO] ici aussi on peut valider les contenus en fonction du type
583
-	$champs = [];
584
-	foreach ($desc['field'] as $champ => $ignore) {
585
-		if (isset($c[$champ])) {
586
-			$champs[$champ] = $c[$champ];
587
-		}
588
-	}
589
-
590
-	// Nettoyer les valeurs
591
-	$champs = array_map('corriger_caracteres', $champs);
592
-
593
-	// Envoyer aux plugins
594
-	$champs = pipeline(
595
-		'pre_edition',
596
-		[
597
-			'args' => [
598
-				'table' => $spip_table_objet, // compatibilite
599
-				'table_objet' => $table_objet,
600
-				'spip_table_objet' => $spip_table_objet,
601
-				'type' => $type,
602
-				'id_objet' => $id,
603
-				'champs' => $options['champs'] ?? [], // [doc] c'est quoi ?
604
-				'action' => 'controler',
605
-				'serveur' => $serveur,
606
-			],
607
-			'data' => $champs
608
-		]
609
-	);
610
-
611
-	if (!$champs) {
612
-		return false;
613
-	}
614
-
615
-	// Verifier si les mises a jour sont pertinentes, datees, en conflit etc
616
-	$conflits = controler_md5($champs, $_POST, $type, $id, $serveur, $options['prefix'] ?? 'ctr_');
617
-
618
-	return $conflits;
545
+    include_spip('inc/filtres');
546
+
547
+    $table_objet = table_objet($type);
548
+    $spip_table_objet = table_objet_sql($type);
549
+    $trouver_table = charger_fonction('trouver_table', 'base');
550
+    $desc = $trouver_table($table_objet, $serveur);
551
+
552
+    // Appels incomplets (sans $c)
553
+    if (!is_array($c)) {
554
+        $c = [];
555
+        foreach ($desc['field'] as $champ => $ignore) {
556
+            if (_request($champ)) {
557
+                $c[$champ] = _request($champ);
558
+            }
559
+        }
560
+    }
561
+
562
+    // Securite : certaines variables ne sont jamais acceptees ici
563
+    // car elles ne relevent pas de autoriser(article, modifier) ;
564
+    // il faut passer par instituer_XX()
565
+    // TODO: faut-il passer ces variables interdites
566
+    // dans un fichier de description separe ?
567
+    unset($c['statut']);
568
+    unset($c['id_parent']);
569
+    unset($c['id_rubrique']);
570
+    unset($c['id_secteur']);
571
+
572
+    // Gerer les champs non vides
573
+    if (isset($options['nonvide']) and is_array($options['nonvide'])) {
574
+        foreach ($options['nonvide'] as $champ => $sinon) {
575
+            if ($c[$champ] === '') {
576
+                $c[$champ] = $sinon;
577
+            }
578
+        }
579
+    }
580
+
581
+    // N'accepter que les champs qui existent
582
+    // [TODO] ici aussi on peut valider les contenus en fonction du type
583
+    $champs = [];
584
+    foreach ($desc['field'] as $champ => $ignore) {
585
+        if (isset($c[$champ])) {
586
+            $champs[$champ] = $c[$champ];
587
+        }
588
+    }
589
+
590
+    // Nettoyer les valeurs
591
+    $champs = array_map('corriger_caracteres', $champs);
592
+
593
+    // Envoyer aux plugins
594
+    $champs = pipeline(
595
+        'pre_edition',
596
+        [
597
+            'args' => [
598
+                'table' => $spip_table_objet, // compatibilite
599
+                'table_objet' => $table_objet,
600
+                'spip_table_objet' => $spip_table_objet,
601
+                'type' => $type,
602
+                'id_objet' => $id,
603
+                'champs' => $options['champs'] ?? [], // [doc] c'est quoi ?
604
+                'action' => 'controler',
605
+                'serveur' => $serveur,
606
+            ],
607
+            'data' => $champs
608
+        ]
609
+    );
610
+
611
+    if (!$champs) {
612
+        return false;
613
+    }
614
+
615
+    // Verifier si les mises a jour sont pertinentes, datees, en conflit etc
616
+    $conflits = controler_md5($champs, $_POST, $type, $id, $serveur, $options['prefix'] ?? 'ctr_');
617
+
618
+    return $conflits;
619 619
 }
620 620
 
621 621
 
@@ -645,64 +645,64 @@  discard block
 block discarded – undo
645 645
  *     - post : le contenu posté
646 646
  **/
647 647
 function controler_md5(&$champs, $ctr, $type, $id, $serveur, $prefix = 'ctr_') {
648
-	$spip_table_objet = table_objet_sql($type);
649
-	$id_table_objet = id_table_objet($type);
650
-
651
-	// Controle des MD5 envoyes
652
-	// On elimine les donnees non modifiees par le formulaire (mais
653
-	// potentiellement modifiees entre temps par un autre utilisateur)
654
-	foreach ($champs as $key => $val) {
655
-		if (isset($ctr[$prefix . $key]) and $m = $ctr[$prefix . $key]) {
656
-			if (is_scalar($val) and $m == md5($val)) {
657
-				unset($champs[$key]);
658
-			}
659
-		}
660
-	}
661
-	if (!$champs) {
662
-		return;
663
-	}
664
-
665
-	// On veut savoir si notre modif va avoir un impact
666
-	// par rapport aux donnees contenues dans la base
667
-	// (qui peuvent etre differentes de celles ayant servi a calculer le ctr)
668
-	$s = sql_fetsel(array_keys($champs), $spip_table_objet, "$id_table_objet=$id", $serveur);
669
-	$intact = true;
670
-	foreach ($champs as $ch => $val) {
671
-		$intact &= ($s[$ch] == $val);
672
-	}
673
-	if ($intact) {
674
-		return;
675
-	}
676
-
677
-	// Detection de conflits :
678
-	// On verifie si notre modif ne provient pas d'un formulaire
679
-	// genere a partir de donnees modifiees dans l'intervalle ; ici
680
-	// on compare a ce qui est dans la base, et on bloque en cas
681
-	// de conflit.
682
-	$ctrh = $ctrq = $conflits = [];
683
-	foreach (array_keys($champs) as $key) {
684
-		if (isset($ctr[$prefix . $key]) and $m = $ctr[$prefix . $key]) {
685
-			$ctrh[$key] = $m;
686
-			$ctrq[] = $key;
687
-		}
688
-	}
689
-	if ($ctrq) {
690
-		$ctrq = sql_fetsel($ctrq, $spip_table_objet, "$id_table_objet=$id", $serveur);
691
-		foreach ($ctrh as $key => $m) {
692
-			if (
693
-				$m != md5($ctrq[$key])
694
-				and $champs[$key] !== $ctrq[$key]
695
-			) {
696
-				$conflits[$key] = [
697
-					'base' => $ctrq[$key],
698
-					'post' => $champs[$key]
699
-				];
700
-				unset($champs[$key]); # stocker quand meme les modifs ?
701
-			}
702
-		}
703
-	}
704
-
705
-	return $conflits;
648
+    $spip_table_objet = table_objet_sql($type);
649
+    $id_table_objet = id_table_objet($type);
650
+
651
+    // Controle des MD5 envoyes
652
+    // On elimine les donnees non modifiees par le formulaire (mais
653
+    // potentiellement modifiees entre temps par un autre utilisateur)
654
+    foreach ($champs as $key => $val) {
655
+        if (isset($ctr[$prefix . $key]) and $m = $ctr[$prefix . $key]) {
656
+            if (is_scalar($val) and $m == md5($val)) {
657
+                unset($champs[$key]);
658
+            }
659
+        }
660
+    }
661
+    if (!$champs) {
662
+        return;
663
+    }
664
+
665
+    // On veut savoir si notre modif va avoir un impact
666
+    // par rapport aux donnees contenues dans la base
667
+    // (qui peuvent etre differentes de celles ayant servi a calculer le ctr)
668
+    $s = sql_fetsel(array_keys($champs), $spip_table_objet, "$id_table_objet=$id", $serveur);
669
+    $intact = true;
670
+    foreach ($champs as $ch => $val) {
671
+        $intact &= ($s[$ch] == $val);
672
+    }
673
+    if ($intact) {
674
+        return;
675
+    }
676
+
677
+    // Detection de conflits :
678
+    // On verifie si notre modif ne provient pas d'un formulaire
679
+    // genere a partir de donnees modifiees dans l'intervalle ; ici
680
+    // on compare a ce qui est dans la base, et on bloque en cas
681
+    // de conflit.
682
+    $ctrh = $ctrq = $conflits = [];
683
+    foreach (array_keys($champs) as $key) {
684
+        if (isset($ctr[$prefix . $key]) and $m = $ctr[$prefix . $key]) {
685
+            $ctrh[$key] = $m;
686
+            $ctrq[] = $key;
687
+        }
688
+    }
689
+    if ($ctrq) {
690
+        $ctrq = sql_fetsel($ctrq, $spip_table_objet, "$id_table_objet=$id", $serveur);
691
+        foreach ($ctrh as $key => $m) {
692
+            if (
693
+                $m != md5($ctrq[$key])
694
+                and $champs[$key] !== $ctrq[$key]
695
+            ) {
696
+                $conflits[$key] = [
697
+                    'base' => $ctrq[$key],
698
+                    'post' => $champs[$key]
699
+                ];
700
+                unset($champs[$key]); # stocker quand meme les modifs ?
701
+            }
702
+        }
703
+    }
704
+
705
+    return $conflits;
706 706
 }
707 707
 
708 708
 /**
@@ -714,9 +714,9 @@  discard block
 block discarded – undo
714 714
  * @return string
715 715
  */
716 716
 function display_conflit_champ($x) {
717
-	if (strstr($x, "\n") or strlen($x) > 80) {
718
-		return "<textarea style='width:99%; height:10em;'>" . entites_html($x) . "</textarea>\n";
719
-	} else {
720
-		return "<input type='text' size='40' style='width:99%' value=\"" . entites_html($x) . "\" />\n";
721
-	}
717
+    if (strstr($x, "\n") or strlen($x) > 80) {
718
+        return "<textarea style='width:99%; height:10em;'>" . entites_html($x) . "</textarea>\n";
719
+    } else {
720
+        return "<input type='text' size='40' style='width:99%' value=\"" . entites_html($x) . "\" />\n";
721
+    }
722 722
 }
Please login to merge, or discard this patch.
Spacing   +24 added lines, -25 removed lines patch added patch discarded remove patch
@@ -100,7 +100,7 @@  discard block
 block discarded – undo
100 100
 		$res['message_ok'] = _T('info_modification_enregistree');
101 101
 		if ($retour) {
102 102
 			if (strncmp($retour, 'javascript:', 11) == 0) {
103
-				$res['message_ok'] .= '<script type="text/javascript">/*<![CDATA[*/' . substr($retour, 11) . '/*]]>*/</script>';
103
+				$res['message_ok'] .= '<script type="text/javascript">/*<![CDATA[*/'.substr($retour, 11).'/*]]>*/</script>';
104 104
 				$res['editable'] = true;
105 105
 			} else {
106 106
 				$res['redirect'] = parametre_url($retour, $id_table_objet, $id);
@@ -140,7 +140,7 @@  discard block
 block discarded – undo
140 140
 				if (!isset($erreurs[$champ])) {
141 141
 					$erreurs[$champ] = '';
142 142
 				}
143
-				$erreurs[$champ] .= _T('alerte_modif_info_concourante') . "<br /><textarea readonly='readonly' class='forml'>" . entites_html($conflit['base']) . '</textarea>';
143
+				$erreurs[$champ] .= _T('alerte_modif_info_concourante')."<br /><textarea readonly='readonly' class='forml'>".entites_html($conflit['base']).'</textarea>';
144 144
 			}
145 145
 		}
146 146
 	}
@@ -220,7 +220,7 @@  discard block
 block discarded – undo
220 220
 	if (
221 221
 		$config_fonc
222 222
 		and !in_array($config_fonc, ['articles_edit_config', 'rubriques_edit_config', 'auteurs_edit_config'])
223
-		and $config_fonc !== $table_objet . '_edit_config'
223
+		and $config_fonc !== $table_objet.'_edit_config'
224 224
 	) {
225 225
 		if (
226 226
 			$args = test_formulaire_inclus_par_modele()
@@ -235,12 +235,12 @@  discard block
 block discarded – undo
235 235
 	// Appel direct dans un squelette
236 236
 	if (!$row) {
237 237
 		if (!$new or $lier_trad) {
238
-			if ($select = charger_fonction('precharger_' . $type, 'inc', true)) {
238
+			if ($select = charger_fonction('precharger_'.$type, 'inc', true)) {
239 239
 				$row = $select($id, $id_parent, $lier_trad);
240 240
 				// si on a une fonction precharger, elle pu faire un reglage de langue
241 241
 				$lang_default = (!empty($row['lang']) ? $row['lang'] : null);
242 242
 			} else {
243
-				$row = sql_fetsel('*', $table_objet_sql, $id_table_objet . '=' . intval($id));
243
+				$row = sql_fetsel('*', $table_objet_sql, $id_table_objet.'='.intval($id));
244 244
 			}
245 245
 			if (!$new) {
246 246
 				$md5 = controles_md5($row ?: []);
@@ -290,7 +290,7 @@  discard block
 block discarded – undo
290 290
 	if ($config_fonc) {
291 291
 		$contexte['config'] = $config = $config_fonc($contexte);
292 292
 		if (!$lang_default) {
293
-			$lang_default = $config['langue'] ?? session_get('lang') ;
293
+			$lang_default = $config['langue'] ?? session_get('lang');
294 294
 		}
295 295
 	}
296 296
 	$config = $config + [
@@ -314,13 +314,12 @@  discard block
 block discarded – undo
314 314
 		unset($contexte['lang']);
315 315
 	}
316 316
 
317
-	$contexte['_hidden'] = "<input type='hidden' name='editer_$type' value='oui' />\n" .
318
-		(!$lier_trad ? '' :
319
-			("\n<input type='hidden' name='lier_trad' value='" .
320
-				$lier_trad .
321
-				"' />" .
322
-				"\n<input type='hidden' name='changer_lang' value='" .
323
-				$lang_default .
317
+	$contexte['_hidden'] = "<input type='hidden' name='editer_$type' value='oui' />\n".
318
+		(!$lier_trad ? '' : ("\n<input type='hidden' name='lier_trad' value='".
319
+				$lier_trad.
320
+				"' />".
321
+				"\n<input type='hidden' name='changer_lang' value='".
322
+				$lang_default.
324 323
 				"' />"))
325 324
 		. $hidden
326 325
 		. ($md5 ?? '');
@@ -360,14 +359,14 @@  discard block
 block discarded – undo
360 359
 	$aider = charger_fonction('aider', 'inc');
361 360
 	if (strlen($texte) > 28 * 1024) {
362 361
 		$texte = str_replace("\r\n", "\n", $texte);
363
-		$pos = strpos($texte, "\n\n", 28 * 1024);  // coupe para > 28 ko
362
+		$pos = strpos($texte, "\n\n", 28 * 1024); // coupe para > 28 ko
364 363
 		if ($pos > 0 and $pos < 32 * 1024) {
365
-			$debut = substr($texte, 0, $pos) . "\n\n<!--SPIP-->\n";
364
+			$debut = substr($texte, 0, $pos)."\n\n<!--SPIP-->\n";
366 365
 			$suite = substr($texte, $pos + 2);
367 366
 		} else {
368
-			$pos = strpos($texte, ' ', 28 * 1024);  // sinon coupe espace
367
+			$pos = strpos($texte, ' ', 28 * 1024); // sinon coupe espace
369 368
 			if (!($pos > 0 and $pos < 32 * 1024)) {
370
-				$pos = 28 * 1024;  // au pire (pas d'espace trouv'e)
369
+				$pos = 28 * 1024; // au pire (pas d'espace trouv'e)
371 370
 				$decalage = 0; // si y'a pas d'espace, il ne faut pas perdre le caract`ere
372 371
 			} else {
373 372
 				$decalage = 1;
@@ -398,13 +397,13 @@  discard block
 block discarded – undo
398 397
 	}
399 398
 
400 399
 	include_spip('inc/barre');
401
-	$textes_supplement = "<br /><span style='color: red'>" . _T('info_texte_long') . "</span>\n";
400
+	$textes_supplement = "<br /><span style='color: red'>"._T('info_texte_long')."</span>\n";
402 401
 	$nombre = 0;
403 402
 
404 403
 	while (strlen($texte) > 29 * 1024) {
405 404
 		$nombre++;
406 405
 		[$texte1, $texte] = coupe_trop_long($texte);
407
-		$textes_supplement .= '<br />' .
406
+		$textes_supplement .= '<br />'.
408 407
 			"<textarea id='texte$nombre' name='texte_plus[$nombre]'$att_text>$texte1</textarea>\n";
409 408
 	}
410 409
 
@@ -487,7 +486,7 @@  discard block
 block discarded – undo
487 486
 	$ctr = [];
488 487
 	foreach ($data as $key => $val) {
489 488
 		$m = md5($val ?? '');
490
-		$k = $prefixe . $key;
489
+		$k = $prefixe.$key;
491 490
 
492 491
 		switch ($format) {
493 492
 			case 'html':
@@ -500,7 +499,7 @@  discard block
 block discarded – undo
500 499
 	}
501 500
 
502 501
 	if ($format === 'html') {
503
-		return "\n\n<!-- controles md5 -->\n" . join("\n", $ctr) . "\n\n";
502
+		return "\n\n<!-- controles md5 -->\n".join("\n", $ctr)."\n\n";
504 503
 	} else {
505 504
 		return $ctr;
506 505
 	}
@@ -652,7 +651,7 @@  discard block
 block discarded – undo
652 651
 	// On elimine les donnees non modifiees par le formulaire (mais
653 652
 	// potentiellement modifiees entre temps par un autre utilisateur)
654 653
 	foreach ($champs as $key => $val) {
655
-		if (isset($ctr[$prefix . $key]) and $m = $ctr[$prefix . $key]) {
654
+		if (isset($ctr[$prefix.$key]) and $m = $ctr[$prefix.$key]) {
656 655
 			if (is_scalar($val) and $m == md5($val)) {
657 656
 				unset($champs[$key]);
658 657
 			}
@@ -681,7 +680,7 @@  discard block
 block discarded – undo
681 680
 	// de conflit.
682 681
 	$ctrh = $ctrq = $conflits = [];
683 682
 	foreach (array_keys($champs) as $key) {
684
-		if (isset($ctr[$prefix . $key]) and $m = $ctr[$prefix . $key]) {
683
+		if (isset($ctr[$prefix.$key]) and $m = $ctr[$prefix.$key]) {
685 684
 			$ctrh[$key] = $m;
686 685
 			$ctrq[] = $key;
687 686
 		}
@@ -715,8 +714,8 @@  discard block
 block discarded – undo
715 714
  */
716 715
 function display_conflit_champ($x) {
717 716
 	if (strstr($x, "\n") or strlen($x) > 80) {
718
-		return "<textarea style='width:99%; height:10em;'>" . entites_html($x) . "</textarea>\n";
717
+		return "<textarea style='width:99%; height:10em;'>".entites_html($x)."</textarea>\n";
719 718
 	} else {
720
-		return "<input type='text' size='40' style='width:99%' value=\"" . entites_html($x) . "\" />\n";
719
+		return "<input type='text' size='40' style='width:99%' value=\"".entites_html($x)."\" />\n";
721 720
 	}
722 721
 }
Please login to merge, or discard this patch.
ecrire/req/sqlite_generique.php 1 patch
Indentation   +2002 added lines, -2002 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  */
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 // TODO: get/set_caracteres ?
@@ -42,91 +42,91 @@  discard block
 block discarded – undo
42 42
  * @return array|bool
43 43
  */
44 44
 function req_sqlite_dist($addr, $port, $login, $pass, $db = '', $prefixe = '', $sqlite_version = '') {
45
-	static $last_connect = [];
46
-
47
-	// si provient de selectdb
48
-	// un code pour etre sur que l'on vient de select_db()
49
-	if (strpos($db, $code = '@selectdb@') !== false) {
50
-		foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
51
-			$$a = $last_connect[$a];
52
-		}
53
-		$db = str_replace($code, '', $db);
54
-	}
55
-
56
-	/*
45
+    static $last_connect = [];
46
+
47
+    // si provient de selectdb
48
+    // un code pour etre sur que l'on vient de select_db()
49
+    if (strpos($db, $code = '@selectdb@') !== false) {
50
+        foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
51
+            $$a = $last_connect[$a];
52
+        }
53
+        $db = str_replace($code, '', $db);
54
+    }
55
+
56
+    /*
57 57
 	 * En sqlite, seule l'adresse du fichier est importante.
58 58
 	 * Ce sera $db le nom,
59 59
 	 * le path est $addr
60 60
 	 * (_DIR_DB si $addr est vide)
61 61
 	 */
62
-	_sqlite_init();
63
-
64
-	// determiner le dossier de la base : $addr ou _DIR_DB
65
-	$f = _DIR_DB;
66
-	if ($addr and strpos($addr, '/') !== false) {
67
-		$f = rtrim($addr, '/') . '/';
68
-	}
69
-
70
-	// un nom de base demande et impossible d'obtenir la base, on s'en va :
71
-	// il faut que la base existe ou que le repertoire parent soit writable
72
-	if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
73
-		spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
74
-
75
-		return false;
76
-	}
77
-
78
-	// charger les modules sqlite au besoin
79
-	if (!_sqlite_charger_version($sqlite_version)) {
80
-		spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
81
-
82
-		return false;
83
-	}
84
-
85
-	// chargement des constantes
86
-	// il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
87
-	$define = 'spip_sqlite' . $sqlite_version . '_constantes';
88
-	$define();
89
-
90
-	$ok = false;
91
-	if (!$db) {
92
-		// si pas de db ->
93
-		// base temporaire tant qu'on ne connait pas son vrai nom
94
-		// pour tester la connexion
95
-		$db = '_sqlite' . $sqlite_version . '_install';
96
-		$tmp = _DIR_DB . $db . '.sqlite';
97
-		$ok = $link = new \PDO("sqlite:$tmp");
98
-	} else {
99
-		// Ouvrir (eventuellement creer la base)
100
-		$ok = $link = new \PDO("sqlite:$f");
101
-	}
102
-
103
-	if (!$ok) {
104
-		$e = _sqlite_last_error_from_link($link);
105
-		spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS);
106
-
107
-		return false;
108
-	}
109
-
110
-	if ($link) {
111
-		$last_connect = [
112
-			'addr' => $addr,
113
-			'port' => $port,
114
-			'login' => $login,
115
-			'pass' => $pass,
116
-			'db' => $db,
117
-			'prefixe' => $prefixe,
118
-		];
119
-		// etre sur qu'on definit bien les fonctions a chaque nouvelle connexion
120
-		include_spip('req/sqlite_fonctions');
121
-		_sqlite_init_functions($link);
122
-	}
123
-
124
-	return [
125
-		'db' => $db,
126
-		'prefixe' => $prefixe ? $prefixe : $db,
127
-		'link' => $link,
128
-		'total_requetes' => 0,
129
-	];
62
+    _sqlite_init();
63
+
64
+    // determiner le dossier de la base : $addr ou _DIR_DB
65
+    $f = _DIR_DB;
66
+    if ($addr and strpos($addr, '/') !== false) {
67
+        $f = rtrim($addr, '/') . '/';
68
+    }
69
+
70
+    // un nom de base demande et impossible d'obtenir la base, on s'en va :
71
+    // il faut que la base existe ou que le repertoire parent soit writable
72
+    if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
73
+        spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
74
+
75
+        return false;
76
+    }
77
+
78
+    // charger les modules sqlite au besoin
79
+    if (!_sqlite_charger_version($sqlite_version)) {
80
+        spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
81
+
82
+        return false;
83
+    }
84
+
85
+    // chargement des constantes
86
+    // il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
87
+    $define = 'spip_sqlite' . $sqlite_version . '_constantes';
88
+    $define();
89
+
90
+    $ok = false;
91
+    if (!$db) {
92
+        // si pas de db ->
93
+        // base temporaire tant qu'on ne connait pas son vrai nom
94
+        // pour tester la connexion
95
+        $db = '_sqlite' . $sqlite_version . '_install';
96
+        $tmp = _DIR_DB . $db . '.sqlite';
97
+        $ok = $link = new \PDO("sqlite:$tmp");
98
+    } else {
99
+        // Ouvrir (eventuellement creer la base)
100
+        $ok = $link = new \PDO("sqlite:$f");
101
+    }
102
+
103
+    if (!$ok) {
104
+        $e = _sqlite_last_error_from_link($link);
105
+        spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS);
106
+
107
+        return false;
108
+    }
109
+
110
+    if ($link) {
111
+        $last_connect = [
112
+            'addr' => $addr,
113
+            'port' => $port,
114
+            'login' => $login,
115
+            'pass' => $pass,
116
+            'db' => $db,
117
+            'prefixe' => $prefixe,
118
+        ];
119
+        // etre sur qu'on definit bien les fonctions a chaque nouvelle connexion
120
+        include_spip('req/sqlite_fonctions');
121
+        _sqlite_init_functions($link);
122
+    }
123
+
124
+    return [
125
+        'db' => $db,
126
+        'prefixe' => $prefixe ? $prefixe : $db,
127
+        'link' => $link,
128
+        'total_requetes' => 0,
129
+    ];
130 130
 }
131 131
 
132 132
 
@@ -145,14 +145,14 @@  discard block
 block discarded – undo
145 145
  *    Resultat de la requete
146 146
  */
147 147
 function spip_sqlite_query($query, $serveur = '', $requeter = true) {
148
-	#spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG);
149
-	#_sqlite_init(); // fait la premiere fois dans spip_sqlite
150
-	$query = spip_sqlite::traduire_requete($query, $serveur);
151
-	if (!$requeter) {
152
-		return $query;
153
-	}
148
+    #spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG);
149
+    #_sqlite_init(); // fait la premiere fois dans spip_sqlite
150
+    $query = spip_sqlite::traduire_requete($query, $serveur);
151
+    if (!$requeter) {
152
+        return $query;
153
+    }
154 154
 
155
-	return spip_sqlite::executer_requete($query, $serveur);
155
+    return spip_sqlite::executer_requete($query, $serveur);
156 156
 }
157 157
 
158 158
 
@@ -169,11 +169,11 @@  discard block
 block discarded – undo
169 169
  */
170 170
 function spip_sqlite_alter($query, $serveur = '', $requeter = true) {
171 171
 
172
-	$query = spip_sqlite_query("ALTER $query", $serveur, false);
173
-	// traduire la requete pour recuperer les bons noms de table
174
-	$query = spip_sqlite::traduire_requete($query, $serveur);
172
+    $query = spip_sqlite_query("ALTER $query", $serveur, false);
173
+    // traduire la requete pour recuperer les bons noms de table
174
+    $query = spip_sqlite::traduire_requete($query, $serveur);
175 175
 
176
-	/*
176
+    /*
177 177
 		 * la il faut faire les transformations
178 178
 		 * si ALTER TABLE x (DROP|CHANGE) y
179 179
 		 *
@@ -182,251 +182,251 @@  discard block
 block discarded – undo
182 182
 		 * 3) faire chaque requete independemment
183 183
 		 */
184 184
 
185
-	// 1
186
-	if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) {
187
-		$debut = $regs[1];
188
-		$table = $regs[3];
189
-		$suite = $regs[4];
190
-	} else {
191
-		spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
192
-
193
-		return false;
194
-	}
195
-
196
-	// 2
197
-	// il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
198
-	// tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
199
-	// ou revoir l'api de sql_alter en creant un
200
-	// sql_alter_table($table,array($actions));
201
-	$todo = explode(',', $suite);
202
-
203
-	// on remet les morceaux dechires ensembles... que c'est laid !
204
-	$todo2 = [];
205
-	$i = 0;
206
-	$ouverte = false;
207
-	while ($do = array_shift($todo)) {
208
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
209
-		$o = (false !== strpos($do, '('));
210
-		$f = (false !== strpos($do, ')'));
211
-		if ($o and !$f) {
212
-			$ouverte = true;
213
-		} elseif ($f) {
214
-			$ouverte = false;
215
-		}
216
-		if (!$ouverte) {
217
-			$i++;
218
-		}
219
-	}
220
-
221
-	// 3
222
-	$resultats = [];
223
-	foreach ($todo2 as $do) {
224
-		$do = trim($do);
225
-		if (
226
-			!preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
227
-			. '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
228
-			. '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
229
-			. '|ADD COLUMN|ADD'
230
-			. ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
231
-		) {
232
-			spip_log(
233
-				"SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
234
-				'sqlite.' . _LOG_ERREUR
235
-			);
236
-
237
-			return false;
238
-		}
239
-
240
-		$cle = strtoupper($matches[1]);
241
-		$colonne_origine = $matches[2];
242
-		$colonne_destination = '';
243
-
244
-		$def = $matches[3];
245
-
246
-		// eluder une eventuelle clause before|after|first inutilisable
247
-		$defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
248
-		$defo = $defr; // garder la def d'origine pour certains cas
249
-		// remplacer les definitions venant de mysql
250
-		$defr = _sqlite_remplacements_definitions_table($defr);
251
-
252
-		// reinjecter dans le do
253
-		$do = str_replace($def, $defr, $do);
254
-		$def = $defr;
255
-
256
-		switch ($cle) {
257
-			// suppression d'un index
258
-			case 'DROP KEY':
259
-			case 'DROP INDEX':
260
-				$nom_index = $colonne_origine;
261
-				spip_sqlite_drop_index($nom_index, $table, $serveur);
262
-				break;
263
-
264
-			// suppression d'une pk
265
-			case 'DROP PRIMARY KEY':
266
-				if (
267
-					!_sqlite_modifier_table(
268
-						$table,
269
-						$colonne_origine,
270
-						['key' => ['PRIMARY KEY' => '']],
271
-						$serveur
272
-					)
273
-				) {
274
-					return false;
275
-				}
276
-				break;
277
-			// suppression d'une colonne
278
-			case 'DROP COLUMN':
279
-			case 'DROP':
280
-				if (
281
-					!_sqlite_modifier_table(
282
-						$table,
283
-						[$colonne_origine => ''],
284
-						[],
285
-						$serveur
286
-					)
287
-				) {
288
-					return false;
289
-				}
290
-				break;
291
-
292
-			case 'CHANGE COLUMN':
293
-			case 'CHANGE':
294
-				// recuperer le nom de la future colonne
295
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
296
-				// en tenant compte de la cle primaire (ce qui est mieux)
297
-				$def = trim($defo);
298
-				$colonne_destination = substr($def, 0, strpos($def, ' '));
299
-				$def = substr($def, strlen($colonne_destination) + 1);
300
-
301
-				if (
302
-					!_sqlite_modifier_table(
303
-						$table,
304
-						[$colonne_origine => $colonne_destination],
305
-						['field' => [$colonne_destination => $def]],
306
-						$serveur
307
-					)
308
-				) {
309
-					return false;
310
-				}
311
-				break;
312
-
313
-			case 'MODIFY':
314
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
315
-				// en tenant compte de la cle primaire (ce qui est mieux)
316
-				if (
317
-					!_sqlite_modifier_table(
318
-						$table,
319
-						$colonne_origine,
320
-						['field' => [$colonne_origine => $defo]],
321
-						$serveur
322
-					)
323
-				) {
324
-					return false;
325
-				}
326
-				break;
327
-
328
-			// pas geres en sqlite2
329
-			case 'RENAME':
330
-				$do = 'RENAME TO' . substr($do, 6);
331
-			case 'RENAME TO':
332
-				if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
333
-					spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
334
-
335
-					return false;
336
-				}
337
-				break;
338
-
339
-			// ajout d'une pk
340
-			case 'ADD PRIMARY KEY':
341
-				$pk = trim(substr($do, 16));
342
-				$pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
343
-				if (
344
-					!_sqlite_modifier_table(
345
-						$table,
346
-						$colonne_origine,
347
-						['key' => ['PRIMARY KEY' => $pk]],
348
-						$serveur
349
-					)
350
-				) {
351
-					return false;
352
-				}
353
-				break;
354
-			// ajout d'un index
355
-			case 'ADD UNIQUE KEY':
356
-			case 'ADD UNIQUE':
357
-				$unique = true;
358
-			case 'ADD INDEX':
359
-			case 'ADD KEY':
360
-				if (!isset($unique)) {
361
-					$unique = false;
362
-				}
363
-				// peut etre "(colonne)" ou "nom_index (colonnes)"
364
-				// bug potentiel si qqn met "(colonne, colonne)"
365
-				//
366
-				// nom_index (colonnes)
367
-				if ($def) {
368
-					$colonnes = substr($def, 1, -1);
369
-					$nom_index = $colonne_origine;
370
-				} else {
371
-					// (colonne)
372
-					if ($colonne_origine[0] == '(') {
373
-						$colonnes = substr($colonne_origine, 1, -1);
374
-						if (false !== strpos(',', $colonnes)) {
375
-							spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
376
-								. " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
377
-							break;
378
-						} else {
379
-							$nom_index = $colonnes;
380
-						}
381
-					} // nom_index
382
-					else {
383
-						$nom_index = $colonnes = $colonne_origine;
384
-					}
385
-				}
386
-				spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
387
-				break;
388
-
389
-			// pas geres en sqlite2
390
-			case 'ADD COLUMN':
391
-				$do = 'ADD' . substr($do, 10);
392
-			case 'ADD':
393
-			default:
394
-				if (!preg_match(',primary\s+key,i', $do)) {
395
-					if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
396
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
397
-
398
-						return false;
399
-					}
400
-					break;
401
-				}
402
-				// ou si la colonne est aussi primary key
403
-				// cas du add id_truc int primary key
404
-				// ajout d'une colonne qui passe en primary key directe
405
-				else {
406
-					$def = trim(substr($do, 3));
407
-					$colonne_ajoutee = substr($def, 0, strpos($def, ' '));
408
-					$def = substr($def, strlen($colonne_ajoutee) + 1);
409
-					$opts = [];
410
-					if (preg_match(',primary\s+key,i', $def)) {
411
-						$opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
412
-						$def = preg_replace(',primary\s+key,i', '', $def);
413
-					}
414
-					$opts['field'] = [$colonne_ajoutee => $def];
415
-					if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
416
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
417
-
418
-						return false;
419
-					}
420
-				}
421
-				break;
422
-		}
423
-		// tout est bon, ouf !
424
-		spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
425
-	}
426
-
427
-	spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
428
-
429
-	return true;
185
+    // 1
186
+    if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) {
187
+        $debut = $regs[1];
188
+        $table = $regs[3];
189
+        $suite = $regs[4];
190
+    } else {
191
+        spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
192
+
193
+        return false;
194
+    }
195
+
196
+    // 2
197
+    // il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
198
+    // tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
199
+    // ou revoir l'api de sql_alter en creant un
200
+    // sql_alter_table($table,array($actions));
201
+    $todo = explode(',', $suite);
202
+
203
+    // on remet les morceaux dechires ensembles... que c'est laid !
204
+    $todo2 = [];
205
+    $i = 0;
206
+    $ouverte = false;
207
+    while ($do = array_shift($todo)) {
208
+        $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
209
+        $o = (false !== strpos($do, '('));
210
+        $f = (false !== strpos($do, ')'));
211
+        if ($o and !$f) {
212
+            $ouverte = true;
213
+        } elseif ($f) {
214
+            $ouverte = false;
215
+        }
216
+        if (!$ouverte) {
217
+            $i++;
218
+        }
219
+    }
220
+
221
+    // 3
222
+    $resultats = [];
223
+    foreach ($todo2 as $do) {
224
+        $do = trim($do);
225
+        if (
226
+            !preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
227
+            . '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
228
+            . '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
229
+            . '|ADD COLUMN|ADD'
230
+            . ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
231
+        ) {
232
+            spip_log(
233
+                "SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
234
+                'sqlite.' . _LOG_ERREUR
235
+            );
236
+
237
+            return false;
238
+        }
239
+
240
+        $cle = strtoupper($matches[1]);
241
+        $colonne_origine = $matches[2];
242
+        $colonne_destination = '';
243
+
244
+        $def = $matches[3];
245
+
246
+        // eluder une eventuelle clause before|after|first inutilisable
247
+        $defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
248
+        $defo = $defr; // garder la def d'origine pour certains cas
249
+        // remplacer les definitions venant de mysql
250
+        $defr = _sqlite_remplacements_definitions_table($defr);
251
+
252
+        // reinjecter dans le do
253
+        $do = str_replace($def, $defr, $do);
254
+        $def = $defr;
255
+
256
+        switch ($cle) {
257
+            // suppression d'un index
258
+            case 'DROP KEY':
259
+            case 'DROP INDEX':
260
+                $nom_index = $colonne_origine;
261
+                spip_sqlite_drop_index($nom_index, $table, $serveur);
262
+                break;
263
+
264
+            // suppression d'une pk
265
+            case 'DROP PRIMARY KEY':
266
+                if (
267
+                    !_sqlite_modifier_table(
268
+                        $table,
269
+                        $colonne_origine,
270
+                        ['key' => ['PRIMARY KEY' => '']],
271
+                        $serveur
272
+                    )
273
+                ) {
274
+                    return false;
275
+                }
276
+                break;
277
+            // suppression d'une colonne
278
+            case 'DROP COLUMN':
279
+            case 'DROP':
280
+                if (
281
+                    !_sqlite_modifier_table(
282
+                        $table,
283
+                        [$colonne_origine => ''],
284
+                        [],
285
+                        $serveur
286
+                    )
287
+                ) {
288
+                    return false;
289
+                }
290
+                break;
291
+
292
+            case 'CHANGE COLUMN':
293
+            case 'CHANGE':
294
+                // recuperer le nom de la future colonne
295
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
296
+                // en tenant compte de la cle primaire (ce qui est mieux)
297
+                $def = trim($defo);
298
+                $colonne_destination = substr($def, 0, strpos($def, ' '));
299
+                $def = substr($def, strlen($colonne_destination) + 1);
300
+
301
+                if (
302
+                    !_sqlite_modifier_table(
303
+                        $table,
304
+                        [$colonne_origine => $colonne_destination],
305
+                        ['field' => [$colonne_destination => $def]],
306
+                        $serveur
307
+                    )
308
+                ) {
309
+                    return false;
310
+                }
311
+                break;
312
+
313
+            case 'MODIFY':
314
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
315
+                // en tenant compte de la cle primaire (ce qui est mieux)
316
+                if (
317
+                    !_sqlite_modifier_table(
318
+                        $table,
319
+                        $colonne_origine,
320
+                        ['field' => [$colonne_origine => $defo]],
321
+                        $serveur
322
+                    )
323
+                ) {
324
+                    return false;
325
+                }
326
+                break;
327
+
328
+            // pas geres en sqlite2
329
+            case 'RENAME':
330
+                $do = 'RENAME TO' . substr($do, 6);
331
+            case 'RENAME TO':
332
+                if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
333
+                    spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
334
+
335
+                    return false;
336
+                }
337
+                break;
338
+
339
+            // ajout d'une pk
340
+            case 'ADD PRIMARY KEY':
341
+                $pk = trim(substr($do, 16));
342
+                $pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
343
+                if (
344
+                    !_sqlite_modifier_table(
345
+                        $table,
346
+                        $colonne_origine,
347
+                        ['key' => ['PRIMARY KEY' => $pk]],
348
+                        $serveur
349
+                    )
350
+                ) {
351
+                    return false;
352
+                }
353
+                break;
354
+            // ajout d'un index
355
+            case 'ADD UNIQUE KEY':
356
+            case 'ADD UNIQUE':
357
+                $unique = true;
358
+            case 'ADD INDEX':
359
+            case 'ADD KEY':
360
+                if (!isset($unique)) {
361
+                    $unique = false;
362
+                }
363
+                // peut etre "(colonne)" ou "nom_index (colonnes)"
364
+                // bug potentiel si qqn met "(colonne, colonne)"
365
+                //
366
+                // nom_index (colonnes)
367
+                if ($def) {
368
+                    $colonnes = substr($def, 1, -1);
369
+                    $nom_index = $colonne_origine;
370
+                } else {
371
+                    // (colonne)
372
+                    if ($colonne_origine[0] == '(') {
373
+                        $colonnes = substr($colonne_origine, 1, -1);
374
+                        if (false !== strpos(',', $colonnes)) {
375
+                            spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
376
+                                . " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
377
+                            break;
378
+                        } else {
379
+                            $nom_index = $colonnes;
380
+                        }
381
+                    } // nom_index
382
+                    else {
383
+                        $nom_index = $colonnes = $colonne_origine;
384
+                    }
385
+                }
386
+                spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
387
+                break;
388
+
389
+            // pas geres en sqlite2
390
+            case 'ADD COLUMN':
391
+                $do = 'ADD' . substr($do, 10);
392
+            case 'ADD':
393
+            default:
394
+                if (!preg_match(',primary\s+key,i', $do)) {
395
+                    if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
396
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
397
+
398
+                        return false;
399
+                    }
400
+                    break;
401
+                }
402
+                // ou si la colonne est aussi primary key
403
+                // cas du add id_truc int primary key
404
+                // ajout d'une colonne qui passe en primary key directe
405
+                else {
406
+                    $def = trim(substr($do, 3));
407
+                    $colonne_ajoutee = substr($def, 0, strpos($def, ' '));
408
+                    $def = substr($def, strlen($colonne_ajoutee) + 1);
409
+                    $opts = [];
410
+                    if (preg_match(',primary\s+key,i', $def)) {
411
+                        $opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
412
+                        $def = preg_replace(',primary\s+key,i', '', $def);
413
+                    }
414
+                    $opts['field'] = [$colonne_ajoutee => $def];
415
+                    if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
416
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
417
+
418
+                        return false;
419
+                    }
420
+                }
421
+                break;
422
+        }
423
+        // tout est bon, ouf !
424
+        spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
425
+    }
426
+
427
+    spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
428
+
429
+    return true;
430 430
 }
431 431
 
432 432
 
@@ -449,38 +449,38 @@  discard block
 block discarded – undo
449 449
  *     - true si la requête réussie, false sinon.
450 450
  */
451 451
 function spip_sqlite_create(
452
-	$nom,
453
-	$champs,
454
-	$cles,
455
-	$autoinc = false,
456
-	$temporary = false,
457
-	$serveur = '',
458
-	$requeter = true
452
+    $nom,
453
+    $champs,
454
+    $cles,
455
+    $autoinc = false,
456
+    $temporary = false,
457
+    $serveur = '',
458
+    $requeter = true
459 459
 ) {
460
-	$query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
461
-	if (!$query) {
462
-		return false;
463
-	}
464
-	$res = spip_sqlite_query($query, $serveur, $requeter);
465
-
466
-	// SQLite ne cree pas les KEY sur les requetes CREATE TABLE
467
-	// il faut donc les faire creer ensuite
468
-	if (!$requeter) {
469
-		return $res;
470
-	}
471
-
472
-	$ok = $res ? true : false;
473
-	if ($ok) {
474
-		foreach ($cles as $k => $v) {
475
-			if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
476
-				$index = trim(substr($k, strlen($m[1])));
477
-				$unique = (strlen($m[1]) > 3);
478
-				$ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
479
-			}
480
-		}
481
-	}
482
-
483
-	return $ok ? true : false;
460
+    $query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
461
+    if (!$query) {
462
+        return false;
463
+    }
464
+    $res = spip_sqlite_query($query, $serveur, $requeter);
465
+
466
+    // SQLite ne cree pas les KEY sur les requetes CREATE TABLE
467
+    // il faut donc les faire creer ensuite
468
+    if (!$requeter) {
469
+        return $res;
470
+    }
471
+
472
+    $ok = $res ? true : false;
473
+    if ($ok) {
474
+        foreach ($cles as $k => $v) {
475
+            if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
476
+                $index = trim(substr($k, strlen($m[1])));
477
+                $unique = (strlen($m[1]) > 3);
478
+                $ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
479
+            }
480
+        }
481
+    }
482
+
483
+    return $ok ? true : false;
484 484
 }
485 485
 
486 486
 /**
@@ -493,21 +493,21 @@  discard block
 block discarded – undo
493 493
  * @return bool true si la base est créee.
494 494
  **/
495 495
 function spip_sqlite_create_base($nom, $serveur = '', $option = true) {
496
-	$f = $nom . '.sqlite';
497
-	if (strpos($nom, '/') === false) {
498
-		$f = _DIR_DB . $f;
499
-	}
496
+    $f = $nom . '.sqlite';
497
+    if (strpos($nom, '/') === false) {
498
+        $f = _DIR_DB . $f;
499
+    }
500 500
 
501
-	$ok = new \PDO("sqlite:$f");
501
+    $ok = new \PDO("sqlite:$f");
502 502
 
503
-	if ($ok) {
504
-		unset($ok);
503
+    if ($ok) {
504
+        unset($ok);
505 505
 
506
-		return true;
507
-	}
508
-	unset($ok);
506
+        return true;
507
+    }
508
+    unset($ok);
509 509
 
510
-	return false;
510
+    return false;
511 511
 }
512 512
 
513 513
 
@@ -528,22 +528,22 @@  discard block
 block discarded – undo
528 528
  *     - string texte de la requête si $requeter vaut false
529 529
  */
530 530
 function spip_sqlite_create_view($nom, $query_select, $serveur = '', $requeter = true) {
531
-	if (!$query_select) {
532
-		return false;
533
-	}
534
-	// vue deja presente
535
-	if (sql_showtable($nom, false, $serveur)) {
536
-		spip_log(
537
-			"Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
538
-			'sqlite.' . _LOG_ERREUR
539
-		);
531
+    if (!$query_select) {
532
+        return false;
533
+    }
534
+    // vue deja presente
535
+    if (sql_showtable($nom, false, $serveur)) {
536
+        spip_log(
537
+            "Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
538
+            'sqlite.' . _LOG_ERREUR
539
+        );
540 540
 
541
-		return false;
542
-	}
541
+        return false;
542
+    }
543 543
 
544
-	$query = "CREATE VIEW $nom AS " . $query_select;
544
+    $query = "CREATE VIEW $nom AS " . $query_select;
545 545
 
546
-	return spip_sqlite_query($query, $serveur, $requeter);
546
+    return spip_sqlite_query($query, $serveur, $requeter);
547 547
 }
548 548
 
549 549
 /**
@@ -565,54 +565,54 @@  discard block
 block discarded – undo
565 565
  *    string : requête, false si erreur, true sinon.
566 566
  */
567 567
 function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true) {
568
-	if (!($nom or $table or $champs)) {
569
-		spip_log(
570
-			"Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
571
-			'sqlite.' . _LOG_ERREUR
572
-		);
573
-
574
-		return false;
575
-	}
576
-
577
-	// SQLite ne differentie pas noms des index en fonction des tables
578
-	// il faut donc creer des noms uniques d'index pour une base sqlite
579
-	$nom = $table . '_' . $nom;
580
-	// enlever d'eventuelles parentheses deja presentes sur champs
581
-	if (!is_array($champs)) {
582
-		if ($champs[0] == '(') {
583
-			$champs = substr($champs, 1, -1);
584
-		}
585
-		$champs = [$champs];
586
-		// supprimer l'info de longueur d'index mysql en fin de champ
587
-		$champs = preg_replace(',\(\d+\)$,', '', $champs);
588
-	}
589
-
590
-	$ifnotexists = '';
591
-	$version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
592
-	if (!function_exists('spip_version_compare')) {
593
-		include_spip('plugins/installer');
594
-	}
595
-
596
-	if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
597
-		$ifnotexists = ' IF NOT EXISTS';
598
-	} else {
599
-		/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
600
-		$a = spip_sqlite_showtable($table, $serveur);
601
-		if (isset($a['key']['KEY ' . $nom])) {
602
-			return true;
603
-		}
604
-	}
605
-
606
-	$query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
607
-	$res = spip_sqlite_query($query, $serveur, $requeter);
608
-	if (!$requeter) {
609
-		return $res;
610
-	}
611
-	if ($res) {
612
-		return true;
613
-	} else {
614
-		return false;
615
-	}
568
+    if (!($nom or $table or $champs)) {
569
+        spip_log(
570
+            "Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
571
+            'sqlite.' . _LOG_ERREUR
572
+        );
573
+
574
+        return false;
575
+    }
576
+
577
+    // SQLite ne differentie pas noms des index en fonction des tables
578
+    // il faut donc creer des noms uniques d'index pour une base sqlite
579
+    $nom = $table . '_' . $nom;
580
+    // enlever d'eventuelles parentheses deja presentes sur champs
581
+    if (!is_array($champs)) {
582
+        if ($champs[0] == '(') {
583
+            $champs = substr($champs, 1, -1);
584
+        }
585
+        $champs = [$champs];
586
+        // supprimer l'info de longueur d'index mysql en fin de champ
587
+        $champs = preg_replace(',\(\d+\)$,', '', $champs);
588
+    }
589
+
590
+    $ifnotexists = '';
591
+    $version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
592
+    if (!function_exists('spip_version_compare')) {
593
+        include_spip('plugins/installer');
594
+    }
595
+
596
+    if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
597
+        $ifnotexists = ' IF NOT EXISTS';
598
+    } else {
599
+        /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
600
+        $a = spip_sqlite_showtable($table, $serveur);
601
+        if (isset($a['key']['KEY ' . $nom])) {
602
+            return true;
603
+        }
604
+    }
605
+
606
+    $query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
607
+    $res = spip_sqlite_query($query, $serveur, $requeter);
608
+    if (!$requeter) {
609
+        return $res;
610
+    }
611
+    if ($res) {
612
+        return true;
613
+    } else {
614
+        return false;
615
+    }
616 616
 }
617 617
 
618 618
 /**
@@ -629,31 +629,31 @@  discard block
 block discarded – undo
629 629
  * @return int                 Nombre de lignes
630 630
  */
631 631
 function spip_sqlite_count($r, $serveur = '', $requeter = true) {
632
-	if (!$r) {
633
-		return 0;
634
-	}
635
-
636
-	// select ou autre (insert, update,...) ?
637
-	// (link,requete) a compter
638
-	if (is_array($r->spipSqliteRowCount)) {
639
-		list($link, $query) = $r->spipSqliteRowCount;
640
-		// amelioration possible a tester intensivement : pas de order by pour compter !
641
-		// $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query);
642
-		$query = "SELECT count(*) as zzzzsqlitecount FROM ($query)";
643
-		$l = $link->query($query);
644
-		$i = 0;
645
-		if ($l and $z = $l->fetch()) {
646
-			$i = $z['zzzzsqlitecount'];
647
-		}
648
-		$r->spipSqliteRowCount = $i;
649
-	}
650
-	if (isset($r->spipSqliteRowCount)) {
651
-		// Ce compte est faux s'il y a des limit dans la requete :(
652
-		// il retourne le nombre d'enregistrements sans le limit
653
-		return $r->spipSqliteRowCount;
654
-	} else {
655
-		return $r->rowCount();
656
-	}
632
+    if (!$r) {
633
+        return 0;
634
+    }
635
+
636
+    // select ou autre (insert, update,...) ?
637
+    // (link,requete) a compter
638
+    if (is_array($r->spipSqliteRowCount)) {
639
+        list($link, $query) = $r->spipSqliteRowCount;
640
+        // amelioration possible a tester intensivement : pas de order by pour compter !
641
+        // $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query);
642
+        $query = "SELECT count(*) as zzzzsqlitecount FROM ($query)";
643
+        $l = $link->query($query);
644
+        $i = 0;
645
+        if ($l and $z = $l->fetch()) {
646
+            $i = $z['zzzzsqlitecount'];
647
+        }
648
+        $r->spipSqliteRowCount = $i;
649
+    }
650
+    if (isset($r->spipSqliteRowCount)) {
651
+        // Ce compte est faux s'il y a des limit dans la requete :(
652
+        // il retourne le nombre d'enregistrements sans le limit
653
+        return $r->spipSqliteRowCount;
654
+    } else {
655
+        return $r->rowCount();
656
+    }
657 657
 }
658 658
 
659 659
 
@@ -672,30 +672,30 @@  discard block
 block discarded – undo
672 672
  *     - false si la requête a échouée
673 673
  **/
674 674
 function spip_sqlite_countsel(
675
-	$from = [],
676
-	$where = [],
677
-	$groupby = '',
678
-	$having = [],
679
-	$serveur = '',
680
-	$requeter = true
675
+    $from = [],
676
+    $where = [],
677
+    $groupby = '',
678
+    $having = [],
679
+    $serveur = '',
680
+    $requeter = true
681 681
 ) {
682
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
683
-	$r = spip_sqlite_select(
684
-		"COUNT($c)",
685
-		$from,
686
-		$where,
687
-		'',
688
-		'',
689
-		'',
690
-		$having,
691
-		$serveur,
692
-		$requeter
693
-	);
694
-	if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
695
-		list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
696
-	}
697
-
698
-	return $r;
682
+    $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
683
+    $r = spip_sqlite_select(
684
+        "COUNT($c)",
685
+        $from,
686
+        $where,
687
+        '',
688
+        '',
689
+        '',
690
+        $having,
691
+        $serveur,
692
+        $requeter
693
+    );
694
+    if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
695
+        list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
696
+    }
697
+
698
+    return $r;
699 699
 }
700 700
 
701 701
 
@@ -712,24 +712,24 @@  discard block
 block discarded – undo
712 712
  *     - False en cas d'erreur.
713 713
  **/
714 714
 function spip_sqlite_delete($table, $where = '', $serveur = '', $requeter = true) {
715
-	$res = spip_sqlite_query(
716
-		_sqlite_calculer_expression('DELETE FROM', $table, ',')
717
-		. _sqlite_calculer_expression('WHERE', $where),
718
-		$serveur,
719
-		$requeter
720
-	);
715
+    $res = spip_sqlite_query(
716
+        _sqlite_calculer_expression('DELETE FROM', $table, ',')
717
+        . _sqlite_calculer_expression('WHERE', $where),
718
+        $serveur,
719
+        $requeter
720
+    );
721 721
 
722
-	// renvoyer la requete inerte si demandee
723
-	if (!$requeter) {
724
-		return $res;
725
-	}
722
+    // renvoyer la requete inerte si demandee
723
+    if (!$requeter) {
724
+        return $res;
725
+    }
726 726
 
727
-	if ($res) {
728
-		$link = _sqlite_link($serveur);
729
-		return $res->rowCount();
730
-	} else {
731
-		return false;
732
-	}
727
+    if ($res) {
728
+        $link = _sqlite_link($serveur);
729
+        return $res->rowCount();
730
+    } else {
731
+        return false;
732
+    }
733 733
 }
734 734
 
735 735
 
@@ -745,15 +745,15 @@  discard block
 block discarded – undo
745 745
  *     - true si la requête a réussie, false sinon
746 746
  */
747 747
 function spip_sqlite_drop_table($table, $exist = '', $serveur = '', $requeter = true) {
748
-	if ($exist) {
749
-		$exist = ' IF EXISTS';
750
-	}
748
+    if ($exist) {
749
+        $exist = ' IF EXISTS';
750
+    }
751 751
 
752
-	if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
753
-		return true;
754
-	} else {
755
-		return false;
756
-	}
752
+    if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
753
+        return true;
754
+    } else {
755
+        return false;
756
+    }
757 757
 }
758 758
 
759 759
 
@@ -769,11 +769,11 @@  discard block
 block discarded – undo
769 769
  *     - true si la requête a réussie, false sinon
770 770
  */
771 771
 function spip_sqlite_drop_view($view, $exist = '', $serveur = '', $requeter = true) {
772
-	if ($exist) {
773
-		$exist = ' IF EXISTS';
774
-	}
772
+    if ($exist) {
773
+        $exist = ' IF EXISTS';
774
+    }
775 775
 
776
-	return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
776
+    return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
777 777
 }
778 778
 
779 779
 /**
@@ -787,20 +787,20 @@  discard block
 block discarded – undo
787 787
  * @return bool ou requete
788 788
  */
789 789
 function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true) {
790
-	if (!($nom or $table)) {
791
-		spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
790
+    if (!($nom or $table)) {
791
+        spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
792 792
 
793
-		return false;
794
-	}
793
+        return false;
794
+    }
795 795
 
796
-	// SQLite ne differentie pas noms des index en fonction des tables
797
-	// il faut donc creer des noms uniques d'index pour une base sqlite
798
-	$index = $table . '_' . $nom;
799
-	$exist = ' IF EXISTS';
796
+    // SQLite ne differentie pas noms des index en fonction des tables
797
+    // il faut donc creer des noms uniques d'index pour une base sqlite
798
+    $index = $table . '_' . $nom;
799
+    $exist = ' IF EXISTS';
800 800
 
801
-	$query = "DROP INDEX$exist $index";
801
+    $query = "DROP INDEX$exist $index";
802 802
 
803
-	return spip_sqlite_query($query, $serveur, $requeter);
803
+    return spip_sqlite_query($query, $serveur, $requeter);
804 804
 }
805 805
 
806 806
 /**
@@ -816,28 +816,28 @@  discard block
 block discarded – undo
816 816
  *     Erreur eventuelle
817 817
  **/
818 818
 function spip_sqlite_error($query = '', $serveur = '') {
819
-	$link = _sqlite_link($serveur);
819
+    $link = _sqlite_link($serveur);
820 820
 
821
-	if ($link) {
822
-		$errs = $link->errorInfo();
823
-		$s = _sqlite_last_error_from_link($link);
824
-	} else {
825
-		$s = ': aucune ressource sqlite (link)';
826
-	}
827
-	if ($s) {
828
-		$trace = debug_backtrace();
829
-		if ($trace[0]['function'] != 'spip_sqlite_error') {
830
-			spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
831
-		}
832
-	}
821
+    if ($link) {
822
+        $errs = $link->errorInfo();
823
+        $s = _sqlite_last_error_from_link($link);
824
+    } else {
825
+        $s = ': aucune ressource sqlite (link)';
826
+    }
827
+    if ($s) {
828
+        $trace = debug_backtrace();
829
+        if ($trace[0]['function'] != 'spip_sqlite_error') {
830
+            spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
831
+        }
832
+    }
833 833
 
834
-	return $s;
834
+    return $s;
835 835
 }
836 836
 
837 837
 function _sqlite_last_error_from_link($link) {
838
-	if ($link) {
839
-		$errs = $link->errorInfo();
840
-		/*
838
+    if ($link) {
839
+        $errs = $link->errorInfo();
840
+        /*
841 841
 			$errs[0]
842 842
 				numero SQLState ('HY000' souvent lors d'une erreur)
843 843
 				http://www.easysoft.com/developer/interfaces/odbc/sqlstate_status_return_codes.html
@@ -847,11 +847,11 @@  discard block
 block discarded – undo
847 847
 			$errs[2]
848 848
 				Le texte du message d'erreur
849 849
 		*/
850
-		if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
851
-			return "$errs[2]";
852
-		}
853
-	}
854
-	return '';
850
+        if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
851
+            return "$errs[2]";
852
+        }
853
+    }
854
+    return '';
855 855
 }
856 856
 
857 857
 /**
@@ -868,23 +868,23 @@  discard block
 block discarded – undo
868 868
  *    'HY000/1' : numéro de l'erreur SQLState / numéro d'erreur interne SQLite (en sqlite 3)
869 869
  **/
870 870
 function spip_sqlite_errno($serveur = '') {
871
-	$link = _sqlite_link($serveur);
871
+    $link = _sqlite_link($serveur);
872 872
 
873
-	if ($link) {
874
-		$t = $link->errorInfo();
875
-		$s = ltrim($t[0], '0'); // 00000 si pas d'erreur
876
-		if ($s) {
877
-			$s .= ' / ' . $t[1];
878
-		} // ajoute l'erreur du moteur SQLite
879
-	} else {
880
-		$s = ': aucune ressource sqlite (link)';
881
-	}
873
+    if ($link) {
874
+        $t = $link->errorInfo();
875
+        $s = ltrim($t[0], '0'); // 00000 si pas d'erreur
876
+        if ($s) {
877
+            $s .= ' / ' . $t[1];
878
+        } // ajoute l'erreur du moteur SQLite
879
+    } else {
880
+        $s = ': aucune ressource sqlite (link)';
881
+    }
882 882
 
883
-	if ($s) {
884
-		spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
885
-	}
883
+    if ($s) {
884
+        spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
885
+    }
886 886
 
887
-	return $s ? $s : 0;
887
+    return $s ? $s : 0;
888 888
 }
889 889
 
890 890
 
@@ -900,19 +900,19 @@  discard block
 block discarded – undo
900 900
  *     - false si on a pas pu avoir d'explication
901 901
  */
902 902
 function spip_sqlite_explain($query, $serveur = '', $requeter = true) {
903
-	if (strpos(ltrim($query), 'SELECT') !== 0) {
904
-		return [];
905
-	}
903
+    if (strpos(ltrim($query), 'SELECT') !== 0) {
904
+        return [];
905
+    }
906 906
 
907
-	$query = spip_sqlite::traduire_requete($query, $serveur);
908
-	$query = 'EXPLAIN ' . $query;
909
-	if (!$requeter) {
910
-		return $query;
911
-	}
912
-	// on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
913
-	$r = spip_sqlite::executer_requete($query, $serveur, false);
907
+    $query = spip_sqlite::traduire_requete($query, $serveur);
908
+    $query = 'EXPLAIN ' . $query;
909
+    if (!$requeter) {
910
+        return $query;
911
+    }
912
+    // on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
913
+    $r = spip_sqlite::executer_requete($query, $serveur, false);
914 914
 
915
-	return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
915
+    return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
916 916
 }
917 917
 
918 918
 
@@ -932,35 +932,35 @@  discard block
 block discarded – undo
932 932
  */
933 933
 function spip_sqlite_fetch($r, $t = '', $serveur = '', $requeter = true) {
934 934
 
935
-	$link = _sqlite_link($serveur);
936
-	$t = $t ? $t : SPIP_SQLITE3_ASSOC;
935
+    $link = _sqlite_link($serveur);
936
+    $t = $t ? $t : SPIP_SQLITE3_ASSOC;
937 937
 
938
-	if (!$r) {
939
-		return false;
940
-	}
938
+    if (!$r) {
939
+        return false;
940
+    }
941 941
 
942
-	$retour = $r->fetch($t);
942
+    $retour = $r->fetch($t);
943 943
 
944
-	if (!$retour) {
945
-		if ($r->errorCode() === '00000') {
946
-			return null;
947
-		}
948
-		return false;
949
-	}
944
+    if (!$retour) {
945
+        if ($r->errorCode() === '00000') {
946
+            return null;
947
+        }
948
+        return false;
949
+    }
950 950
 
951
-	// Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
952
-	// suppression de 'table.' pour toutes les cles (c'est un peu violent !)
953
-	// c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
954
-	if (strpos(implode('', array_keys($retour)), '.') !== false) {
955
-		foreach ($retour as $cle => $val) {
956
-			if (($pos = strpos($cle, '.')) !== false) {
957
-				$retour[substr($cle, $pos + 1)] = &$retour[$cle];
958
-				unset($retour[$cle]);
959
-			}
960
-		}
961
-	}
951
+    // Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
952
+    // suppression de 'table.' pour toutes les cles (c'est un peu violent !)
953
+    // c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
954
+    if (strpos(implode('', array_keys($retour)), '.') !== false) {
955
+        foreach ($retour as $cle => $val) {
956
+            if (($pos = strpos($cle, '.')) !== false) {
957
+                $retour[substr($cle, $pos + 1)] = &$retour[$cle];
958
+                unset($retour[$cle]);
959
+            }
960
+        }
961
+    }
962 962
 
963
-	return $retour;
963
+    return $retour;
964 964
 }
965 965
 
966 966
 /**
@@ -973,8 +973,8 @@  discard block
 block discarded – undo
973 973
  * @return bool True si déplacement réussi, false sinon.
974 974
  **/
975 975
 function spip_sqlite_seek($r, $row_number, $serveur = '', $requeter = true) {
976
-	// encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
977
-	return false;
976
+    // encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
977
+    return false;
978 978
 }
979 979
 
980 980
 
@@ -990,10 +990,10 @@  discard block
 block discarded – undo
990 990
  * @return bool                True si réussi
991 991
  */
992 992
 function spip_sqlite_free(&$r, $serveur = '', $requeter = true) {
993
-	unset($r);
993
+    unset($r);
994 994
 
995
-	return true;
996
-	//return sqlite_free_result($r);
995
+    return true;
996
+    //return sqlite_free_result($r);
997 997
 }
998 998
 
999 999
 
@@ -1008,8 +1008,8 @@  discard block
 block discarded – undo
1008 1008
  * @return void
1009 1009
  */
1010 1010
 function spip_sqlite_get_charset($charset = [], $serveur = '', $requeter = true) {
1011
-	//$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1012
-	//return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1011
+    //$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1012
+    //return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1013 1013
 }
1014 1014
 
1015 1015
 
@@ -1024,7 +1024,7 @@  discard block
 block discarded – undo
1024 1024
  *     Valeur hexadécimale pour SQLite
1025 1025
  **/
1026 1026
 function spip_sqlite_hex($v) {
1027
-	return hexdec($v);
1027
+    return hexdec($v);
1028 1028
 }
1029 1029
 
1030 1030
 
@@ -1046,7 +1046,7 @@  discard block
 block discarded – undo
1046 1046
  *     Expression de requête SQL
1047 1047
  **/
1048 1048
 function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) {
1049
-	return "($val $not IN ($valeurs))";
1049
+    return "($val $not IN ($valeurs))";
1050 1050
 }
1051 1051
 
1052 1052
 
@@ -1074,20 +1074,20 @@  discard block
 block discarded – undo
1074 1074
  **/
1075 1075
 function spip_sqlite_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true) {
1076 1076
 
1077
-	$query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1078
-	if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1079
-		if (!$requeter) {
1080
-			return $r;
1081
-		}
1082
-		$nb = spip_sqlite::last_insert_id($serveur);
1083
-	} else {
1084
-		$nb = false;
1085
-	}
1077
+    $query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1078
+    if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1079
+        if (!$requeter) {
1080
+            return $r;
1081
+        }
1082
+        $nb = spip_sqlite::last_insert_id($serveur);
1083
+    } else {
1084
+        $nb = false;
1085
+    }
1086 1086
 
1087
-	$err = spip_sqlite_error($query, $serveur);
1087
+    $err = spip_sqlite_error($query, $serveur);
1088 1088
 
1089
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1090
-	return isset($_GET['var_profile']) ? $r : $nb;
1089
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1090
+    return isset($_GET['var_profile']) ? $r : $nb;
1091 1091
 }
1092 1092
 
1093 1093
 
@@ -1112,28 +1112,28 @@  discard block
 block discarded – undo
1112 1112
  *     - Tableau de description de la requête et du temps d'exécution, si var_profile activé
1113 1113
  **/
1114 1114
 function spip_sqlite_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true) {
1115
-	if (!$desc) {
1116
-		$desc = description_table($table, $serveur);
1117
-	}
1118
-	if (!$desc) {
1119
-		die("$table insertion sans description");
1120
-	}
1121
-	$fields = isset($desc['field']) ? $desc['field'] : [];
1115
+    if (!$desc) {
1116
+        $desc = description_table($table, $serveur);
1117
+    }
1118
+    if (!$desc) {
1119
+        die("$table insertion sans description");
1120
+    }
1121
+    $fields = isset($desc['field']) ? $desc['field'] : [];
1122 1122
 
1123
-	foreach ($couples as $champ => $val) {
1124
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1125
-	}
1123
+    foreach ($couples as $champ => $val) {
1124
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1125
+    }
1126 1126
 
1127
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1128
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1127
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1128
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1129 1129
 
1130
-	$cles = $valeurs = '';
1131
-	if (count($couples)) {
1132
-		$cles = '(' . join(',', array_keys($couples)) . ')';
1133
-		$valeurs = '(' . join(',', $couples) . ')';
1134
-	}
1130
+    $cles = $valeurs = '';
1131
+    if (count($couples)) {
1132
+        $cles = '(' . join(',', array_keys($couples)) . ')';
1133
+        $valeurs = '(' . join(',', $couples) . ')';
1134
+    }
1135 1135
 
1136
-	return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1136
+    return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1137 1137
 }
1138 1138
 
1139 1139
 
@@ -1157,70 +1157,70 @@  discard block
 block discarded – undo
1157 1157
  *     - False en cas d'erreur.
1158 1158
  **/
1159 1159
 function spip_sqlite_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true) {
1160
-	if (!$desc) {
1161
-		$desc = description_table($table, $serveur);
1162
-	}
1163
-	if (!$desc) {
1164
-		die("$table insertion sans description");
1165
-	}
1166
-	if (!isset($desc['field'])) {
1167
-		$desc['field'] = [];
1168
-	}
1169
-
1170
-	// recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1171
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1172
-
1173
-	// seul le nom de la table est a traduire ici :
1174
-	// le faire une seule fois au debut
1175
-	$query_start = "INSERT INTO $table ";
1176
-	$query_start = spip_sqlite::traduire_requete($query_start, $serveur);
1177
-
1178
-	// ouvrir une transaction
1179
-	if ($requeter) {
1180
-		spip_sqlite::demarrer_transaction($serveur);
1181
-	}
1182
-
1183
-	while ($couples = array_shift($tab_couples)) {
1184
-		foreach ($couples as $champ => $val) {
1185
-			$couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1186
-		}
1187
-
1188
-		// inserer les champs timestamp par defaut
1189
-		$couples = array_merge($maj, $couples);
1190
-
1191
-		$champs = $valeurs = '';
1192
-		if (count($couples)) {
1193
-			$champs = '(' . join(',', array_keys($couples)) . ')';
1194
-			$valeurs = '(' . join(',', $couples) . ')';
1195
-			$query = $query_start . "$champs VALUES $valeurs";
1196
-		} else {
1197
-			$query = $query_start . 'DEFAULT VALUES';
1198
-		}
1199
-
1200
-		if ($requeter) {
1201
-			$retour = spip_sqlite::executer_requete($query, $serveur);
1202
-		}
1203
-
1204
-		// sur le dernier couple uniquement
1205
-		if (!count($tab_couples)) {
1206
-			$nb = 0;
1207
-			if ($requeter) {
1208
-				$nb = spip_sqlite::last_insert_id($serveur);
1209
-			} else {
1210
-				return $query;
1211
-			}
1212
-		}
1213
-
1214
-		$err = spip_sqlite_error($query, $serveur);
1215
-	}
1216
-
1217
-	if ($requeter) {
1218
-		spip_sqlite::finir_transaction($serveur);
1219
-	}
1220
-
1221
-	// renvoie le dernier id d'autoincrement ajoute
1222
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1223
-	return isset($_GET['var_profile']) ? $retour : $nb;
1160
+    if (!$desc) {
1161
+        $desc = description_table($table, $serveur);
1162
+    }
1163
+    if (!$desc) {
1164
+        die("$table insertion sans description");
1165
+    }
1166
+    if (!isset($desc['field'])) {
1167
+        $desc['field'] = [];
1168
+    }
1169
+
1170
+    // recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1171
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1172
+
1173
+    // seul le nom de la table est a traduire ici :
1174
+    // le faire une seule fois au debut
1175
+    $query_start = "INSERT INTO $table ";
1176
+    $query_start = spip_sqlite::traduire_requete($query_start, $serveur);
1177
+
1178
+    // ouvrir une transaction
1179
+    if ($requeter) {
1180
+        spip_sqlite::demarrer_transaction($serveur);
1181
+    }
1182
+
1183
+    while ($couples = array_shift($tab_couples)) {
1184
+        foreach ($couples as $champ => $val) {
1185
+            $couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1186
+        }
1187
+
1188
+        // inserer les champs timestamp par defaut
1189
+        $couples = array_merge($maj, $couples);
1190
+
1191
+        $champs = $valeurs = '';
1192
+        if (count($couples)) {
1193
+            $champs = '(' . join(',', array_keys($couples)) . ')';
1194
+            $valeurs = '(' . join(',', $couples) . ')';
1195
+            $query = $query_start . "$champs VALUES $valeurs";
1196
+        } else {
1197
+            $query = $query_start . 'DEFAULT VALUES';
1198
+        }
1199
+
1200
+        if ($requeter) {
1201
+            $retour = spip_sqlite::executer_requete($query, $serveur);
1202
+        }
1203
+
1204
+        // sur le dernier couple uniquement
1205
+        if (!count($tab_couples)) {
1206
+            $nb = 0;
1207
+            if ($requeter) {
1208
+                $nb = spip_sqlite::last_insert_id($serveur);
1209
+            } else {
1210
+                return $query;
1211
+            }
1212
+        }
1213
+
1214
+        $err = spip_sqlite_error($query, $serveur);
1215
+    }
1216
+
1217
+    if ($requeter) {
1218
+        spip_sqlite::finir_transaction($serveur);
1219
+    }
1220
+
1221
+    // renvoie le dernier id d'autoincrement ajoute
1222
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1223
+    return isset($_GET['var_profile']) ? $retour : $nb;
1224 1224
 }
1225 1225
 
1226 1226
 
@@ -1235,7 +1235,7 @@  discard block
 block discarded – undo
1235 1235
  *     Toujours true.
1236 1236
  **/
1237 1237
 function spip_sqlite_preferer_transaction($serveur = '', $requeter = true) {
1238
-	return true;
1238
+    return true;
1239 1239
 }
1240 1240
 
1241 1241
 /**
@@ -1252,12 +1252,12 @@  discard block
 block discarded – undo
1252 1252
  *     string si texte de la requête demandé, true sinon
1253 1253
  **/
1254 1254
 function spip_sqlite_demarrer_transaction($serveur = '', $requeter = true) {
1255
-	if (!$requeter) {
1256
-		return 'BEGIN TRANSACTION';
1257
-	}
1258
-	spip_sqlite::demarrer_transaction($serveur);
1255
+    if (!$requeter) {
1256
+        return 'BEGIN TRANSACTION';
1257
+    }
1258
+    spip_sqlite::demarrer_transaction($serveur);
1259 1259
 
1260
-	return true;
1260
+    return true;
1261 1261
 }
1262 1262
 
1263 1263
 /**
@@ -1271,12 +1271,12 @@  discard block
 block discarded – undo
1271 1271
  *     string si texte de la requête demandé, true sinon
1272 1272
  **/
1273 1273
 function spip_sqlite_terminer_transaction($serveur = '', $requeter = true) {
1274
-	if (!$requeter) {
1275
-		return 'COMMIT';
1276
-	}
1277
-	spip_sqlite::finir_transaction($serveur);
1274
+    if (!$requeter) {
1275
+        return 'COMMIT';
1276
+    }
1277
+    spip_sqlite::finir_transaction($serveur);
1278 1278
 
1279
-	return true;
1279
+    return true;
1280 1280
 }
1281 1281
 
1282 1282
 
@@ -1291,27 +1291,27 @@  discard block
 block discarded – undo
1291 1291
  *     Liste des noms de bases
1292 1292
  **/
1293 1293
 function spip_sqlite_listdbs($serveur = '', $requeter = true) {
1294
-	_sqlite_init();
1294
+    _sqlite_init();
1295 1295
 
1296
-	if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1297
-		return [];
1298
-	}
1296
+    if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1297
+        return [];
1298
+    }
1299 1299
 
1300
-	include_spip('inc/flock');
1301
-	$bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1302
-	$bds = [];
1300
+    include_spip('inc/flock');
1301
+    $bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1302
+    $bds = [];
1303 1303
 
1304
-	foreach ($bases as $b) {
1305
-		// pas de bases commencant pas sqlite
1306
-		// (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1307
-		// les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1308
-		if (strpos($b, '_sqlite')) {
1309
-			continue;
1310
-		}
1311
-		$bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1312
-	}
1304
+    foreach ($bases as $b) {
1305
+        // pas de bases commencant pas sqlite
1306
+        // (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1307
+        // les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1308
+        if (strpos($b, '_sqlite')) {
1309
+            continue;
1310
+        }
1311
+        $bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1312
+    }
1313 1313
 
1314
-	return $bds;
1314
+    return $bds;
1315 1315
 }
1316 1316
 
1317 1317
 
@@ -1326,9 +1326,9 @@  discard block
 block discarded – undo
1326 1326
  * @return string       Texte de sélection pour la requête
1327 1327
  */
1328 1328
 function spip_sqlite_multi($objet, $lang) {
1329
-	$r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1329
+    $r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1330 1330
 
1331
-	return $r;
1331
+    return $r;
1332 1332
 }
1333 1333
 
1334 1334
 
@@ -1345,15 +1345,15 @@  discard block
 block discarded – undo
1345 1345
  * @return bool|string true / false / requete
1346 1346
  **/
1347 1347
 function spip_sqlite_optimize($table, $serveur = '', $requeter = true) {
1348
-	static $do = false;
1349
-	if ($requeter and $do) {
1350
-		return true;
1351
-	}
1352
-	if ($requeter) {
1353
-		$do = true;
1354
-	}
1348
+    static $do = false;
1349
+    if ($requeter and $do) {
1350
+        return true;
1351
+    }
1352
+    if ($requeter) {
1353
+        $do = true;
1354
+    }
1355 1355
 
1356
-	return spip_sqlite_query('VACUUM', $serveur, $requeter);
1356
+    return spip_sqlite_query('VACUUM', $serveur, $requeter);
1357 1357
 }
1358 1358
 
1359 1359
 
@@ -1370,15 +1370,15 @@  discard block
 block discarded – undo
1370 1370
  *    Donnée prête à être utilisée par le gestionnaire SQL
1371 1371
  */
1372 1372
 function spip_sqlite_quote($v, $type = '') {
1373
-	if (!is_array($v)) {
1374
-		return _sqlite_calculer_cite($v, $type);
1375
-	}
1376
-	// si c'est un tableau, le parcourir en propageant le type
1377
-	foreach ($v as $k => $r) {
1378
-		$v[$k] = spip_sqlite_quote($r, $type);
1379
-	}
1373
+    if (!is_array($v)) {
1374
+        return _sqlite_calculer_cite($v, $type);
1375
+    }
1376
+    // si c'est un tableau, le parcourir en propageant le type
1377
+    foreach ($v as $k => $r) {
1378
+        $v[$k] = spip_sqlite_quote($r, $type);
1379
+    }
1380 1380
 
1381
-	return join(',', $v);
1381
+    return join(',', $v);
1382 1382
 }
1383 1383
 
1384 1384
 
@@ -1395,9 +1395,9 @@  discard block
 block discarded – undo
1395 1395
  *     Expression SQL
1396 1396
  **/
1397 1397
 function spip_sqlite_date_proche($champ, $interval, $unite) {
1398
-	$op = (($interval <= 0) ? '>' : '<');
1398
+    $op = (($interval <= 0) ? '>' : '<');
1399 1399
 
1400
-	return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1400
+    return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1401 1401
 }
1402 1402
 
1403 1403
 
@@ -1415,48 +1415,48 @@  discard block
 block discarded – undo
1415 1415
  *     l'état de la table après la réparation
1416 1416
  */
1417 1417
 function spip_sqlite_repair($table, $serveur = '', $requeter = true) {
1418
-	if (
1419
-		$desc = spip_sqlite_showtable($table, $serveur)
1420
-		and isset($desc['field'])
1421
-		and is_array($desc['field'])
1422
-	) {
1423
-		foreach ($desc['field'] as $c => $d) {
1424
-			if (
1425
-				preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d)
1426
-				and stripos($d, 'NOT NULL') !== false
1427
-				and stripos($d, 'DEFAULT') === false
1428
-				/* pas touche aux cles primaires */
1429
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1430
-			) {
1431
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1432
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1433
-			}
1434
-			if (
1435
-				preg_match(',^(INTEGER),i', $d)
1436
-				and stripos($d, 'NOT NULL') !== false
1437
-				and stripos($d, 'DEFAULT') === false
1438
-				/* pas touche aux cles primaires */
1439
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1440
-			) {
1441
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1442
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1443
-			}
1444
-			if (
1445
-				preg_match(',^(datetime),i', $d)
1446
-				and stripos($d, 'NOT NULL') !== false
1447
-				and stripos($d, 'DEFAULT') === false
1448
-				/* pas touche aux cles primaires */
1449
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1450
-			) {
1451
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1452
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1453
-			}
1454
-		}
1455
-
1456
-		return [' OK '];
1457
-	}
1458
-
1459
-	return [' ERROR '];
1418
+    if (
1419
+        $desc = spip_sqlite_showtable($table, $serveur)
1420
+        and isset($desc['field'])
1421
+        and is_array($desc['field'])
1422
+    ) {
1423
+        foreach ($desc['field'] as $c => $d) {
1424
+            if (
1425
+                preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d)
1426
+                and stripos($d, 'NOT NULL') !== false
1427
+                and stripos($d, 'DEFAULT') === false
1428
+                /* pas touche aux cles primaires */
1429
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1430
+            ) {
1431
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1432
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1433
+            }
1434
+            if (
1435
+                preg_match(',^(INTEGER),i', $d)
1436
+                and stripos($d, 'NOT NULL') !== false
1437
+                and stripos($d, 'DEFAULT') === false
1438
+                /* pas touche aux cles primaires */
1439
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1440
+            ) {
1441
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1442
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1443
+            }
1444
+            if (
1445
+                preg_match(',^(datetime),i', $d)
1446
+                and stripos($d, 'NOT NULL') !== false
1447
+                and stripos($d, 'DEFAULT') === false
1448
+                /* pas touche aux cles primaires */
1449
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1450
+            ) {
1451
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1452
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1453
+            }
1454
+        }
1455
+
1456
+        return [' OK '];
1457
+    }
1458
+
1459
+    return [' ERROR '];
1460 1460
 }
1461 1461
 
1462 1462
 
@@ -1485,25 +1485,25 @@  discard block
 block discarded – undo
1485 1485
  *     - False en cas d'erreur.
1486 1486
  **/
1487 1487
 function spip_sqlite_replace($table, $couples, $desc = [], $serveur = '', $requeter = true) {
1488
-	if (!$desc) {
1489
-		$desc = description_table($table, $serveur);
1490
-	}
1491
-	if (!$desc) {
1492
-		die("$table insertion sans description");
1493
-	}
1494
-	$fields = isset($desc['field']) ? $desc['field'] : [];
1488
+    if (!$desc) {
1489
+        $desc = description_table($table, $serveur);
1490
+    }
1491
+    if (!$desc) {
1492
+        die("$table insertion sans description");
1493
+    }
1494
+    $fields = isset($desc['field']) ? $desc['field'] : [];
1495 1495
 
1496
-	foreach ($couples as $champ => $val) {
1497
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1498
-	}
1496
+    foreach ($couples as $champ => $val) {
1497
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1498
+    }
1499 1499
 
1500
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1501
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1500
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1501
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1502 1502
 
1503
-	return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1504
-		',',
1505
-		$couples
1506
-	) . ')', $serveur);
1503
+    return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1504
+        ',',
1505
+        $couples
1506
+    ) . ')', $serveur);
1507 1507
 }
1508 1508
 
1509 1509
 
@@ -1533,13 +1533,13 @@  discard block
 block discarded – undo
1533 1533
  **/
1534 1534
 function spip_sqlite_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true) {
1535 1535
 
1536
-	// boucler pour trainter chaque requete independemment
1537
-	foreach ($tab_couples as $couples) {
1538
-		$retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1539
-	}
1536
+    // boucler pour trainter chaque requete independemment
1537
+    foreach ($tab_couples as $couples) {
1538
+        $retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1539
+    }
1540 1540
 
1541
-	// renvoie le dernier id
1542
-	return $retour;
1541
+    // renvoie le dernier id
1542
+    return $retour;
1543 1543
 }
1544 1544
 
1545 1545
 
@@ -1566,44 +1566,44 @@  discard block
 block discarded – undo
1566 1566
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
1567 1567
  */
1568 1568
 function spip_sqlite_select(
1569
-	$select,
1570
-	$from,
1571
-	$where = '',
1572
-	$groupby = '',
1573
-	$orderby = '',
1574
-	$limit = '',
1575
-	$having = '',
1576
-	$serveur = '',
1577
-	$requeter = true
1569
+    $select,
1570
+    $from,
1571
+    $where = '',
1572
+    $groupby = '',
1573
+    $orderby = '',
1574
+    $limit = '',
1575
+    $having = '',
1576
+    $serveur = '',
1577
+    $requeter = true
1578 1578
 ) {
1579 1579
 
1580
-	// version() n'est pas connu de sqlite
1581
-	$select = str_replace('version()', 'sqlite_version()', $select);
1580
+    // version() n'est pas connu de sqlite
1581
+    $select = str_replace('version()', 'sqlite_version()', $select);
1582 1582
 
1583
-	// recomposer from
1584
-	$from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1583
+    // recomposer from
1584
+    $from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1585 1585
 
1586
-	$query =
1587
-		_sqlite_calculer_expression('SELECT', $select, ', ')
1588
-		. _sqlite_calculer_expression('FROM', $from, ', ')
1589
-		. _sqlite_calculer_expression('WHERE', $where)
1590
-		. _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1591
-		. _sqlite_calculer_expression('HAVING', $having)
1592
-		. ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1593
-		. ($limit ? "\nLIMIT $limit" : '');
1586
+    $query =
1587
+        _sqlite_calculer_expression('SELECT', $select, ', ')
1588
+        . _sqlite_calculer_expression('FROM', $from, ', ')
1589
+        . _sqlite_calculer_expression('WHERE', $where)
1590
+        . _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1591
+        . _sqlite_calculer_expression('HAVING', $having)
1592
+        . ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1593
+        . ($limit ? "\nLIMIT $limit" : '');
1594 1594
 
1595
-	// dans un select, on doit renvoyer la requête en cas d'erreur
1596
-	$res = spip_sqlite_query($query, $serveur, $requeter);
1597
-	// texte de la requete demande ?
1598
-	if (!$requeter) {
1599
-		return $res;
1600
-	}
1601
-	// erreur survenue ?
1602
-	if ($res === false) {
1603
-		return spip_sqlite::traduire_requete($query, $serveur);
1604
-	}
1595
+    // dans un select, on doit renvoyer la requête en cas d'erreur
1596
+    $res = spip_sqlite_query($query, $serveur, $requeter);
1597
+    // texte de la requete demande ?
1598
+    if (!$requeter) {
1599
+        return $res;
1600
+    }
1601
+    // erreur survenue ?
1602
+    if ($res === false) {
1603
+        return spip_sqlite::traduire_requete($query, $serveur);
1604
+    }
1605 1605
 
1606
-	return $res;
1606
+    return $res;
1607 1607
 }
1608 1608
 
1609 1609
 
@@ -1622,32 +1622,32 @@  discard block
 block discarded – undo
1622 1622
  *     - False en cas d'erreur.
1623 1623
  **/
1624 1624
 function spip_sqlite_selectdb($db, $serveur = '', $requeter = true) {
1625
-	_sqlite_init();
1625
+    _sqlite_init();
1626 1626
 
1627
-	// interdire la creation d'une nouvelle base,
1628
-	// sauf si on est dans l'installation
1629
-	if (
1630
-		!is_file($f = _DIR_DB . $db . '.sqlite')
1631
-		&& (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1632
-	) {
1633
-		spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1627
+    // interdire la creation d'une nouvelle base,
1628
+    // sauf si on est dans l'installation
1629
+    if (
1630
+        !is_file($f = _DIR_DB . $db . '.sqlite')
1631
+        && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1632
+    ) {
1633
+        spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1634 1634
 
1635
-		return false;
1636
-	}
1635
+        return false;
1636
+    }
1637 1637
 
1638
-	// se connecter a la base indiquee
1639
-	// avec les identifiants connus
1640
-	$index = $serveur ? $serveur : 0;
1638
+    // se connecter a la base indiquee
1639
+    // avec les identifiants connus
1640
+    $index = $serveur ? $serveur : 0;
1641 1641
 
1642
-	if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1643
-		if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1644
-			return $db;
1645
-		}
1646
-	} else {
1647
-		spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1642
+    if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1643
+        if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1644
+            return $db;
1645
+        }
1646
+    } else {
1647
+        spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1648 1648
 
1649
-		return false;
1650
-	}
1649
+        return false;
1650
+    }
1651 1651
 }
1652 1652
 
1653 1653
 
@@ -1662,8 +1662,8 @@  discard block
 block discarded – undo
1662 1662
  * @return void
1663 1663
  */
1664 1664
 function spip_sqlite_set_charset($charset, $serveur = '', $requeter = true) {
1665
-	# spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1666
-	# return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1665
+    # spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1666
+    # return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1667 1667
 }
1668 1668
 
1669 1669
 
@@ -1681,24 +1681,24 @@  discard block
 block discarded – undo
1681 1681
  *     Ressource à utiliser avec sql_fetch()
1682 1682
  **/
1683 1683
 function spip_sqlite_showbase($match, $serveur = '', $requeter = true) {
1684
-	// type est le type d'entrée : table / index / view
1685
-	// on ne retourne que les tables (?) et non les vues...
1686
-	# ESCAPE non supporte par les versions sqlite <3
1687
-	#	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1688
-	$match = preg_quote($match);
1689
-	$match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1690
-	$match = str_replace('\\\%', '[[POURCENT]]', $match);
1691
-	$match = str_replace('_', '.', $match);
1692
-	$match = str_replace('%', '.*', $match);
1693
-	$match = str_replace('[[TIRETBAS]]', '_', $match);
1694
-	$match = str_replace('[[POURCENT]]', '%', $match);
1695
-	$match = "^$match$";
1696
-
1697
-	return spip_sqlite_query(
1698
-		"SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1699
-		$serveur,
1700
-		$requeter
1701
-	);
1684
+    // type est le type d'entrée : table / index / view
1685
+    // on ne retourne que les tables (?) et non les vues...
1686
+    # ESCAPE non supporte par les versions sqlite <3
1687
+    #	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1688
+    $match = preg_quote($match);
1689
+    $match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1690
+    $match = str_replace('\\\%', '[[POURCENT]]', $match);
1691
+    $match = str_replace('_', '.', $match);
1692
+    $match = str_replace('%', '.*', $match);
1693
+    $match = str_replace('[[TIRETBAS]]', '_', $match);
1694
+    $match = str_replace('[[POURCENT]]', '%', $match);
1695
+    $match = "^$match$";
1696
+
1697
+    return spip_sqlite_query(
1698
+        "SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1699
+        $serveur,
1700
+        $requeter
1701
+    );
1702 1702
 }
1703 1703
 
1704 1704
 /**
@@ -1716,19 +1716,19 @@  discard block
 block discarded – undo
1716 1716
  *     - string : requete sql, si $requeter = true
1717 1717
  **/
1718 1718
 function spip_sqlite_table_exists(string $table, $serveur = '', $requeter = true) {
1719
-	$r = spip_sqlite_query(
1720
-		'SELECT name FROM sqlite_master WHERE'
1721
-		. ' type=\'table\''
1722
-		. ' AND name=' . spip_sqlite_quote($table, 'string')
1723
-		. ' AND name NOT LIKE \'sqlite_%\'',
1724
-		$serveur,
1725
-		$requeter
1726
-	);
1727
-	if (!$requeter) {
1728
-		return $r;
1729
-	}
1730
-	$res = spip_sqlite_fetch($r);
1731
-	return (bool) $res;
1719
+    $r = spip_sqlite_query(
1720
+        'SELECT name FROM sqlite_master WHERE'
1721
+        . ' type=\'table\''
1722
+        . ' AND name=' . spip_sqlite_quote($table, 'string')
1723
+        . ' AND name NOT LIKE \'sqlite_%\'',
1724
+        $serveur,
1725
+        $requeter
1726
+    );
1727
+    if (!$requeter) {
1728
+        return $r;
1729
+    }
1730
+    $res = spip_sqlite_fetch($r);
1731
+    return (bool) $res;
1732 1732
 }
1733 1733
 
1734 1734
 define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
@@ -1751,129 +1751,129 @@  discard block
 block discarded – undo
1751 1751
  *     - array description de la table sinon
1752 1752
  */
1753 1753
 function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true) {
1754
-	$query =
1755
-		'SELECT sql, type FROM'
1756
-		. ' (SELECT * FROM sqlite_master UNION ALL'
1757
-		. ' SELECT * FROM sqlite_temp_master)'
1758
-		. " WHERE tbl_name LIKE '$nom_table'"
1759
-		. " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1760
-		. ' ORDER BY substr(type,2,1), name';
1761
-
1762
-	$a = spip_sqlite_query($query, $serveur, $requeter);
1763
-	if (!$a) {
1764
-		return '';
1765
-	}
1766
-	if (!$requeter) {
1767
-		return $a;
1768
-	}
1769
-	if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1770
-		return '';
1771
-	}
1772
-	$vue = ($a['type'] == 'view'); // table | vue
1773
-
1774
-	// c'est une table
1775
-	// il faut parser le create
1776
-	if (!$vue) {
1777
-		if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1778
-			return '';
1779
-		} else {
1780
-			$desc = $r[1];
1781
-			// extraction d'une KEY éventuelle en prenant garde de ne pas
1782
-			// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1783
-			if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1784
-				$namedkeys = $r[2];
1785
-				$desc = $r[1];
1786
-			} else {
1787
-				$namedkeys = '';
1788
-			}
1789
-
1790
-			$fields = [];
1791
-			$keys = [];
1792
-
1793
-			// enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1794
-			// par exemple s'il contiennent une virgule.
1795
-			// /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1796
-			list($desc, $echaps) = query_echappe_textes($desc);
1797
-
1798
-			// separer toutes les descriptions de champs, separes par des virgules
1799
-			# /!\ explode peut exploser aussi DECIMAL(10,2) !
1800
-			$k_precedent = null;
1801
-			foreach (explode(',', $desc) as $v) {
1802
-				preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1803
-				// Les cles de champs peuvent etre entourees
1804
-				// de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1805
-				// http://www.sqlite.org/lang_keywords.html
1806
-				$k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1807
-				if ($char = strpbrk($k[0], '\'"[`')) {
1808
-					$k = trim($k, $char);
1809
-					if ($char == '[') {
1810
-						$k = rtrim($k, ']');
1811
-					}
1812
-				}
1813
-				$def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1814
-
1815
-				// rustine pour DECIMAL(10,2)
1816
-				// s'il y a une parenthèse fermante dans la clé
1817
-				// ou dans la définition sans qu'il n'y ait une ouverture avant
1818
-				if (false !== strpos($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1819
-					$fields[$k_precedent] .= ',' . $k . ' ' . $def;
1820
-					continue;
1821
-				}
1822
-
1823
-				// la primary key peut etre dans une des descriptions de champs
1824
-				// et non en fin de table, cas encore decouvert avec Sqlite Manager
1825
-				if (stripos($r[2], 'PRIMARY KEY') !== false) {
1826
-					$keys['PRIMARY KEY'] = $k;
1827
-				}
1828
-
1829
-				$fields[$k] = $def;
1830
-				$k_precedent = $k;
1831
-			}
1832
-			// key inclues dans la requete
1833
-			foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1834
-				if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
1835
-					$k = str_replace('`', '', trim($r[1]));
1836
-					$t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1837
-					if ($k && !isset($keys[$k])) {
1838
-						$keys[$k] = $t;
1839
-					} else {
1840
-						$keys[] = $t;
1841
-					}
1842
-				}
1843
-			}
1844
-			// sinon ajouter les key index
1845
-			$query =
1846
-				'SELECT name,sql FROM'
1847
-				. ' (SELECT * FROM sqlite_master UNION ALL'
1848
-				. ' SELECT * FROM sqlite_temp_master)'
1849
-				. " WHERE tbl_name LIKE '$nom_table'"
1850
-				. " AND type='index' AND name NOT LIKE 'sqlite_%'"
1851
-				. 'ORDER BY substr(type,2,1), name';
1852
-			$a = spip_sqlite_query($query, $serveur, $requeter);
1853
-			while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1854
-				$key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1855
-				$keytype = 'KEY';
1856
-				if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1857
-					$keytype = 'UNIQUE KEY';
1858
-				}
1859
-				$colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1860
-				$keys[$keytype . ' ' . $key] = $colonnes;
1861
-			}
1862
-		}
1863
-	} // c'est une vue, on liste les champs disponibles simplement
1864
-	else {
1865
-		if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1866
-			$fields = [];
1867
-			foreach ($res as $c => $v) {
1868
-				$fields[$c] = '';
1869
-			}
1870
-			$keys = [];
1871
-		} else {
1872
-			return '';
1873
-		}
1874
-	}
1875
-
1876
-	return ['field' => $fields, 'key' => $keys];
1754
+    $query =
1755
+        'SELECT sql, type FROM'
1756
+        . ' (SELECT * FROM sqlite_master UNION ALL'
1757
+        . ' SELECT * FROM sqlite_temp_master)'
1758
+        . " WHERE tbl_name LIKE '$nom_table'"
1759
+        . " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1760
+        . ' ORDER BY substr(type,2,1), name';
1761
+
1762
+    $a = spip_sqlite_query($query, $serveur, $requeter);
1763
+    if (!$a) {
1764
+        return '';
1765
+    }
1766
+    if (!$requeter) {
1767
+        return $a;
1768
+    }
1769
+    if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1770
+        return '';
1771
+    }
1772
+    $vue = ($a['type'] == 'view'); // table | vue
1773
+
1774
+    // c'est une table
1775
+    // il faut parser le create
1776
+    if (!$vue) {
1777
+        if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1778
+            return '';
1779
+        } else {
1780
+            $desc = $r[1];
1781
+            // extraction d'une KEY éventuelle en prenant garde de ne pas
1782
+            // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1783
+            if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1784
+                $namedkeys = $r[2];
1785
+                $desc = $r[1];
1786
+            } else {
1787
+                $namedkeys = '';
1788
+            }
1789
+
1790
+            $fields = [];
1791
+            $keys = [];
1792
+
1793
+            // enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1794
+            // par exemple s'il contiennent une virgule.
1795
+            // /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1796
+            list($desc, $echaps) = query_echappe_textes($desc);
1797
+
1798
+            // separer toutes les descriptions de champs, separes par des virgules
1799
+            # /!\ explode peut exploser aussi DECIMAL(10,2) !
1800
+            $k_precedent = null;
1801
+            foreach (explode(',', $desc) as $v) {
1802
+                preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1803
+                // Les cles de champs peuvent etre entourees
1804
+                // de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1805
+                // http://www.sqlite.org/lang_keywords.html
1806
+                $k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1807
+                if ($char = strpbrk($k[0], '\'"[`')) {
1808
+                    $k = trim($k, $char);
1809
+                    if ($char == '[') {
1810
+                        $k = rtrim($k, ']');
1811
+                    }
1812
+                }
1813
+                $def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1814
+
1815
+                // rustine pour DECIMAL(10,2)
1816
+                // s'il y a une parenthèse fermante dans la clé
1817
+                // ou dans la définition sans qu'il n'y ait une ouverture avant
1818
+                if (false !== strpos($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1819
+                    $fields[$k_precedent] .= ',' . $k . ' ' . $def;
1820
+                    continue;
1821
+                }
1822
+
1823
+                // la primary key peut etre dans une des descriptions de champs
1824
+                // et non en fin de table, cas encore decouvert avec Sqlite Manager
1825
+                if (stripos($r[2], 'PRIMARY KEY') !== false) {
1826
+                    $keys['PRIMARY KEY'] = $k;
1827
+                }
1828
+
1829
+                $fields[$k] = $def;
1830
+                $k_precedent = $k;
1831
+            }
1832
+            // key inclues dans la requete
1833
+            foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1834
+                if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
1835
+                    $k = str_replace('`', '', trim($r[1]));
1836
+                    $t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1837
+                    if ($k && !isset($keys[$k])) {
1838
+                        $keys[$k] = $t;
1839
+                    } else {
1840
+                        $keys[] = $t;
1841
+                    }
1842
+                }
1843
+            }
1844
+            // sinon ajouter les key index
1845
+            $query =
1846
+                'SELECT name,sql FROM'
1847
+                . ' (SELECT * FROM sqlite_master UNION ALL'
1848
+                . ' SELECT * FROM sqlite_temp_master)'
1849
+                . " WHERE tbl_name LIKE '$nom_table'"
1850
+                . " AND type='index' AND name NOT LIKE 'sqlite_%'"
1851
+                . 'ORDER BY substr(type,2,1), name';
1852
+            $a = spip_sqlite_query($query, $serveur, $requeter);
1853
+            while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1854
+                $key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1855
+                $keytype = 'KEY';
1856
+                if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1857
+                    $keytype = 'UNIQUE KEY';
1858
+                }
1859
+                $colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1860
+                $keys[$keytype . ' ' . $key] = $colonnes;
1861
+            }
1862
+        }
1863
+    } // c'est une vue, on liste les champs disponibles simplement
1864
+    else {
1865
+        if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1866
+            $fields = [];
1867
+            foreach ($res as $c => $v) {
1868
+                $fields[$c] = '';
1869
+            }
1870
+            $keys = [];
1871
+        } else {
1872
+            return '';
1873
+        }
1874
+    }
1875
+
1876
+    return ['field' => $fields, 'key' => $keys];
1877 1877
 }
1878 1878
 
1879 1879
 
@@ -1899,22 +1899,22 @@  discard block
 block discarded – undo
1899 1899
  *     - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif
1900 1900
  */
1901 1901
 function spip_sqlite_update($table, $champs, $where = '', $desc = '', $serveur = '', $requeter = true) {
1902
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1903
-	$champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1902
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1903
+    $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1904 1904
 
1905
-	$set = [];
1906
-	foreach ($champs as $champ => $val) {
1907
-		$set[] = $champ . "=$val";
1908
-	}
1909
-	if (!empty($set)) {
1910
-		return spip_sqlite_query(
1911
-			_sqlite_calculer_expression('UPDATE', $table, ',')
1912
-			. _sqlite_calculer_expression('SET', $set, ',')
1913
-			. _sqlite_calculer_expression('WHERE', $where),
1914
-			$serveur,
1915
-			$requeter
1916
-		);
1917
-	}
1905
+    $set = [];
1906
+    foreach ($champs as $champ => $val) {
1907
+        $set[] = $champ . "=$val";
1908
+    }
1909
+    if (!empty($set)) {
1910
+        return spip_sqlite_query(
1911
+            _sqlite_calculer_expression('UPDATE', $table, ',')
1912
+            . _sqlite_calculer_expression('SET', $set, ',')
1913
+            . _sqlite_calculer_expression('WHERE', $where),
1914
+            $serveur,
1915
+            $requeter
1916
+        );
1917
+    }
1918 1918
 }
1919 1919
 
1920 1920
 
@@ -1944,38 +1944,38 @@  discard block
 block discarded – undo
1944 1944
  */
1945 1945
 function spip_sqlite_updateq($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1946 1946
 
1947
-	if (!$champs) {
1948
-		return;
1949
-	}
1950
-	if (!$desc) {
1951
-		$desc = description_table($table, $serveur);
1952
-	}
1953
-	if (!$desc) {
1954
-		die("$table insertion sans description");
1955
-	}
1956
-	$fields = $desc['field'];
1957
-
1958
-	$set = [];
1959
-	foreach ($champs as $champ => $val) {
1960
-		$set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
1961
-	}
1962
-
1963
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1964
-	// attention ils sont deja quotes
1965
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1966
-	foreach ($maj as $champ => $val) {
1967
-		if (!isset($set[$champ])) {
1968
-			$set[$champ] = $champ . '=' . $val;
1969
-		}
1970
-	}
1971
-
1972
-	return spip_sqlite_query(
1973
-		_sqlite_calculer_expression('UPDATE', $table, ',')
1974
-		. _sqlite_calculer_expression('SET', $set, ',')
1975
-		. _sqlite_calculer_expression('WHERE', $where),
1976
-		$serveur,
1977
-		$requeter
1978
-	);
1947
+    if (!$champs) {
1948
+        return;
1949
+    }
1950
+    if (!$desc) {
1951
+        $desc = description_table($table, $serveur);
1952
+    }
1953
+    if (!$desc) {
1954
+        die("$table insertion sans description");
1955
+    }
1956
+    $fields = $desc['field'];
1957
+
1958
+    $set = [];
1959
+    foreach ($champs as $champ => $val) {
1960
+        $set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
1961
+    }
1962
+
1963
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1964
+    // attention ils sont deja quotes
1965
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1966
+    foreach ($maj as $champ => $val) {
1967
+        if (!isset($set[$champ])) {
1968
+            $set[$champ] = $champ . '=' . $val;
1969
+        }
1970
+    }
1971
+
1972
+    return spip_sqlite_query(
1973
+        _sqlite_calculer_expression('UPDATE', $table, ',')
1974
+        . _sqlite_calculer_expression('SET', $set, ',')
1975
+        . _sqlite_calculer_expression('WHERE', $where),
1976
+        $serveur,
1977
+        $requeter
1978
+    );
1979 1979
 }
1980 1980
 
1981 1981
 
@@ -1993,17 +1993,17 @@  discard block
 block discarded – undo
1993 1993
  * @return void
1994 1994
  */
1995 1995
 function _sqlite_init() {
1996
-	if (!defined('_DIR_DB')) {
1997
-		define('_DIR_DB', _DIR_ETC . 'bases/');
1998
-	}
1999
-	if (!defined('_SQLITE_CHMOD')) {
2000
-		define('_SQLITE_CHMOD', _SPIP_CHMOD);
2001
-	}
1996
+    if (!defined('_DIR_DB')) {
1997
+        define('_DIR_DB', _DIR_ETC . 'bases/');
1998
+    }
1999
+    if (!defined('_SQLITE_CHMOD')) {
2000
+        define('_SQLITE_CHMOD', _SPIP_CHMOD);
2001
+    }
2002 2002
 
2003
-	if (!is_dir($d = _DIR_DB)) {
2004
-		include_spip('inc/flock');
2005
-		sous_repertoire($d);
2006
-	}
2003
+    if (!is_dir($d = _DIR_DB)) {
2004
+        include_spip('inc/flock');
2005
+        sous_repertoire($d);
2006
+    }
2007 2007
 }
2008 2008
 
2009 2009
 
@@ -2017,20 +2017,20 @@  discard block
 block discarded – undo
2017 2017
  * @return bool|int
2018 2018
  */
2019 2019
 function _sqlite_is_version($version = '', $link = '', $serveur = '', $requeter = true) {
2020
-	if ($link === '') {
2021
-		$link = _sqlite_link($serveur);
2022
-	}
2023
-	if (!$link) {
2024
-		return false;
2025
-	}
2020
+    if ($link === '') {
2021
+        $link = _sqlite_link($serveur);
2022
+    }
2023
+    if (!$link) {
2024
+        return false;
2025
+    }
2026 2026
 
2027
-	$v = 3;
2027
+    $v = 3;
2028 2028
 
2029
-	if (!$version) {
2030
-		return $v;
2031
-	}
2029
+    if (!$version) {
2030
+        return $v;
2031
+    }
2032 2032
 
2033
-	return ($version == $v);
2033
+    return ($version == $v);
2034 2034
 }
2035 2035
 
2036 2036
 
@@ -2041,9 +2041,9 @@  discard block
 block discarded – undo
2041 2041
  * @return PDO Information de connexion pour SQLite
2042 2042
  */
2043 2043
 function _sqlite_link($serveur = '') {
2044
-	$link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
2044
+    $link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
2045 2045
 
2046
-	return $link;
2046
+    return $link;
2047 2047
 }
2048 2048
 
2049 2049
 
@@ -2058,52 +2058,52 @@  discard block
 block discarded – undo
2058 2058
  * @return string|number     Texte ou nombre échappé
2059 2059
  */
2060 2060
 function _sqlite_calculer_cite($v, $type) {
2061
-	if ($type) {
2062
-		if (
2063
-			is_null($v)
2064
-			and stripos($type, 'NOT NULL') === false
2065
-		) {
2066
-			return 'NULL';
2067
-		} // null php se traduit en NULL SQL
2068
-
2069
-		if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
2070
-			return $v;
2071
-		}
2072
-		if (sql_test_int($type)) {
2073
-			if (is_numeric($v)) {
2074
-				return $v;
2075
-			} elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) == 0) {
2076
-				return hexdec(substr($v, 2));
2077
-			} else {
2078
-				return intval($v);
2079
-			}
2080
-		}
2081
-	} else {
2082
-		// si on ne connait pas le type on le deduit de $v autant que possible
2083
-		if (is_bool($v)) {
2084
-			return strval(intval($v));
2085
-		}
2086
-		elseif (is_numeric($v)) {
2087
-			return strval($v);
2088
-		}
2089
-	}
2090
-
2091
-	// trouver un link sqlite pour faire l'echappement
2092
-	foreach ($GLOBALS['connexions'] as $s) {
2093
-		if (
2094
-			$l = $s['link']
2095
-			and is_object($l)
2096
-			and $l instanceof \PDO
2097
-			and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2098
-		) {
2099
-			return $l->quote($v);
2100
-		}
2101
-	}
2102
-
2103
-	// echapper les ' en ''
2104
-	spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2105
-
2106
-	return ("'" . str_replace("'", "''", $v) . "'");
2061
+    if ($type) {
2062
+        if (
2063
+            is_null($v)
2064
+            and stripos($type, 'NOT NULL') === false
2065
+        ) {
2066
+            return 'NULL';
2067
+        } // null php se traduit en NULL SQL
2068
+
2069
+        if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
2070
+            return $v;
2071
+        }
2072
+        if (sql_test_int($type)) {
2073
+            if (is_numeric($v)) {
2074
+                return $v;
2075
+            } elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) == 0) {
2076
+                return hexdec(substr($v, 2));
2077
+            } else {
2078
+                return intval($v);
2079
+            }
2080
+        }
2081
+    } else {
2082
+        // si on ne connait pas le type on le deduit de $v autant que possible
2083
+        if (is_bool($v)) {
2084
+            return strval(intval($v));
2085
+        }
2086
+        elseif (is_numeric($v)) {
2087
+            return strval($v);
2088
+        }
2089
+    }
2090
+
2091
+    // trouver un link sqlite pour faire l'echappement
2092
+    foreach ($GLOBALS['connexions'] as $s) {
2093
+        if (
2094
+            $l = $s['link']
2095
+            and is_object($l)
2096
+            and $l instanceof \PDO
2097
+            and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2098
+        ) {
2099
+            return $l->quote($v);
2100
+        }
2101
+    }
2102
+
2103
+    // echapper les ' en ''
2104
+    spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2105
+
2106
+    return ("'" . str_replace("'", "''", $v) . "'");
2107 2107
 }
2108 2108
 
2109 2109
 
@@ -2119,21 +2119,21 @@  discard block
 block discarded – undo
2119 2119
  * @return string            Texte de l'expression, une partie donc, du texte la requête.
2120 2120
  */
2121 2121
 function _sqlite_calculer_expression($expression, $v, $join = 'AND') {
2122
-	if (empty($v)) {
2123
-		return '';
2124
-	}
2122
+    if (empty($v)) {
2123
+        return '';
2124
+    }
2125 2125
 
2126
-	$exp = "\n$expression ";
2126
+    $exp = "\n$expression ";
2127 2127
 
2128
-	if (!is_array($v)) {
2129
-		return $exp . $v;
2130
-	} else {
2131
-		if (strtoupper($join) === 'AND') {
2132
-			return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2133
-		} else {
2134
-			return $exp . join($join, $v);
2135
-		}
2136
-	}
2128
+    if (!is_array($v)) {
2129
+        return $exp . $v;
2130
+    } else {
2131
+        if (strtoupper($join) === 'AND') {
2132
+            return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2133
+        } else {
2134
+            return $exp . join($join, $v);
2135
+        }
2136
+    }
2137 2137
 }
2138 2138
 
2139 2139
 
@@ -2149,7 +2149,7 @@  discard block
 block discarded – undo
2149 2149
  * @return string Texte du orderby préparé
2150 2150
  */
2151 2151
 function _sqlite_calculer_order($orderby) {
2152
-	return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
2152
+    return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
2153 2153
 }
2154 2154
 
2155 2155
 
@@ -2160,26 +2160,26 @@  discard block
 block discarded – undo
2160 2160
  * @return string Sélection de colonnes pour une clause SELECT
2161 2161
  */
2162 2162
 function _sqlite_calculer_select_as($args) {
2163
-	$res = '';
2164
-	foreach ($args as $k => $v) {
2165
-		if (substr($k, -1) == '@') {
2166
-			// c'est une jointure qui se refere au from precedent
2167
-			// pas de virgule
2168
-			$res .= '  ' . $v;
2169
-		} else {
2170
-			if (!is_numeric($k)) {
2171
-				$p = strpos($v, ' ');
2172
-				if ($p) {
2173
-					$v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2174
-				} else {
2175
-					$v .= " AS '$k'";
2176
-				}
2177
-			}
2178
-			$res .= ', ' . $v;
2179
-		}
2180
-	}
2181
-
2182
-	return substr($res, 2);
2163
+    $res = '';
2164
+    foreach ($args as $k => $v) {
2165
+        if (substr($k, -1) == '@') {
2166
+            // c'est une jointure qui se refere au from precedent
2167
+            // pas de virgule
2168
+            $res .= '  ' . $v;
2169
+        } else {
2170
+            if (!is_numeric($k)) {
2171
+                $p = strpos($v, ' ');
2172
+                if ($p) {
2173
+                    $v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2174
+                } else {
2175
+                    $v .= " AS '$k'";
2176
+                }
2177
+            }
2178
+            $res .= ', ' . $v;
2179
+        }
2180
+    }
2181
+
2182
+    return substr($res, 2);
2183 2183
 }
2184 2184
 
2185 2185
 
@@ -2202,26 +2202,26 @@  discard block
 block discarded – undo
2202 2202
  *     Contrainte pour clause WHERE
2203 2203
  */
2204 2204
 function _sqlite_calculer_where($v) {
2205
-	if (!is_array($v)) {
2206
-		return $v;
2207
-	}
2208
-
2209
-	$op = array_shift($v);
2210
-	if (!($n = count($v))) {
2211
-		return $op;
2212
-	} else {
2213
-		$arg = _sqlite_calculer_where(array_shift($v));
2214
-		if ($n == 1) {
2215
-			return "$op($arg)";
2216
-		} else {
2217
-			$arg2 = _sqlite_calculer_where(array_shift($v));
2218
-			if ($n == 2) {
2219
-				return "($arg $op $arg2)";
2220
-			} else {
2221
-				return "($arg $op ($arg2) : $v[0])";
2222
-			}
2223
-		}
2224
-	}
2205
+    if (!is_array($v)) {
2206
+        return $v;
2207
+    }
2208
+
2209
+    $op = array_shift($v);
2210
+    if (!($n = count($v))) {
2211
+        return $op;
2212
+    } else {
2213
+        $arg = _sqlite_calculer_where(array_shift($v));
2214
+        if ($n == 1) {
2215
+            return "$op($arg)";
2216
+        } else {
2217
+            $arg2 = _sqlite_calculer_where(array_shift($v));
2218
+            if ($n == 2) {
2219
+                return "($arg $op $arg2)";
2220
+            } else {
2221
+                return "($arg $op ($arg2) : $v[0])";
2222
+            }
2223
+        }
2224
+    }
2225 2225
 }
2226 2226
 
2227 2227
 
@@ -2236,19 +2236,19 @@  discard block
 block discarded – undo
2236 2236
  * @return array|bool
2237 2237
  */
2238 2238
 function _sqlite_charger_version($version = '') {
2239
-	$versions = [];
2239
+    $versions = [];
2240 2240
 
2241
-	// version 3
2242
-	if (!$version || $version == 3) {
2243
-		if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2244
-			$versions[] = 3;
2245
-		}
2246
-	}
2247
-	if ($version) {
2248
-		return in_array($version, $versions);
2249
-	}
2241
+    // version 3
2242
+    if (!$version || $version == 3) {
2243
+        if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2244
+            $versions[] = 3;
2245
+        }
2246
+    }
2247
+    if ($version) {
2248
+        return in_array($version, $versions);
2249
+    }
2250 2250
 
2251
-	return $versions;
2251
+    return $versions;
2252 2252
 }
2253 2253
 
2254 2254
 
@@ -2286,147 +2286,147 @@  discard block
 block discarded – undo
2286 2286
  */
2287 2287
 function _sqlite_modifier_table($table, $colonne, $opt = [], $serveur = '') {
2288 2288
 
2289
-	if (is_array($table)) {
2290
-		$table_destination = reset($table);
2291
-		$table_origine = key($table);
2292
-	} else {
2293
-		$table_origine = $table_destination = $table;
2294
-	}
2295
-	// ne prend actuellement qu'un changement
2296
-	// mais pourra etre adapte pour changer plus qu'une colonne a la fois
2297
-	if (is_array($colonne)) {
2298
-		$colonne_destination = reset($colonne);
2299
-		$colonne_origine = key($colonne);
2300
-	} else {
2301
-		$colonne_origine = $colonne_destination = $colonne;
2302
-	}
2303
-	if (!isset($opt['field'])) {
2304
-		$opt['field'] = [];
2305
-	}
2306
-	if (!isset($opt['key'])) {
2307
-		$opt['key'] = [];
2308
-	}
2309
-
2310
-	// si les noms de tables sont differents, pas besoin de table temporaire
2311
-	// on prendra directement le nom de la future table
2312
-	$meme_table = ($table_origine == $table_destination);
2313
-
2314
-	$def_origine = sql_showtable($table_origine, false, $serveur);
2315
-	if (!$def_origine or !isset($def_origine['field'])) {
2316
-		spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2317
-
2318
-		return false;
2319
-	}
2320
-
2321
-
2322
-	$table_tmp = $table_origine . '_tmp';
2323
-
2324
-	// 1) creer une table temporaire avec les modifications
2325
-	// - DROP : suppression de la colonne
2326
-	// - CHANGE : modification de la colonne
2327
-	// (foreach pour conserver l'ordre des champs)
2328
-
2329
-	// field
2330
-	$fields = [];
2331
-	// pour le INSERT INTO plus loin
2332
-	// stocker la correspondance nouvelles->anciennes colonnes
2333
-	$fields_correspondances = [];
2334
-	foreach ($def_origine['field'] as $c => $d) {
2335
-		if ($colonne_origine && ($c == $colonne_origine)) {
2336
-			// si pas DROP
2337
-			if ($colonne_destination) {
2338
-				$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2339
-				$fields_correspondances[$colonne_destination] = $c;
2340
-			}
2341
-		} else {
2342
-			$fields[$c] = $d;
2343
-			$fields_correspondances[$c] = $c;
2344
-		}
2345
-	}
2346
-	// cas de ADD sqlite2 (ajout du champ en fin de table):
2347
-	if (!$colonne_origine && $colonne_destination) {
2348
-		$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2349
-	}
2350
-
2351
-	// key...
2352
-	$keys = [];
2353
-	foreach ($def_origine['key'] as $c => $d) {
2354
-		$c = str_replace($colonne_origine, $colonne_destination, $c);
2355
-		$d = str_replace($colonne_origine, $colonne_destination, $d);
2356
-		// seulement si on ne supprime pas la colonne !
2357
-		if ($d) {
2358
-			$keys[$c] = $d;
2359
-		}
2360
-	}
2361
-
2362
-	// autres keys, on merge
2363
-	$keys = array_merge($keys, $opt['key']);
2364
-	$queries = [];
2365
-
2366
-	// copier dans destination (si differente de origine), sinon tmp
2367
-	$table_copie = ($meme_table) ? $table_tmp : $table_destination;
2368
-	$autoinc = (isset($keys['PRIMARY KEY'])
2369
-		and $keys['PRIMARY KEY']
2370
-		and stripos($keys['PRIMARY KEY'], ',') === false
2371
-		and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2372
-
2373
-	if (
2374
-		$q = _sqlite_requete_create(
2375
-			$table_copie,
2376
-			$fields,
2377
-			$keys,
2378
-			$autoinc,
2379
-			$temporary = false,
2380
-			$ifnotexists = true,
2381
-			$serveur
2382
-		)
2383
-	) {
2384
-		$queries[] = $q;
2385
-	}
2386
-
2387
-
2388
-	// 2) y copier les champs qui vont bien
2389
-	$champs_dest = join(', ', array_keys($fields_correspondances));
2390
-	$champs_ori = join(', ', $fields_correspondances);
2391
-	$queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2392
-
2393
-	// 3) supprimer la table d'origine
2394
-	$queries[] = "DROP TABLE $table_origine";
2395
-
2396
-	// 4) renommer la table temporaire
2397
-	// avec le nom de la table destination
2398
-	// si necessaire
2399
-	if ($meme_table) {
2400
-		$queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2401
-	}
2402
-
2403
-	// 5) remettre les index !
2404
-	foreach ($keys as $k => $v) {
2405
-		if ($k == 'PRIMARY KEY') {
2406
-		} else {
2407
-			// enlever KEY
2408
-			$k = substr($k, 4);
2409
-			$queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2410
-		}
2411
-	}
2412
-
2413
-
2414
-	if (count($queries)) {
2415
-		spip_sqlite::demarrer_transaction($serveur);
2416
-		// il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2417
-		foreach ($queries as $q) {
2418
-			if (!spip_sqlite::executer_requete($q, $serveur)) {
2419
-				spip_log('SQLite : ALTER TABLE table :'
2420
-					. " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2421
-				spip_sqlite::annuler_transaction($serveur);
2422
-
2423
-				return false;
2424
-			}
2425
-		}
2426
-		spip_sqlite::finir_transaction($serveur);
2427
-	}
2428
-
2429
-	return true;
2289
+    if (is_array($table)) {
2290
+        $table_destination = reset($table);
2291
+        $table_origine = key($table);
2292
+    } else {
2293
+        $table_origine = $table_destination = $table;
2294
+    }
2295
+    // ne prend actuellement qu'un changement
2296
+    // mais pourra etre adapte pour changer plus qu'une colonne a la fois
2297
+    if (is_array($colonne)) {
2298
+        $colonne_destination = reset($colonne);
2299
+        $colonne_origine = key($colonne);
2300
+    } else {
2301
+        $colonne_origine = $colonne_destination = $colonne;
2302
+    }
2303
+    if (!isset($opt['field'])) {
2304
+        $opt['field'] = [];
2305
+    }
2306
+    if (!isset($opt['key'])) {
2307
+        $opt['key'] = [];
2308
+    }
2309
+
2310
+    // si les noms de tables sont differents, pas besoin de table temporaire
2311
+    // on prendra directement le nom de la future table
2312
+    $meme_table = ($table_origine == $table_destination);
2313
+
2314
+    $def_origine = sql_showtable($table_origine, false, $serveur);
2315
+    if (!$def_origine or !isset($def_origine['field'])) {
2316
+        spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2317
+
2318
+        return false;
2319
+    }
2320
+
2321
+
2322
+    $table_tmp = $table_origine . '_tmp';
2323
+
2324
+    // 1) creer une table temporaire avec les modifications
2325
+    // - DROP : suppression de la colonne
2326
+    // - CHANGE : modification de la colonne
2327
+    // (foreach pour conserver l'ordre des champs)
2328
+
2329
+    // field
2330
+    $fields = [];
2331
+    // pour le INSERT INTO plus loin
2332
+    // stocker la correspondance nouvelles->anciennes colonnes
2333
+    $fields_correspondances = [];
2334
+    foreach ($def_origine['field'] as $c => $d) {
2335
+        if ($colonne_origine && ($c == $colonne_origine)) {
2336
+            // si pas DROP
2337
+            if ($colonne_destination) {
2338
+                $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2339
+                $fields_correspondances[$colonne_destination] = $c;
2340
+            }
2341
+        } else {
2342
+            $fields[$c] = $d;
2343
+            $fields_correspondances[$c] = $c;
2344
+        }
2345
+    }
2346
+    // cas de ADD sqlite2 (ajout du champ en fin de table):
2347
+    if (!$colonne_origine && $colonne_destination) {
2348
+        $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2349
+    }
2350
+
2351
+    // key...
2352
+    $keys = [];
2353
+    foreach ($def_origine['key'] as $c => $d) {
2354
+        $c = str_replace($colonne_origine, $colonne_destination, $c);
2355
+        $d = str_replace($colonne_origine, $colonne_destination, $d);
2356
+        // seulement si on ne supprime pas la colonne !
2357
+        if ($d) {
2358
+            $keys[$c] = $d;
2359
+        }
2360
+    }
2361
+
2362
+    // autres keys, on merge
2363
+    $keys = array_merge($keys, $opt['key']);
2364
+    $queries = [];
2365
+
2366
+    // copier dans destination (si differente de origine), sinon tmp
2367
+    $table_copie = ($meme_table) ? $table_tmp : $table_destination;
2368
+    $autoinc = (isset($keys['PRIMARY KEY'])
2369
+        and $keys['PRIMARY KEY']
2370
+        and stripos($keys['PRIMARY KEY'], ',') === false
2371
+        and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2372
+
2373
+    if (
2374
+        $q = _sqlite_requete_create(
2375
+            $table_copie,
2376
+            $fields,
2377
+            $keys,
2378
+            $autoinc,
2379
+            $temporary = false,
2380
+            $ifnotexists = true,
2381
+            $serveur
2382
+        )
2383
+    ) {
2384
+        $queries[] = $q;
2385
+    }
2386
+
2387
+
2388
+    // 2) y copier les champs qui vont bien
2389
+    $champs_dest = join(', ', array_keys($fields_correspondances));
2390
+    $champs_ori = join(', ', $fields_correspondances);
2391
+    $queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2392
+
2393
+    // 3) supprimer la table d'origine
2394
+    $queries[] = "DROP TABLE $table_origine";
2395
+
2396
+    // 4) renommer la table temporaire
2397
+    // avec le nom de la table destination
2398
+    // si necessaire
2399
+    if ($meme_table) {
2400
+        $queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2401
+    }
2402
+
2403
+    // 5) remettre les index !
2404
+    foreach ($keys as $k => $v) {
2405
+        if ($k == 'PRIMARY KEY') {
2406
+        } else {
2407
+            // enlever KEY
2408
+            $k = substr($k, 4);
2409
+            $queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2410
+        }
2411
+    }
2412
+
2413
+
2414
+    if (count($queries)) {
2415
+        spip_sqlite::demarrer_transaction($serveur);
2416
+        // il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2417
+        foreach ($queries as $q) {
2418
+            if (!spip_sqlite::executer_requete($q, $serveur)) {
2419
+                spip_log('SQLite : ALTER TABLE table :'
2420
+                    . " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2421
+                spip_sqlite::annuler_transaction($serveur);
2422
+
2423
+                return false;
2424
+            }
2425
+        }
2426
+        spip_sqlite::finir_transaction($serveur);
2427
+    }
2428
+
2429
+    return true;
2430 2430
 }
2431 2431
 
2432 2432
 
@@ -2436,61 +2436,61 @@  discard block
 block discarded – undo
2436 2436
  * @return array
2437 2437
  */
2438 2438
 function _sqlite_ref_fonctions() {
2439
-	$fonctions = [
2440
-		'alter' => 'spip_sqlite_alter',
2441
-		'count' => 'spip_sqlite_count',
2442
-		'countsel' => 'spip_sqlite_countsel',
2443
-		'create' => 'spip_sqlite_create',
2444
-		'create_base' => 'spip_sqlite_create_base',
2445
-		'create_view' => 'spip_sqlite_create_view',
2446
-		'date_proche' => 'spip_sqlite_date_proche',
2447
-		'delete' => 'spip_sqlite_delete',
2448
-		'drop_table' => 'spip_sqlite_drop_table',
2449
-		'drop_view' => 'spip_sqlite_drop_view',
2450
-		'errno' => 'spip_sqlite_errno',
2451
-		'error' => 'spip_sqlite_error',
2452
-		'explain' => 'spip_sqlite_explain',
2453
-		'fetch' => 'spip_sqlite_fetch',
2454
-		'seek' => 'spip_sqlite_seek',
2455
-		'free' => 'spip_sqlite_free',
2456
-		'hex' => 'spip_sqlite_hex',
2457
-		'in' => 'spip_sqlite_in',
2458
-		'insert' => 'spip_sqlite_insert',
2459
-		'insertq' => 'spip_sqlite_insertq',
2460
-		'insertq_multi' => 'spip_sqlite_insertq_multi',
2461
-		'listdbs' => 'spip_sqlite_listdbs',
2462
-		'multi' => 'spip_sqlite_multi',
2463
-		'optimize' => 'spip_sqlite_optimize',
2464
-		'query' => 'spip_sqlite_query',
2465
-		'quote' => 'spip_sqlite_quote',
2466
-		'repair' => 'spip_sqlite_repair',
2467
-		'replace' => 'spip_sqlite_replace',
2468
-		'replace_multi' => 'spip_sqlite_replace_multi',
2469
-		'select' => 'spip_sqlite_select',
2470
-		'selectdb' => 'spip_sqlite_selectdb',
2471
-		'set_charset' => 'spip_sqlite_set_charset',
2472
-		'get_charset' => 'spip_sqlite_get_charset',
2473
-		'showbase' => 'spip_sqlite_showbase',
2474
-		'showtable' => 'spip_sqlite_showtable',
2475
-		'table_exists' => 'spip_sqlite_table_exists',
2476
-		'update' => 'spip_sqlite_update',
2477
-		'updateq' => 'spip_sqlite_updateq',
2478
-		'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2479
-		'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2480
-		'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2481
-	];
2482
-
2483
-	// association de chaque nom http d'un charset aux couples sqlite
2484
-	// SQLite supporte utf-8 et utf-16 uniquement.
2485
-	$charsets = [
2486
-		'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2487
-		//'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2488
-		//'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2489
-	];
2490
-
2491
-	$fonctions['charsets'] = $charsets;
2492
-
2493
-	return $fonctions;
2439
+    $fonctions = [
2440
+        'alter' => 'spip_sqlite_alter',
2441
+        'count' => 'spip_sqlite_count',
2442
+        'countsel' => 'spip_sqlite_countsel',
2443
+        'create' => 'spip_sqlite_create',
2444
+        'create_base' => 'spip_sqlite_create_base',
2445
+        'create_view' => 'spip_sqlite_create_view',
2446
+        'date_proche' => 'spip_sqlite_date_proche',
2447
+        'delete' => 'spip_sqlite_delete',
2448
+        'drop_table' => 'spip_sqlite_drop_table',
2449
+        'drop_view' => 'spip_sqlite_drop_view',
2450
+        'errno' => 'spip_sqlite_errno',
2451
+        'error' => 'spip_sqlite_error',
2452
+        'explain' => 'spip_sqlite_explain',
2453
+        'fetch' => 'spip_sqlite_fetch',
2454
+        'seek' => 'spip_sqlite_seek',
2455
+        'free' => 'spip_sqlite_free',
2456
+        'hex' => 'spip_sqlite_hex',
2457
+        'in' => 'spip_sqlite_in',
2458
+        'insert' => 'spip_sqlite_insert',
2459
+        'insertq' => 'spip_sqlite_insertq',
2460
+        'insertq_multi' => 'spip_sqlite_insertq_multi',
2461
+        'listdbs' => 'spip_sqlite_listdbs',
2462
+        'multi' => 'spip_sqlite_multi',
2463
+        'optimize' => 'spip_sqlite_optimize',
2464
+        'query' => 'spip_sqlite_query',
2465
+        'quote' => 'spip_sqlite_quote',
2466
+        'repair' => 'spip_sqlite_repair',
2467
+        'replace' => 'spip_sqlite_replace',
2468
+        'replace_multi' => 'spip_sqlite_replace_multi',
2469
+        'select' => 'spip_sqlite_select',
2470
+        'selectdb' => 'spip_sqlite_selectdb',
2471
+        'set_charset' => 'spip_sqlite_set_charset',
2472
+        'get_charset' => 'spip_sqlite_get_charset',
2473
+        'showbase' => 'spip_sqlite_showbase',
2474
+        'showtable' => 'spip_sqlite_showtable',
2475
+        'table_exists' => 'spip_sqlite_table_exists',
2476
+        'update' => 'spip_sqlite_update',
2477
+        'updateq' => 'spip_sqlite_updateq',
2478
+        'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2479
+        'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2480
+        'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2481
+    ];
2482
+
2483
+    // association de chaque nom http d'un charset aux couples sqlite
2484
+    // SQLite supporte utf-8 et utf-16 uniquement.
2485
+    $charsets = [
2486
+        'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2487
+        //'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2488
+        //'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2489
+    ];
2490
+
2491
+    $fonctions['charsets'] = $charsets;
2492
+
2493
+    return $fonctions;
2494 2494
 }
2495 2495
 
2496 2496
 
@@ -2502,56 +2502,56 @@  discard block
 block discarded – undo
2502 2502
  * @return mixed
2503 2503
  */
2504 2504
 function _sqlite_remplacements_definitions_table($query, $autoinc = false) {
2505
-	// quelques remplacements
2506
-	$num = '(\s*\([0-9]*\))?';
2507
-	$enum = '(\s*\([^\)]*\))?';
2508
-
2509
-	$remplace = [
2510
-		'/enum' . $enum . '/is' => 'VARCHAR(255)',
2511
-		'/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2512
-		'/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2513
-		'/auto_increment/is' => '',
2514
-		'/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2515
-		'/(timestamp .* )ON .*$/is' => '\\1',
2516
-		'/character set \w+/is' => '',
2517
-		'/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2518
-		'/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2519
-		'/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2520
-		'/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2521
-		'/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2522
-	];
2523
-
2524
-	// pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2525
-	$remplace_autocinc = [
2526
-		'/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2527
-	];
2528
-	// pour les int non autoincrement, il faut un DEFAULT
2529
-	$remplace_nonautocinc = [
2530
-		'/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2531
-	];
2532
-
2533
-	if (is_string($query)) {
2534
-		$query = preg_replace(array_keys($remplace), $remplace, $query);
2535
-		if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2536
-			$query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2537
-		} else {
2538
-			$query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2539
-			$query = _sqlite_collate_ci($query);
2540
-		}
2541
-	} elseif (is_array($query)) {
2542
-		foreach ($query as $k => $q) {
2543
-			$ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2544
-			$query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2545
-			if ($ai) {
2546
-				$query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2547
-			} else {
2548
-				$query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2549
-				$query[$k] = _sqlite_collate_ci($query[$k]);
2550
-			}
2551
-		}
2552
-	}
2553
-
2554
-	return $query;
2505
+    // quelques remplacements
2506
+    $num = '(\s*\([0-9]*\))?';
2507
+    $enum = '(\s*\([^\)]*\))?';
2508
+
2509
+    $remplace = [
2510
+        '/enum' . $enum . '/is' => 'VARCHAR(255)',
2511
+        '/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2512
+        '/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2513
+        '/auto_increment/is' => '',
2514
+        '/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2515
+        '/(timestamp .* )ON .*$/is' => '\\1',
2516
+        '/character set \w+/is' => '',
2517
+        '/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2518
+        '/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2519
+        '/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2520
+        '/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2521
+        '/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2522
+    ];
2523
+
2524
+    // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2525
+    $remplace_autocinc = [
2526
+        '/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2527
+    ];
2528
+    // pour les int non autoincrement, il faut un DEFAULT
2529
+    $remplace_nonautocinc = [
2530
+        '/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2531
+    ];
2532
+
2533
+    if (is_string($query)) {
2534
+        $query = preg_replace(array_keys($remplace), $remplace, $query);
2535
+        if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2536
+            $query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2537
+        } else {
2538
+            $query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2539
+            $query = _sqlite_collate_ci($query);
2540
+        }
2541
+    } elseif (is_array($query)) {
2542
+        foreach ($query as $k => $q) {
2543
+            $ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2544
+            $query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2545
+            if ($ai) {
2546
+                $query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2547
+            } else {
2548
+                $query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2549
+                $query[$k] = _sqlite_collate_ci($query[$k]);
2550
+            }
2551
+        }
2552
+    }
2553
+
2554
+    return $query;
2555 2555
 }
2556 2556
 
2557 2557
 /**
@@ -2562,17 +2562,17 @@  discard block
 block discarded – undo
2562 2562
  * @return string
2563 2563
  */
2564 2564
 function _sqlite_collate_ci($champ) {
2565
-	if (stripos($champ, 'COLLATE') !== false) {
2566
-		return $champ;
2567
-	}
2568
-	if (stripos($champ, 'BINARY') !== false) {
2569
-		return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2570
-	}
2571
-	if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2572
-		return $champ . ' COLLATE NOCASE';
2573
-	}
2565
+    if (stripos($champ, 'COLLATE') !== false) {
2566
+        return $champ;
2567
+    }
2568
+    if (stripos($champ, 'BINARY') !== false) {
2569
+        return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2570
+    }
2571
+    if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2572
+        return $champ . ' COLLATE NOCASE';
2573
+    }
2574 2574
 
2575
-	return $champ;
2575
+    return $champ;
2576 2576
 }
2577 2577
 
2578 2578
 
@@ -2591,84 +2591,84 @@  discard block
 block discarded – undo
2591 2591
  * @return bool|string
2592 2592
  */
2593 2593
 function _sqlite_requete_create(
2594
-	$nom,
2595
-	$champs,
2596
-	$cles,
2597
-	$autoinc = false,
2598
-	$temporary = false,
2599
-	$_ifnotexists = true,
2600
-	$serveur = '',
2601
-	$requeter = true
2594
+    $nom,
2595
+    $champs,
2596
+    $cles,
2597
+    $autoinc = false,
2598
+    $temporary = false,
2599
+    $_ifnotexists = true,
2600
+    $serveur = '',
2601
+    $requeter = true
2602 2602
 ) {
2603
-	$query = $keys = $s = $p = '';
2604
-
2605
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
2606
-	// sans les renseigner (laisse le compilo recuperer la description)
2607
-	if (!is_array($champs) || !is_array($cles)) {
2608
-		return;
2609
-	}
2610
-
2611
-	// sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2612
-	// il faut passer par des create index
2613
-	// Il gere par contre primary key !
2614
-	// Soit la PK est definie dans les cles, soit dans un champs
2615
-	// soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2616
-	$pk = 'PRIMARY KEY';
2617
-	// le champ de cle primaire
2618
-	$champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2619
-
2620
-	foreach ($champs as $k => $v) {
2621
-		if (false !== stripos($v, $pk)) {
2622
-			$champ_pk = $k;
2623
-			// on n'en a plus besoin dans field, vu que defini dans key
2624
-			$champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2625
-			break;
2626
-		}
2627
-	}
2628
-
2629
-	if ($champ_pk) {
2630
-		$keys = "\n\t\t$pk ($champ_pk)";
2631
-	}
2632
-	// Pas de DEFAULT 0 sur les cles primaires en auto-increment
2633
-	if (
2634
-		isset($champs[$champ_pk])
2635
-		and stripos($champs[$champ_pk], 'default 0') !== false
2636
-	) {
2637
-		$champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk]));
2638
-	}
2639
-
2640
-	$champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2641
-	foreach ($champs as $k => $v) {
2642
-		$query .= "$s\n\t\t$k $v";
2643
-		$s = ',';
2644
-	}
2645
-
2646
-	$ifnotexists = '';
2647
-	if ($_ifnotexists) {
2648
-		$version = spip_sqlite_fetch(
2649
-			spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2650
-			'',
2651
-			$serveur
2652
-		);
2653
-		if (!function_exists('spip_version_compare')) {
2654
-			include_spip('plugins/installer');
2655
-		}
2656
-
2657
-		if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2658
-			$ifnotexists = ' IF NOT EXISTS';
2659
-		} else {
2660
-			/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2661
-			$a = spip_sqlite_showtable($nom, $serveur);
2662
-			if (isset($a['key']['KEY ' . $nom])) {
2663
-				return true;
2664
-			}
2665
-		}
2666
-	}
2667
-
2668
-	$temporary = $temporary ? ' TEMPORARY' : '';
2669
-	$q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2670
-
2671
-	return $q;
2603
+    $query = $keys = $s = $p = '';
2604
+
2605
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
2606
+    // sans les renseigner (laisse le compilo recuperer la description)
2607
+    if (!is_array($champs) || !is_array($cles)) {
2608
+        return;
2609
+    }
2610
+
2611
+    // sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2612
+    // il faut passer par des create index
2613
+    // Il gere par contre primary key !
2614
+    // Soit la PK est definie dans les cles, soit dans un champs
2615
+    // soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2616
+    $pk = 'PRIMARY KEY';
2617
+    // le champ de cle primaire
2618
+    $champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2619
+
2620
+    foreach ($champs as $k => $v) {
2621
+        if (false !== stripos($v, $pk)) {
2622
+            $champ_pk = $k;
2623
+            // on n'en a plus besoin dans field, vu que defini dans key
2624
+            $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2625
+            break;
2626
+        }
2627
+    }
2628
+
2629
+    if ($champ_pk) {
2630
+        $keys = "\n\t\t$pk ($champ_pk)";
2631
+    }
2632
+    // Pas de DEFAULT 0 sur les cles primaires en auto-increment
2633
+    if (
2634
+        isset($champs[$champ_pk])
2635
+        and stripos($champs[$champ_pk], 'default 0') !== false
2636
+    ) {
2637
+        $champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk]));
2638
+    }
2639
+
2640
+    $champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2641
+    foreach ($champs as $k => $v) {
2642
+        $query .= "$s\n\t\t$k $v";
2643
+        $s = ',';
2644
+    }
2645
+
2646
+    $ifnotexists = '';
2647
+    if ($_ifnotexists) {
2648
+        $version = spip_sqlite_fetch(
2649
+            spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2650
+            '',
2651
+            $serveur
2652
+        );
2653
+        if (!function_exists('spip_version_compare')) {
2654
+            include_spip('plugins/installer');
2655
+        }
2656
+
2657
+        if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2658
+            $ifnotexists = ' IF NOT EXISTS';
2659
+        } else {
2660
+            /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2661
+            $a = spip_sqlite_showtable($nom, $serveur);
2662
+            if (isset($a['key']['KEY ' . $nom])) {
2663
+                return true;
2664
+            }
2665
+        }
2666
+    }
2667
+
2668
+    $temporary = $temporary ? ' TEMPORARY' : '';
2669
+    $q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2670
+
2671
+    return $q;
2672 2672
 }
2673 2673
 
2674 2674
 
@@ -2687,41 +2687,41 @@  discard block
 block discarded – undo
2687 2687
  * @return
2688 2688
  */
2689 2689
 function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '') {
2690
-	static $tables = [];
2691
-
2692
-	if (!isset($tables[$table])) {
2693
-		if (!$desc) {
2694
-			$trouver_table = charger_fonction('trouver_table', 'base');
2695
-			$desc = $trouver_table($table, $serveur);
2696
-			// si pas de description, on ne fait rien, ou on die() ?
2697
-			if (!$desc) {
2698
-				return $couples;
2699
-			}
2700
-		}
2701
-
2702
-		// recherche des champs avec simplement 'TIMESTAMP'
2703
-		// cependant, il faudra peut etre etendre
2704
-		// avec la gestion de DEFAULT et ON UPDATE
2705
-		// mais ceux-ci ne sont pas utilises dans le core
2706
-		$tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2707
-
2708
-		$now = _sqlite_func_now(true);
2709
-		foreach ($desc['field'] as $k => $v) {
2710
-			if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2711
-				$tables[$table]['desc'][$k] = $v;
2712
-				$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2713
-			}
2714
-		}
2715
-	}
2716
-	else {
2717
-		$now = _sqlite_func_now(true);
2718
-		foreach (array_keys($tables[$table]['desc']) as $k) {
2719
-			$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2720
-		}
2721
-	}
2722
-
2723
-	// ajout des champs type 'timestamp' absents
2724
-	return array_merge($tables[$table]['valeur'], $couples);
2690
+    static $tables = [];
2691
+
2692
+    if (!isset($tables[$table])) {
2693
+        if (!$desc) {
2694
+            $trouver_table = charger_fonction('trouver_table', 'base');
2695
+            $desc = $trouver_table($table, $serveur);
2696
+            // si pas de description, on ne fait rien, ou on die() ?
2697
+            if (!$desc) {
2698
+                return $couples;
2699
+            }
2700
+        }
2701
+
2702
+        // recherche des champs avec simplement 'TIMESTAMP'
2703
+        // cependant, il faudra peut etre etendre
2704
+        // avec la gestion de DEFAULT et ON UPDATE
2705
+        // mais ceux-ci ne sont pas utilises dans le core
2706
+        $tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2707
+
2708
+        $now = _sqlite_func_now(true);
2709
+        foreach ($desc['field'] as $k => $v) {
2710
+            if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2711
+                $tables[$table]['desc'][$k] = $v;
2712
+                $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2713
+            }
2714
+        }
2715
+    }
2716
+    else {
2717
+        $now = _sqlite_func_now(true);
2718
+        foreach (array_keys($tables[$table]['desc']) as $k) {
2719
+            $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2720
+        }
2721
+    }
2722
+
2723
+    // ajout des champs type 'timestamp' absents
2724
+    return array_merge($tables[$table]['valeur'], $couples);
2725 2725
 }
2726 2726
 
2727 2727
 
@@ -2732,7 +2732,7 @@  discard block
 block discarded – undo
2732 2732
  * @return array|bool
2733 2733
  */
2734 2734
 function spip_versions_sqlite() {
2735
-	return _sqlite_charger_version();
2735
+    return _sqlite_charger_version();
2736 2736
 }
2737 2737
 
2738 2738
 /**
@@ -2740,114 +2740,114 @@  discard block
 block discarded – undo
2740 2740
  * encadrées de transactions.
2741 2741
  **/
2742 2742
 class spip_sqlite {
2743
-	/** @var sqlite_requeteur[] Liste des instances de requêteurs créés */
2744
-	public static $requeteurs = [];
2745
-	/** @var bool[] Pour chaque connexion, flag pour savoir si une transaction est en cours */
2746
-	public static $transaction_en_cours = [];
2747
-
2748
-
2749
-	/**
2750
-	 * Retourne une unique instance du requêteur
2751
-	 *
2752
-	 * Retourne une instance unique du requêteur pour une connexion SQLite
2753
-	 * donnée
2754
-	 *
2755
-	 * @param string $serveur
2756
-	 *    Nom du connecteur
2757
-	 * @return sqlite_requeteur
2758
-	 *    Instance unique du requêteur
2759
-	 **/
2760
-	public static function requeteur($serveur) {
2761
-		if (!isset(spip_sqlite::$requeteurs[$serveur])) {
2762
-			spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur);
2763
-		}
2764
-
2765
-		return spip_sqlite::$requeteurs[$serveur];
2766
-	}
2767
-
2768
-	/**
2769
-	 * Prépare le texte d'une requête avant son exécution
2770
-	 *
2771
-	 * Adapte la requête au format plus ou moins MySQL par un format
2772
-	 * compris de SQLite.
2773
-	 *
2774
-	 * Change les préfixes de tables SPIP par ceux véritables
2775
-	 *
2776
-	 * @param string $query Requête à préparer
2777
-	 * @param string $serveur Nom de la connexion
2778
-	 * @return string           Requête préparée
2779
-	 */
2780
-	public static function traduire_requete($query, $serveur) {
2781
-		$requeteur = spip_sqlite::requeteur($serveur);
2782
-		$traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version);
2783
-
2784
-		return $traducteur->traduire_requete();
2785
-	}
2786
-
2787
-	/**
2788
-	 * Démarre une transaction
2789
-	 *
2790
-	 * @param string $serveur Nom de la connexion
2791
-	 **/
2792
-	public static function demarrer_transaction($serveur) {
2793
-		spip_sqlite::executer_requete('BEGIN TRANSACTION', $serveur);
2794
-		spip_sqlite::$transaction_en_cours[$serveur] = true;
2795
-	}
2796
-
2797
-	/**
2798
-	 * Exécute la requête donnée
2799
-	 *
2800
-	 * @param string $query Requête
2801
-	 * @param string $serveur Nom de la connexion
2802
-	 * @param null|bool $tracer Demander des statistiques (temps) ?
2803
-	 **/
2804
-	public static function executer_requete($query, $serveur, $tracer = null) {
2805
-		$requeteur = spip_sqlite::requeteur($serveur);
2806
-
2807
-		return $requeteur->executer_requete($query, $tracer);
2808
-	}
2809
-
2810
-	/**
2811
-	 * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2812
-	 *
2813
-	 * @param string $serveur Nom de la connexion
2814
-	 * return int                Identifiant
2815
-	 **/
2816
-	public static function last_insert_id($serveur) {
2817
-		$requeteur = spip_sqlite::requeteur($serveur);
2818
-
2819
-		return $requeteur->last_insert_id($serveur);
2820
-	}
2821
-
2822
-	/**
2823
-	 * Annule une transaction
2824
-	 *
2825
-	 * @param string $serveur Nom de la connexion
2826
-	 **/
2827
-	public static function annuler_transaction($serveur) {
2828
-		spip_sqlite::executer_requete('ROLLBACK', $serveur);
2829
-		spip_sqlite::$transaction_en_cours[$serveur] = false;
2830
-	}
2831
-
2832
-	/**
2833
-	 * Termine une transaction
2834
-	 *
2835
-	 * @param string $serveur Nom de la connexion
2836
-	 **/
2837
-	public static function finir_transaction($serveur) {
2838
-		// si pas de transaction en cours, ne rien faire et le dire
2839
-		if (
2840
-			!isset(spip_sqlite::$transaction_en_cours[$serveur])
2841
-			or spip_sqlite::$transaction_en_cours[$serveur] == false
2842
-		) {
2843
-			return false;
2844
-		}
2845
-		// sinon fermer la transaction et retourner true
2846
-		spip_sqlite::executer_requete('COMMIT', $serveur);
2847
-		spip_sqlite::$transaction_en_cours[$serveur] = false;
2848
-
2849
-		return true;
2850
-	}
2743
+    /** @var sqlite_requeteur[] Liste des instances de requêteurs créés */
2744
+    public static $requeteurs = [];
2745
+    /** @var bool[] Pour chaque connexion, flag pour savoir si une transaction est en cours */
2746
+    public static $transaction_en_cours = [];
2747
+
2748
+
2749
+    /**
2750
+     * Retourne une unique instance du requêteur
2751
+     *
2752
+     * Retourne une instance unique du requêteur pour une connexion SQLite
2753
+     * donnée
2754
+     *
2755
+     * @param string $serveur
2756
+     *    Nom du connecteur
2757
+     * @return sqlite_requeteur
2758
+     *    Instance unique du requêteur
2759
+     **/
2760
+    public static function requeteur($serveur) {
2761
+        if (!isset(spip_sqlite::$requeteurs[$serveur])) {
2762
+            spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur);
2763
+        }
2764
+
2765
+        return spip_sqlite::$requeteurs[$serveur];
2766
+    }
2767
+
2768
+    /**
2769
+     * Prépare le texte d'une requête avant son exécution
2770
+     *
2771
+     * Adapte la requête au format plus ou moins MySQL par un format
2772
+     * compris de SQLite.
2773
+     *
2774
+     * Change les préfixes de tables SPIP par ceux véritables
2775
+     *
2776
+     * @param string $query Requête à préparer
2777
+     * @param string $serveur Nom de la connexion
2778
+     * @return string           Requête préparée
2779
+     */
2780
+    public static function traduire_requete($query, $serveur) {
2781
+        $requeteur = spip_sqlite::requeteur($serveur);
2782
+        $traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version);
2783
+
2784
+        return $traducteur->traduire_requete();
2785
+    }
2786
+
2787
+    /**
2788
+     * Démarre une transaction
2789
+     *
2790
+     * @param string $serveur Nom de la connexion
2791
+     **/
2792
+    public static function demarrer_transaction($serveur) {
2793
+        spip_sqlite::executer_requete('BEGIN TRANSACTION', $serveur);
2794
+        spip_sqlite::$transaction_en_cours[$serveur] = true;
2795
+    }
2796
+
2797
+    /**
2798
+     * Exécute la requête donnée
2799
+     *
2800
+     * @param string $query Requête
2801
+     * @param string $serveur Nom de la connexion
2802
+     * @param null|bool $tracer Demander des statistiques (temps) ?
2803
+     **/
2804
+    public static function executer_requete($query, $serveur, $tracer = null) {
2805
+        $requeteur = spip_sqlite::requeteur($serveur);
2806
+
2807
+        return $requeteur->executer_requete($query, $tracer);
2808
+    }
2809
+
2810
+    /**
2811
+     * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2812
+     *
2813
+     * @param string $serveur Nom de la connexion
2814
+     * return int                Identifiant
2815
+     **/
2816
+    public static function last_insert_id($serveur) {
2817
+        $requeteur = spip_sqlite::requeteur($serveur);
2818
+
2819
+        return $requeteur->last_insert_id($serveur);
2820
+    }
2821
+
2822
+    /**
2823
+     * Annule une transaction
2824
+     *
2825
+     * @param string $serveur Nom de la connexion
2826
+     **/
2827
+    public static function annuler_transaction($serveur) {
2828
+        spip_sqlite::executer_requete('ROLLBACK', $serveur);
2829
+        spip_sqlite::$transaction_en_cours[$serveur] = false;
2830
+    }
2831
+
2832
+    /**
2833
+     * Termine une transaction
2834
+     *
2835
+     * @param string $serveur Nom de la connexion
2836
+     **/
2837
+    public static function finir_transaction($serveur) {
2838
+        // si pas de transaction en cours, ne rien faire et le dire
2839
+        if (
2840
+            !isset(spip_sqlite::$transaction_en_cours[$serveur])
2841
+            or spip_sqlite::$transaction_en_cours[$serveur] == false
2842
+        ) {
2843
+            return false;
2844
+        }
2845
+        // sinon fermer la transaction et retourner true
2846
+        spip_sqlite::executer_requete('COMMIT', $serveur);
2847
+        spip_sqlite::$transaction_en_cours[$serveur] = false;
2848
+
2849
+        return true;
2850
+    }
2851 2851
 }
2852 2852
 
2853 2853
 /*
@@ -2860,127 +2860,127 @@  discard block
 block discarded – undo
2860 2860
  */
2861 2861
 
2862 2862
 class sqlite_requeteur {
2863
-	/** @var string Texte de la requête */
2864
-	public $query = ''; // la requete
2865
-	/** @var string Nom de la connexion */
2866
-	public $serveur = '';
2867
-	/** @var PDO Identifiant de la connexion SQLite */
2868
-	public $link = '';
2869
-	/** @var string Prefixe des tables SPIP */
2870
-	public $prefixe = '';
2871
-	/** @var string Nom de la base de donnée */
2872
-	public $db = '';
2873
-	/** @var bool Doit-on tracer les requetes (var_profile) ? */
2874
-	public $tracer = false; // doit-on tracer les requetes (var_profile)
2875
-
2876
-	/** @var string Version de SQLite (2 ou 3) */
2877
-	public $sqlite_version = '';
2878
-
2879
-	/**
2880
-	 * Constructeur
2881
-	 *
2882
-	 * @param string $serveur
2883
-	 * @return bool
2884
-	 */
2885
-	public function __construct($serveur = '') {
2886
-		_sqlite_init();
2887
-		$this->serveur = strtolower($serveur);
2888
-
2889
-		if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
2890
-			spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR);
2891
-
2892
-			return false;
2893
-		}
2894
-
2895
-		$this->sqlite_version = _sqlite_is_version('', $this->link);
2896
-
2897
-		$this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe'];
2898
-		$this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db'];
2899
-
2900
-		// tracage des requetes ?
2901
-		$this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']);
2902
-	}
2903
-
2904
-	/**
2905
-	 * Lancer la requête transmise et faire le tracage si demandé
2906
-	 *
2907
-	 * @param string $query
2908
-	 *     Requête à exécuter
2909
-	 * @param bool|null $tracer
2910
-	 *     true pour tracer la requête
2911
-	 * @return bool|PDOStatement|array
2912
-	 */
2913
-	public function executer_requete($query, $tracer = null) {
2914
-		if (is_null($tracer)) {
2915
-			$tracer = $this->tracer;
2916
-		}
2917
-		$err = '';
2918
-		$t = 0;
2919
-		if ($tracer or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
2920
-			include_spip('public/tracer');
2921
-			$t = trace_query_start();
2922
-		}
2923
-
2924
-		# spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ?
2925
-		if ($this->link) {
2926
-			// memoriser la derniere erreur PHP vue
2927
-			$last_error = (function_exists('error_get_last') ? error_get_last() : '');
2928
-			$e = null;
2929
-			// sauver la derniere requete
2930
-			$GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query;
2931
-			$GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++;
2932
-
2933
-			try {
2934
-				$r = $this->link->query($query);
2935
-			} catch (\PDOException $e) {
2936
-				spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG);
2937
-				$r = false;
2938
-			}
2939
-			// sauvegarde de la requete (elle y est deja dans $r->queryString)
2940
-			# $r->spipQueryString = $query;
2941
-
2942
-			// comptage : oblige de compter le nombre d'entrees retournees
2943
-			// par une requete SELECT
2944
-			// aucune autre solution ne donne le nombre attendu :( !
2945
-			// particulierement s'il y a des LIMIT dans la requete.
2946
-			if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') {
2947
-				if ($r) {
2948
-					// noter le link et la query pour faire le comptage *si* on en a besoin
2949
-					$r->spipSqliteRowCount = [$this->link, $query];
2950
-				} elseif ($r instanceof PDOStatement) {
2951
-					$r->spipSqliteRowCount = 0;
2952
-				}
2953
-			}
2954
-
2955
-			// loger les warnings/erreurs eventuels de sqlite remontant dans PHP
2956
-			if ($e and $e instanceof \PDOException) {
2957
-				$err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine();
2958
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2959
-			} elseif ($err = (function_exists('error_get_last') ? error_get_last() : '') and $err != $last_error) {
2960
-				$err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line'];
2961
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2962
-			} else {
2963
-				$err = '';
2964
-			}
2965
-		} else {
2966
-			$r = false;
2967
-		}
2968
-
2969
-		if (spip_sqlite_errno($this->serveur)) {
2970
-			$err .= spip_sqlite_error($query, $this->serveur);
2971
-		}
2972
-
2973
-		return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r;
2974
-	}
2975
-
2976
-	/**
2977
-	 * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2978
-	 *
2979
-	 * @return string|false
2980
-	 **/
2981
-	public function last_insert_id() {
2982
-		return $this->link->lastInsertId();
2983
-	}
2863
+    /** @var string Texte de la requête */
2864
+    public $query = ''; // la requete
2865
+    /** @var string Nom de la connexion */
2866
+    public $serveur = '';
2867
+    /** @var PDO Identifiant de la connexion SQLite */
2868
+    public $link = '';
2869
+    /** @var string Prefixe des tables SPIP */
2870
+    public $prefixe = '';
2871
+    /** @var string Nom de la base de donnée */
2872
+    public $db = '';
2873
+    /** @var bool Doit-on tracer les requetes (var_profile) ? */
2874
+    public $tracer = false; // doit-on tracer les requetes (var_profile)
2875
+
2876
+    /** @var string Version de SQLite (2 ou 3) */
2877
+    public $sqlite_version = '';
2878
+
2879
+    /**
2880
+     * Constructeur
2881
+     *
2882
+     * @param string $serveur
2883
+     * @return bool
2884
+     */
2885
+    public function __construct($serveur = '') {
2886
+        _sqlite_init();
2887
+        $this->serveur = strtolower($serveur);
2888
+
2889
+        if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
2890
+            spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR);
2891
+
2892
+            return false;
2893
+        }
2894
+
2895
+        $this->sqlite_version = _sqlite_is_version('', $this->link);
2896
+
2897
+        $this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe'];
2898
+        $this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db'];
2899
+
2900
+        // tracage des requetes ?
2901
+        $this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']);
2902
+    }
2903
+
2904
+    /**
2905
+     * Lancer la requête transmise et faire le tracage si demandé
2906
+     *
2907
+     * @param string $query
2908
+     *     Requête à exécuter
2909
+     * @param bool|null $tracer
2910
+     *     true pour tracer la requête
2911
+     * @return bool|PDOStatement|array
2912
+     */
2913
+    public function executer_requete($query, $tracer = null) {
2914
+        if (is_null($tracer)) {
2915
+            $tracer = $this->tracer;
2916
+        }
2917
+        $err = '';
2918
+        $t = 0;
2919
+        if ($tracer or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
2920
+            include_spip('public/tracer');
2921
+            $t = trace_query_start();
2922
+        }
2923
+
2924
+        # spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ?
2925
+        if ($this->link) {
2926
+            // memoriser la derniere erreur PHP vue
2927
+            $last_error = (function_exists('error_get_last') ? error_get_last() : '');
2928
+            $e = null;
2929
+            // sauver la derniere requete
2930
+            $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query;
2931
+            $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++;
2932
+
2933
+            try {
2934
+                $r = $this->link->query($query);
2935
+            } catch (\PDOException $e) {
2936
+                spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG);
2937
+                $r = false;
2938
+            }
2939
+            // sauvegarde de la requete (elle y est deja dans $r->queryString)
2940
+            # $r->spipQueryString = $query;
2941
+
2942
+            // comptage : oblige de compter le nombre d'entrees retournees
2943
+            // par une requete SELECT
2944
+            // aucune autre solution ne donne le nombre attendu :( !
2945
+            // particulierement s'il y a des LIMIT dans la requete.
2946
+            if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') {
2947
+                if ($r) {
2948
+                    // noter le link et la query pour faire le comptage *si* on en a besoin
2949
+                    $r->spipSqliteRowCount = [$this->link, $query];
2950
+                } elseif ($r instanceof PDOStatement) {
2951
+                    $r->spipSqliteRowCount = 0;
2952
+                }
2953
+            }
2954
+
2955
+            // loger les warnings/erreurs eventuels de sqlite remontant dans PHP
2956
+            if ($e and $e instanceof \PDOException) {
2957
+                $err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine();
2958
+                spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2959
+            } elseif ($err = (function_exists('error_get_last') ? error_get_last() : '') and $err != $last_error) {
2960
+                $err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line'];
2961
+                spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2962
+            } else {
2963
+                $err = '';
2964
+            }
2965
+        } else {
2966
+            $r = false;
2967
+        }
2968
+
2969
+        if (spip_sqlite_errno($this->serveur)) {
2970
+            $err .= spip_sqlite_error($query, $this->serveur);
2971
+        }
2972
+
2973
+        return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r;
2974
+    }
2975
+
2976
+    /**
2977
+     * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2978
+     *
2979
+     * @return string|false
2980
+     **/
2981
+    public function last_insert_id() {
2982
+        return $this->link->lastInsertId();
2983
+    }
2984 2984
 }
2985 2985
 
2986 2986
 
@@ -2990,206 +2990,206 @@  discard block
 block discarded – undo
2990 2990
  * (fonction pour proteger les textes)
2991 2991
  */
2992 2992
 class sqlite_traducteur {
2993
-	/** @var string $query Texte de la requête */
2994
-	public $query = '';
2995
-	/** @var string $prefixe Préfixe des tables */
2996
-	public $prefixe = '';
2997
-	/** @var string $sqlite_version Version de sqlite (2 ou 3) */
2998
-	public $sqlite_version = '';
2999
-
3000
-	/** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé
3001
-	 *
3002
-	 * @var array
3003
-	 */
3004
-	public $textes = [];
3005
-
3006
-	/**
3007
-	 * Constructeur
3008
-	 *
3009
-	 * @param string $query Requête à préparer
3010
-	 * @param string $prefixe Prefixe des tables à utiliser
3011
-	 * @param string $sqlite_version Version SQLite (2 ou 3)
3012
-	 */
3013
-	public function __construct($query, $prefixe, $sqlite_version) {
3014
-		$this->query = $query;
3015
-		$this->prefixe = $prefixe;
3016
-		$this->sqlite_version = $sqlite_version;
3017
-	}
3018
-
3019
-	/**
3020
-	 * Transformer la requete pour SQLite
3021
-	 *
3022
-	 * Enlève les textes, transforme la requête pour quelle soit
3023
-	 * bien interprétée par SQLite, puis remet les textes
3024
-	 * la fonction affecte `$this->query`
3025
-	 */
3026
-	public function traduire_requete() {
3027
-		//
3028
-		// 1) Protection des textes en les remplacant par des codes
3029
-		//
3030
-		// enlever les 'textes' et initialiser avec
3031
-		list($this->query, $textes) = query_echappe_textes($this->query);
3032
-
3033
-		//
3034
-		// 2) Corrections de la requete
3035
-		//
3036
-		// Correction Create Database
3037
-		// Create Database -> requete ignoree
3038
-		if (strpos($this->query, 'CREATE DATABASE') === 0) {
3039
-			spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
3040
-			$this->query = 'SELECT 1';
3041
-		}
3042
-
3043
-		// Correction Insert Ignore
3044
-		// INSERT IGNORE -> insert (tout court et pas 'insert or replace')
3045
-		if (strpos($this->query, 'INSERT IGNORE') === 0) {
3046
-			spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
3047
-			$this->query = 'INSERT ' . substr($this->query, '13');
3048
-		}
3049
-
3050
-		// Correction des dates avec INTERVAL
3051
-		// utiliser sql_date_proche() de preference
3052
-		if (strpos($this->query, 'INTERVAL') !== false) {
3053
-			$this->query = preg_replace_callback(
3054
-				'/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U',
3055
-				[&$this, '_remplacerDateParTime'],
3056
-				$this->query
3057
-			);
3058
-		}
3059
-
3060
-		if (strpos($this->query, 'LEFT(') !== false) {
3061
-			$this->query = str_replace('LEFT(', '_LEFT(', $this->query);
3062
-		}
3063
-
3064
-		if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) {
3065
-			$this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query);
3066
-		}
3067
-
3068
-
3069
-		// Correction Using
3070
-		// USING (non reconnu en sqlite2)
3071
-		// problematique car la jointure ne se fait pas du coup.
3072
-		if (($this->sqlite_version == 2) && (strpos($this->query, 'USING') !== false)) {
3073
-			spip_log(
3074
-				"'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
3075
-				'sqlite.' . _LOG_ERREUR
3076
-			);
3077
-			$this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query);
3078
-		}
3079
-
3080
-		// Correction Field
3081
-		// remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END
3082
-		if (strpos($this->query, 'FIELD') !== false) {
3083
-			$this->query = preg_replace_callback(
3084
-				'/FIELD\s*\(([^\)]*)\)/',
3085
-				[&$this, '_remplacerFieldParCase'],
3086
-				$this->query
3087
-			);
3088
-		}
3089
-
3090
-		// Correction des noms de tables FROM
3091
-		// mettre les bons noms de table dans from, update, insert, replace...
3092
-		if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) {
3093
-			$suite = strstr($this->query, $regs[0]);
3094
-			$this->query = substr($this->query, 0, -strlen($suite));
3095
-		} else {
3096
-			$suite = '';
3097
-		}
3098
-		$pref = ($this->prefixe) ? $this->prefixe . '_' : '';
3099
-		$this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite;
3100
-
3101
-		// Correction zero AS x
3102
-		// pg n'aime pas 0+x AS alias, sqlite, dans le meme style,
3103
-		// n'apprecie pas du tout SELECT 0 as x ... ORDER BY x
3104
-		// il dit que x ne doit pas être un integer dans le order by !
3105
-		// on remplace du coup x par vide() dans ce cas uniquement
3106
-		//
3107
-		// apparait dans public/vertebrer.php et dans le plugin menu aussi qui genere aussi ce genre de requete via un {par num #GET{tri_num}}
3108
-		// mais est-ce encore un soucis pour sqlite en 2021 ? (ie commenter le preg_replace marche très bien en sqlite 3.28)
3109
-		if ((strpos($this->query, '0 AS') !== false)) {
3110
-			// on ne remplace que dans ORDER BY ou GROUP BY
3111
-			if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) {
3112
-				$suite = strstr($this->query, $regs[0]);
3113
-				$this->query = substr($this->query, 0, -strlen($suite));
3114
-
3115
-				// on cherche les noms des x dans 0 AS x
3116
-				// on remplace dans $suite le nom par vide()
3117
-				preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER);
3118
-				foreach ($matches[1] as $m) {
3119
-					if (strpos($suite, $m) !== false) {
3120
-						$suite = preg_replace(",\b$m\b,", 'VIDE()', $suite);
3121
-					}
3122
-				}
3123
-				$this->query .= $suite;
3124
-			}
3125
-		}
3126
-
3127
-		// Correction possible des divisions entieres
3128
-		// Le standard SQL (lequel? ou?) semble indiquer que
3129
-		// a/b=c doit donner c entier si a et b sont entiers 4/3=1.
3130
-		// C'est ce que retournent effectivement SQL Server et SQLite
3131
-		// Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333...
3132
-		//
3133
-		// On peut forcer la conversion en multipliant par 1.0 avant la division
3134
-		// /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus !
3135
-		// cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228
3136
-		//     http://www.sqlite.org/cvstrac/tktview?tn=3202
3137
-		// (4*1.0/3) n'est pas rendu dans ce cas !
3138
-		# $this->query = str_replace('/','* 1.00 / ',$this->query);
3139
-
3140
-
3141
-		// Correction critere REGEXP, non reconnu en sqlite2
3142
-		if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) {
3143
-			$this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query);
3144
-		}
3145
-
3146
-		//
3147
-		// 3) Remise en place des textes d'origine
3148
-		//
3149
-		// Correction Antiquotes et echappements
3150
-		// ` => rien
3151
-		if (strpos($this->query, '`') !== false) {
3152
-			$this->query = str_replace('`', '', $this->query);
3153
-		}
3154
-
3155
-		$this->query = query_reinjecte_textes($this->query, $textes);
3156
-
3157
-		return $this->query;
3158
-	}
3159
-
3160
-
3161
-	/**
3162
-	 * Callback pour remplacer `DATE_` / `INTERVAL`
3163
-	 * par `DATE ... strtotime`
3164
-	 *
3165
-	 * @param array $matches Captures
3166
-	 * @return string Texte de date compris par SQLite
3167
-	 */
3168
-	public function _remplacerDateParTime($matches) {
3169
-		$op = strtoupper($matches[1] == 'ADD') ? '+' : '-';
3170
-
3171
-		return "datetime$matches[2] '$op$matches[3] $matches[4]')";
3172
-	}
3173
-
3174
-	/**
3175
-	 * Callback pour remplacer `FIELD(table,i,j,k...)`
3176
-	 * par `CASE WHEN table=i THEN n ... ELSE 0 END`
3177
-	 *
3178
-	 * @param array $matches Captures
3179
-	 * @return string Texte de liste ordonnée compris par SQLite
3180
-	 */
3181
-	public function _remplacerFieldParCase($matches) {
3182
-		$fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X)
3183
-		$t = explode(',', $fields);
3184
-		$index = array_shift($t);
3185
-
3186
-		$res = '';
3187
-		$n = 0;
3188
-		foreach ($t as $v) {
3189
-			$n++;
3190
-			$res .= "\nWHEN $index=$v THEN $n";
3191
-		}
3192
-
3193
-		return "CASE $res ELSE 0 END ";
3194
-	}
2993
+    /** @var string $query Texte de la requête */
2994
+    public $query = '';
2995
+    /** @var string $prefixe Préfixe des tables */
2996
+    public $prefixe = '';
2997
+    /** @var string $sqlite_version Version de sqlite (2 ou 3) */
2998
+    public $sqlite_version = '';
2999
+
3000
+    /** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé
3001
+     *
3002
+     * @var array
3003
+     */
3004
+    public $textes = [];
3005
+
3006
+    /**
3007
+     * Constructeur
3008
+     *
3009
+     * @param string $query Requête à préparer
3010
+     * @param string $prefixe Prefixe des tables à utiliser
3011
+     * @param string $sqlite_version Version SQLite (2 ou 3)
3012
+     */
3013
+    public function __construct($query, $prefixe, $sqlite_version) {
3014
+        $this->query = $query;
3015
+        $this->prefixe = $prefixe;
3016
+        $this->sqlite_version = $sqlite_version;
3017
+    }
3018
+
3019
+    /**
3020
+     * Transformer la requete pour SQLite
3021
+     *
3022
+     * Enlève les textes, transforme la requête pour quelle soit
3023
+     * bien interprétée par SQLite, puis remet les textes
3024
+     * la fonction affecte `$this->query`
3025
+     */
3026
+    public function traduire_requete() {
3027
+        //
3028
+        // 1) Protection des textes en les remplacant par des codes
3029
+        //
3030
+        // enlever les 'textes' et initialiser avec
3031
+        list($this->query, $textes) = query_echappe_textes($this->query);
3032
+
3033
+        //
3034
+        // 2) Corrections de la requete
3035
+        //
3036
+        // Correction Create Database
3037
+        // Create Database -> requete ignoree
3038
+        if (strpos($this->query, 'CREATE DATABASE') === 0) {
3039
+            spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
3040
+            $this->query = 'SELECT 1';
3041
+        }
3042
+
3043
+        // Correction Insert Ignore
3044
+        // INSERT IGNORE -> insert (tout court et pas 'insert or replace')
3045
+        if (strpos($this->query, 'INSERT IGNORE') === 0) {
3046
+            spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
3047
+            $this->query = 'INSERT ' . substr($this->query, '13');
3048
+        }
3049
+
3050
+        // Correction des dates avec INTERVAL
3051
+        // utiliser sql_date_proche() de preference
3052
+        if (strpos($this->query, 'INTERVAL') !== false) {
3053
+            $this->query = preg_replace_callback(
3054
+                '/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U',
3055
+                [&$this, '_remplacerDateParTime'],
3056
+                $this->query
3057
+            );
3058
+        }
3059
+
3060
+        if (strpos($this->query, 'LEFT(') !== false) {
3061
+            $this->query = str_replace('LEFT(', '_LEFT(', $this->query);
3062
+        }
3063
+
3064
+        if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) {
3065
+            $this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query);
3066
+        }
3067
+
3068
+
3069
+        // Correction Using
3070
+        // USING (non reconnu en sqlite2)
3071
+        // problematique car la jointure ne se fait pas du coup.
3072
+        if (($this->sqlite_version == 2) && (strpos($this->query, 'USING') !== false)) {
3073
+            spip_log(
3074
+                "'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
3075
+                'sqlite.' . _LOG_ERREUR
3076
+            );
3077
+            $this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query);
3078
+        }
3079
+
3080
+        // Correction Field
3081
+        // remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END
3082
+        if (strpos($this->query, 'FIELD') !== false) {
3083
+            $this->query = preg_replace_callback(
3084
+                '/FIELD\s*\(([^\)]*)\)/',
3085
+                [&$this, '_remplacerFieldParCase'],
3086
+                $this->query
3087
+            );
3088
+        }
3089
+
3090
+        // Correction des noms de tables FROM
3091
+        // mettre les bons noms de table dans from, update, insert, replace...
3092
+        if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) {
3093
+            $suite = strstr($this->query, $regs[0]);
3094
+            $this->query = substr($this->query, 0, -strlen($suite));
3095
+        } else {
3096
+            $suite = '';
3097
+        }
3098
+        $pref = ($this->prefixe) ? $this->prefixe . '_' : '';
3099
+        $this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite;
3100
+
3101
+        // Correction zero AS x
3102
+        // pg n'aime pas 0+x AS alias, sqlite, dans le meme style,
3103
+        // n'apprecie pas du tout SELECT 0 as x ... ORDER BY x
3104
+        // il dit que x ne doit pas être un integer dans le order by !
3105
+        // on remplace du coup x par vide() dans ce cas uniquement
3106
+        //
3107
+        // apparait dans public/vertebrer.php et dans le plugin menu aussi qui genere aussi ce genre de requete via un {par num #GET{tri_num}}
3108
+        // mais est-ce encore un soucis pour sqlite en 2021 ? (ie commenter le preg_replace marche très bien en sqlite 3.28)
3109
+        if ((strpos($this->query, '0 AS') !== false)) {
3110
+            // on ne remplace que dans ORDER BY ou GROUP BY
3111
+            if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) {
3112
+                $suite = strstr($this->query, $regs[0]);
3113
+                $this->query = substr($this->query, 0, -strlen($suite));
3114
+
3115
+                // on cherche les noms des x dans 0 AS x
3116
+                // on remplace dans $suite le nom par vide()
3117
+                preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER);
3118
+                foreach ($matches[1] as $m) {
3119
+                    if (strpos($suite, $m) !== false) {
3120
+                        $suite = preg_replace(",\b$m\b,", 'VIDE()', $suite);
3121
+                    }
3122
+                }
3123
+                $this->query .= $suite;
3124
+            }
3125
+        }
3126
+
3127
+        // Correction possible des divisions entieres
3128
+        // Le standard SQL (lequel? ou?) semble indiquer que
3129
+        // a/b=c doit donner c entier si a et b sont entiers 4/3=1.
3130
+        // C'est ce que retournent effectivement SQL Server et SQLite
3131
+        // Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333...
3132
+        //
3133
+        // On peut forcer la conversion en multipliant par 1.0 avant la division
3134
+        // /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus !
3135
+        // cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228
3136
+        //     http://www.sqlite.org/cvstrac/tktview?tn=3202
3137
+        // (4*1.0/3) n'est pas rendu dans ce cas !
3138
+        # $this->query = str_replace('/','* 1.00 / ',$this->query);
3139
+
3140
+
3141
+        // Correction critere REGEXP, non reconnu en sqlite2
3142
+        if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) {
3143
+            $this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query);
3144
+        }
3145
+
3146
+        //
3147
+        // 3) Remise en place des textes d'origine
3148
+        //
3149
+        // Correction Antiquotes et echappements
3150
+        // ` => rien
3151
+        if (strpos($this->query, '`') !== false) {
3152
+            $this->query = str_replace('`', '', $this->query);
3153
+        }
3154
+
3155
+        $this->query = query_reinjecte_textes($this->query, $textes);
3156
+
3157
+        return $this->query;
3158
+    }
3159
+
3160
+
3161
+    /**
3162
+     * Callback pour remplacer `DATE_` / `INTERVAL`
3163
+     * par `DATE ... strtotime`
3164
+     *
3165
+     * @param array $matches Captures
3166
+     * @return string Texte de date compris par SQLite
3167
+     */
3168
+    public function _remplacerDateParTime($matches) {
3169
+        $op = strtoupper($matches[1] == 'ADD') ? '+' : '-';
3170
+
3171
+        return "datetime$matches[2] '$op$matches[3] $matches[4]')";
3172
+    }
3173
+
3174
+    /**
3175
+     * Callback pour remplacer `FIELD(table,i,j,k...)`
3176
+     * par `CASE WHEN table=i THEN n ... ELSE 0 END`
3177
+     *
3178
+     * @param array $matches Captures
3179
+     * @return string Texte de liste ordonnée compris par SQLite
3180
+     */
3181
+    public function _remplacerFieldParCase($matches) {
3182
+        $fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X)
3183
+        $t = explode(',', $fields);
3184
+        $index = array_shift($t);
3185
+
3186
+        $res = '';
3187
+        $n = 0;
3188
+        foreach ($t as $v) {
3189
+            $n++;
3190
+            $res .= "\nWHEN $index=$v THEN $n";
3191
+        }
3192
+
3193
+        return "CASE $res ELSE 0 END ";
3194
+    }
3195 3195
 }
Please login to merge, or discard this patch.
ecrire/req/mysql.php 1 patch
Indentation   +878 added lines, -878 removed lines patch added patch discarded remove patch
@@ -20,15 +20,15 @@  discard block
 block discarded – undo
20 20
  */
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 if (!defined('_MYSQL_NOPLANES')) {
27
-	define('_MYSQL_NOPLANES', true);
27
+    define('_MYSQL_NOPLANES', true);
28 28
 }
29 29
 
30 30
 if (!defined('_MYSQL_ENGINE')) {
31
-	define('_MYSQL_ENGINE', 'MyISAM');
31
+    define('_MYSQL_ENGINE', 'MyISAM');
32 32
 }
33 33
 
34 34
 /**
@@ -45,112 +45,112 @@  discard block
 block discarded – undo
45 45
  *     - tableau décrivant la connexion sinon
46 46
  */
47 47
 function req_mysql_dist($host, $port, $login, $pass, $db = '', $prefixe = '') {
48
-	if (!extension_loaded(\mysqli::class)) {
49
-		return false;
50
-	}
51
-
52
-	// si port est fourni mais pas host, c'est un socket -> compat avec vieille syntaxe de mysql_connect() et anciens fichiers connect.php
53
-	try {
54
-		if (
55
-			$port and !is_numeric($socket = $port)
56
-			and (!$host or $host === 'localhost')
57
-		) {
58
-			$link = @mysqli_connect($host, $login, $pass, '', null, $socket);
59
-		} elseif ($port) {
60
-			$link = @mysqli_connect($host, $login, $pass, '', $port);
61
-		} else {
62
-			$link = @mysqli_connect($host, $login, $pass);
63
-		}
64
-	} catch (\mysqli_sql_exception $e) {
65
-		spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
66
-		$link = false;
67
-	}
68
-
69
-	if (!$link) {
70
-		spip_log('Echec mysqli_connect. Erreur : ' . mysqli_connect_error(), 'mysql.' . _LOG_HS);
71
-
72
-		return false;
73
-	}
74
-	$last = '';
75
-	if (!$db) {
76
-		$ok = $link;
77
-		$db = 'spip';
78
-	} else {
79
-		$ok = mysqli_select_db($link, $db);
80
-		if (
81
-			defined('_MYSQL_SET_SQL_MODE')
82
-			or defined('_MYSQL_SQL_MODE_TEXT_NOT_NULL') // compatibilite
83
-		) {
84
-			mysqli_query($link, $last = "set sql_mode=''");
85
-		}
86
-	}
87
-
88
-	spip_log(
89
-		"Connexion MySQLi vers $host, base $db, prefixe $prefixe " . ($ok ? 'operationnelle' : 'impossible'),
90
-		_LOG_DEBUG
91
-	);
92
-
93
-	return !$ok ? false : [
94
-		'db' => $db,
95
-		'last' => $last,
96
-		'prefixe' => $prefixe ?: $db,
97
-		'link' => $link,
98
-		'total_requetes' => 0,
99
-	];
48
+    if (!extension_loaded(\mysqli::class)) {
49
+        return false;
50
+    }
51
+
52
+    // si port est fourni mais pas host, c'est un socket -> compat avec vieille syntaxe de mysql_connect() et anciens fichiers connect.php
53
+    try {
54
+        if (
55
+            $port and !is_numeric($socket = $port)
56
+            and (!$host or $host === 'localhost')
57
+        ) {
58
+            $link = @mysqli_connect($host, $login, $pass, '', null, $socket);
59
+        } elseif ($port) {
60
+            $link = @mysqli_connect($host, $login, $pass, '', $port);
61
+        } else {
62
+            $link = @mysqli_connect($host, $login, $pass);
63
+        }
64
+    } catch (\mysqli_sql_exception $e) {
65
+        spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
66
+        $link = false;
67
+    }
68
+
69
+    if (!$link) {
70
+        spip_log('Echec mysqli_connect. Erreur : ' . mysqli_connect_error(), 'mysql.' . _LOG_HS);
71
+
72
+        return false;
73
+    }
74
+    $last = '';
75
+    if (!$db) {
76
+        $ok = $link;
77
+        $db = 'spip';
78
+    } else {
79
+        $ok = mysqli_select_db($link, $db);
80
+        if (
81
+            defined('_MYSQL_SET_SQL_MODE')
82
+            or defined('_MYSQL_SQL_MODE_TEXT_NOT_NULL') // compatibilite
83
+        ) {
84
+            mysqli_query($link, $last = "set sql_mode=''");
85
+        }
86
+    }
87
+
88
+    spip_log(
89
+        "Connexion MySQLi vers $host, base $db, prefixe $prefixe " . ($ok ? 'operationnelle' : 'impossible'),
90
+        _LOG_DEBUG
91
+    );
92
+
93
+    return !$ok ? false : [
94
+        'db' => $db,
95
+        'last' => $last,
96
+        'prefixe' => $prefixe ?: $db,
97
+        'link' => $link,
98
+        'total_requetes' => 0,
99
+    ];
100 100
 }
101 101
 
102 102
 
103 103
 $GLOBALS['spip_mysql_functions_1'] = [
104
-	'alter' => 'spip_mysql_alter',
105
-	'count' => 'spip_mysql_count',
106
-	'countsel' => 'spip_mysql_countsel',
107
-	'create' => 'spip_mysql_create',
108
-	'create_base' => 'spip_mysql_create_base',
109
-	'create_view' => 'spip_mysql_create_view',
110
-	'date_proche' => 'spip_mysql_date_proche',
111
-	'delete' => 'spip_mysql_delete',
112
-	'drop_table' => 'spip_mysql_drop_table',
113
-	'drop_view' => 'spip_mysql_drop_view',
114
-	'errno' => 'spip_mysql_errno',
115
-	'error' => 'spip_mysql_error',
116
-	'explain' => 'spip_mysql_explain',
117
-	'fetch' => 'spip_mysql_fetch',
118
-	'seek' => 'spip_mysql_seek',
119
-	'free' => 'spip_mysql_free',
120
-	'hex' => 'spip_mysql_hex',
121
-	'in' => 'spip_mysql_in',
122
-	'insert' => 'spip_mysql_insert',
123
-	'insertq' => 'spip_mysql_insertq',
124
-	'insertq_multi' => 'spip_mysql_insertq_multi',
125
-	'listdbs' => 'spip_mysql_listdbs',
126
-	'multi' => 'spip_mysql_multi',
127
-	'optimize' => 'spip_mysql_optimize',
128
-	'query' => 'spip_mysql_query',
129
-	'quote' => 'spip_mysql_quote',
130
-	'replace' => 'spip_mysql_replace',
131
-	'replace_multi' => 'spip_mysql_replace_multi',
132
-	'repair' => 'spip_mysql_repair',
133
-	'select' => 'spip_mysql_select',
134
-	'selectdb' => 'spip_mysql_selectdb',
135
-	'set_charset' => 'spip_mysql_set_charset',
136
-	'get_charset' => 'spip_mysql_get_charset',
137
-	'showbase' => 'spip_mysql_showbase',
138
-	'showtable' => 'spip_mysql_showtable',
139
-	'table_exists' => 'spip_mysql_table_exists',
140
-	'update' => 'spip_mysql_update',
141
-	'updateq' => 'spip_mysql_updateq',
142
-
143
-	// association de chaque nom http d'un charset aux couples MySQL
144
-	'charsets' => [
145
-		'cp1250' => ['charset' => 'cp1250', 'collation' => 'cp1250_general_ci'],
146
-		'cp1251' => ['charset' => 'cp1251', 'collation' => 'cp1251_general_ci'],
147
-		'cp1256' => ['charset' => 'cp1256', 'collation' => 'cp1256_general_ci'],
148
-		'iso-8859-1' => ['charset' => 'latin1', 'collation' => 'latin1_swedish_ci'],
104
+    'alter' => 'spip_mysql_alter',
105
+    'count' => 'spip_mysql_count',
106
+    'countsel' => 'spip_mysql_countsel',
107
+    'create' => 'spip_mysql_create',
108
+    'create_base' => 'spip_mysql_create_base',
109
+    'create_view' => 'spip_mysql_create_view',
110
+    'date_proche' => 'spip_mysql_date_proche',
111
+    'delete' => 'spip_mysql_delete',
112
+    'drop_table' => 'spip_mysql_drop_table',
113
+    'drop_view' => 'spip_mysql_drop_view',
114
+    'errno' => 'spip_mysql_errno',
115
+    'error' => 'spip_mysql_error',
116
+    'explain' => 'spip_mysql_explain',
117
+    'fetch' => 'spip_mysql_fetch',
118
+    'seek' => 'spip_mysql_seek',
119
+    'free' => 'spip_mysql_free',
120
+    'hex' => 'spip_mysql_hex',
121
+    'in' => 'spip_mysql_in',
122
+    'insert' => 'spip_mysql_insert',
123
+    'insertq' => 'spip_mysql_insertq',
124
+    'insertq_multi' => 'spip_mysql_insertq_multi',
125
+    'listdbs' => 'spip_mysql_listdbs',
126
+    'multi' => 'spip_mysql_multi',
127
+    'optimize' => 'spip_mysql_optimize',
128
+    'query' => 'spip_mysql_query',
129
+    'quote' => 'spip_mysql_quote',
130
+    'replace' => 'spip_mysql_replace',
131
+    'replace_multi' => 'spip_mysql_replace_multi',
132
+    'repair' => 'spip_mysql_repair',
133
+    'select' => 'spip_mysql_select',
134
+    'selectdb' => 'spip_mysql_selectdb',
135
+    'set_charset' => 'spip_mysql_set_charset',
136
+    'get_charset' => 'spip_mysql_get_charset',
137
+    'showbase' => 'spip_mysql_showbase',
138
+    'showtable' => 'spip_mysql_showtable',
139
+    'table_exists' => 'spip_mysql_table_exists',
140
+    'update' => 'spip_mysql_update',
141
+    'updateq' => 'spip_mysql_updateq',
142
+
143
+    // association de chaque nom http d'un charset aux couples MySQL
144
+    'charsets' => [
145
+        'cp1250' => ['charset' => 'cp1250', 'collation' => 'cp1250_general_ci'],
146
+        'cp1251' => ['charset' => 'cp1251', 'collation' => 'cp1251_general_ci'],
147
+        'cp1256' => ['charset' => 'cp1256', 'collation' => 'cp1256_general_ci'],
148
+        'iso-8859-1' => ['charset' => 'latin1', 'collation' => 'latin1_swedish_ci'],
149 149
 //'iso-8859-6'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
150
-		'iso-8859-9' => ['charset' => 'latin5', 'collation' => 'latin5_turkish_ci'],
150
+        'iso-8859-9' => ['charset' => 'latin5', 'collation' => 'latin5_turkish_ci'],
151 151
 //'iso-8859-15'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
152
-		'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci']
153
-	]
152
+        'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci']
153
+    ]
154 154
 ];
155 155
 
156 156
 
@@ -161,9 +161,9 @@  discard block
 block discarded – undo
161 161
  * @return Object Information de connexion pour mysqli
162 162
  */
163 163
 function _mysql_link($serveur = '') {
164
-	$link = &$GLOBALS['connexions'][$serveur ?: 0]['link'];
164
+    $link = &$GLOBALS['connexions'][$serveur ?: 0]['link'];
165 165
 
166
-	return $link;
166
+    return $link;
167 167
 }
168 168
 
169 169
 
@@ -176,10 +176,10 @@  discard block
 block discarded – undo
176 176
  * @return mysqli_result|bool Jeu de résultats pour fetch()
177 177
  */
178 178
 function spip_mysql_set_charset($charset, $serveur = '', $requeter = true) {
179
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
180
-	spip_log('changement de charset sql : ' . 'SET NAMES ' . _q($charset), _LOG_DEBUG);
179
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
180
+    spip_log('changement de charset sql : ' . 'SET NAMES ' . _q($charset), _LOG_DEBUG);
181 181
 
182
-	return mysqli_query($connexion['link'], $connexion['last'] = 'SET NAMES ' . _q($charset));
182
+    return mysqli_query($connexion['link'], $connexion['last'] = 'SET NAMES ' . _q($charset));
183 183
 }
184 184
 
185 185
 
@@ -192,11 +192,11 @@  discard block
 block discarded – undo
192 192
  * @return array Description du charset (son nom est dans 'charset')
193 193
  */
194 194
 function spip_mysql_get_charset($charset = [], $serveur = '', $requeter = true) {
195
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
196
-	$connexion['last'] = $c = 'SHOW CHARACTER SET'
197
-		. (!$charset ? '' : (' LIKE ' . _q($charset['charset'])));
195
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
196
+    $connexion['last'] = $c = 'SHOW CHARACTER SET'
197
+        . (!$charset ? '' : (' LIKE ' . _q($charset['charset'])));
198 198
 
199
-	return spip_mysql_fetch(mysqli_query($connexion['link'], $c), null, $serveur);
199
+    return spip_mysql_fetch(mysqli_query($connexion['link'], $c), null, $serveur);
200 200
 }
201 201
 
202 202
 /**
@@ -212,80 +212,80 @@  discard block
 block discarded – undo
212 212
  */
213 213
 function spip_mysql_query($query, $serveur = '', $requeter = true) {
214 214
 
215
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
216
-	$prefixe = $connexion['prefixe'];
217
-	$link = $connexion['link'];
218
-	$db = $connexion['db'];
219
-
220
-	$query = _mysql_traite_query($query, $db, $prefixe);
221
-
222
-	// renvoyer la requete inerte si demandee
223
-	if (!$requeter) {
224
-		return $query;
225
-	}
226
-
227
-	if (isset($_GET['var_profile']) or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
228
-		include_spip('public/tracer');
229
-		$t = trace_query_start();
230
-	} else {
231
-		$t = 0;
232
-	}
233
-
234
-	$connexion['last'] = $query;
235
-	$connexion['total_requetes']++;
236
-
237
-	// ajouter un debug utile dans log/mysql-slow.log ?
238
-	$debug = '';
239
-	if (defined('_DEBUG_SLOW_QUERIES') and _DEBUG_SLOW_QUERIES) {
240
-		if (isset($GLOBALS['debug']['aucasou'])) {
241
-			[, $id, , $infos] = $GLOBALS['debug']['aucasou'];
242
-			$debug .= "BOUCLE$id @ " . ($infos[0] ?? '') . ' | ';
243
-		}
244
-		if (isset($_SERVER['REQUEST_URI'])) {
245
-			$debug .= $_SERVER['REQUEST_URI'];
246
-		}
247
-		if (!empty($GLOBALS['ip'])) {
248
-			$debug .= ' + ' . $GLOBALS['ip'];
249
-		}
250
-		$debug = ' /* ' . mysqli_real_escape_string($link, str_replace('*/', '@/', $debug)) . ' */';
251
-	}
252
-	try {
253
-		$r = mysqli_query($link, $query . $debug);
254
-	} catch (\mysqli_sql_exception $e) {
255
-		spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
256
-		$r = false;
257
-		// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
258
-		// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
259
-	}
260
-
261
-	//Eviter de propager le GoneAway sur les autres requetes d'un même processus PHP
262
-	if ($e = spip_mysql_errno($serveur)) {  // Log d'un Gone Away
263
-		if ($e == 2006) { //Si Gone Away on relance une connexion vierge
264
-			//Fermer la connexion defaillante
265
-			mysqli_close($connexion['link']);
266
-			unset($GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]);
267
-			//Relancer une connexion vierge
268
-			spip_connect($serveur);
269
-			$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
270
-			$link = $connexion['link'];
271
-			//On retente au cas où
272
-			try {
273
-				$r = mysqli_query($link, $query . $debug);
274
-			} catch (\mysqli_sql_exception $e) {
275
-				spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
276
-				$r = false;
277
-				// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
278
-				// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
279
-			}
280
-		}
281
-	}
282
-
283
-	// Log de l'erreur eventuelle
284
-	if ($e = spip_mysql_errno($serveur)) {
285
-		// et du fautif
286
-		$e .= spip_mysql_error($query, $serveur);
287
-	}
288
-	return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
215
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
216
+    $prefixe = $connexion['prefixe'];
217
+    $link = $connexion['link'];
218
+    $db = $connexion['db'];
219
+
220
+    $query = _mysql_traite_query($query, $db, $prefixe);
221
+
222
+    // renvoyer la requete inerte si demandee
223
+    if (!$requeter) {
224
+        return $query;
225
+    }
226
+
227
+    if (isset($_GET['var_profile']) or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
228
+        include_spip('public/tracer');
229
+        $t = trace_query_start();
230
+    } else {
231
+        $t = 0;
232
+    }
233
+
234
+    $connexion['last'] = $query;
235
+    $connexion['total_requetes']++;
236
+
237
+    // ajouter un debug utile dans log/mysql-slow.log ?
238
+    $debug = '';
239
+    if (defined('_DEBUG_SLOW_QUERIES') and _DEBUG_SLOW_QUERIES) {
240
+        if (isset($GLOBALS['debug']['aucasou'])) {
241
+            [, $id, , $infos] = $GLOBALS['debug']['aucasou'];
242
+            $debug .= "BOUCLE$id @ " . ($infos[0] ?? '') . ' | ';
243
+        }
244
+        if (isset($_SERVER['REQUEST_URI'])) {
245
+            $debug .= $_SERVER['REQUEST_URI'];
246
+        }
247
+        if (!empty($GLOBALS['ip'])) {
248
+            $debug .= ' + ' . $GLOBALS['ip'];
249
+        }
250
+        $debug = ' /* ' . mysqli_real_escape_string($link, str_replace('*/', '@/', $debug)) . ' */';
251
+    }
252
+    try {
253
+        $r = mysqli_query($link, $query . $debug);
254
+    } catch (\mysqli_sql_exception $e) {
255
+        spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
256
+        $r = false;
257
+        // TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
258
+        // mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
259
+    }
260
+
261
+    //Eviter de propager le GoneAway sur les autres requetes d'un même processus PHP
262
+    if ($e = spip_mysql_errno($serveur)) {  // Log d'un Gone Away
263
+        if ($e == 2006) { //Si Gone Away on relance une connexion vierge
264
+            //Fermer la connexion defaillante
265
+            mysqli_close($connexion['link']);
266
+            unset($GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]);
267
+            //Relancer une connexion vierge
268
+            spip_connect($serveur);
269
+            $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
270
+            $link = $connexion['link'];
271
+            //On retente au cas où
272
+            try {
273
+                $r = mysqli_query($link, $query . $debug);
274
+            } catch (\mysqli_sql_exception $e) {
275
+                spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
276
+                $r = false;
277
+                // TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
278
+                // mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
279
+            }
280
+        }
281
+    }
282
+
283
+    // Log de l'erreur eventuelle
284
+    if ($e = spip_mysql_errno($serveur)) {
285
+        // et du fautif
286
+        $e .= spip_mysql_error($query, $serveur);
287
+    }
288
+    return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
289 289
 }
290 290
 
291 291
 /**
@@ -300,12 +300,12 @@  discard block
 block discarded – undo
300 300
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
301 301
  */
302 302
 function spip_mysql_alter($query, $serveur = '', $requeter = true) {
303
-	// ici on supprime les ` entourant le nom de table pour permettre
304
-	// la transposition du prefixe, compte tenu que les plugins ont la mauvaise habitude
305
-	// d'utiliser ceux-ci, copie-colle de phpmyadmin
306
-	$query = preg_replace(',^TABLE\s*`([^`]*)`,i', "TABLE \\1", $query);
303
+    // ici on supprime les ` entourant le nom de table pour permettre
304
+    // la transposition du prefixe, compte tenu que les plugins ont la mauvaise habitude
305
+    // d'utiliser ceux-ci, copie-colle de phpmyadmin
306
+    $query = preg_replace(',^TABLE\s*`([^`]*)`,i', "TABLE \\1", $query);
307 307
 
308
-	return spip_mysql_query('ALTER ' . $query, $serveur, $requeter); # i.e. que PG se debrouille
308
+    return spip_mysql_query('ALTER ' . $query, $serveur, $requeter); # i.e. que PG se debrouille
309 309
 }
310 310
 
311 311
 
@@ -318,9 +318,9 @@  discard block
 block discarded – undo
318 318
  * @return bool            Toujours true
319 319
  */
320 320
 function spip_mysql_optimize($table, $serveur = '', $requeter = true) {
321
-	spip_mysql_query('OPTIMIZE TABLE ' . $table);
321
+    spip_mysql_query('OPTIMIZE TABLE ' . $table);
322 322
 
323
-	return true;
323
+    return true;
324 324
 }
325 325
 
326 326
 
@@ -333,18 +333,18 @@  discard block
 block discarded – undo
333 333
  * @return array           Tableau de l'explication
334 334
  */
335 335
 function spip_mysql_explain($query, $serveur = '', $requeter = true) {
336
-	if (strpos(ltrim($query), 'SELECT') !== 0) {
337
-		return [];
338
-	}
339
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
340
-	$prefixe = $connexion['prefixe'];
341
-	$link = $connexion['link'];
342
-	$db = $connexion['db'];
343
-
344
-	$query = 'EXPLAIN ' . _mysql_traite_query($query, $db, $prefixe);
345
-	$r = mysqli_query($link, $query);
346
-
347
-	return spip_mysql_fetch($r, null, $serveur);
336
+    if (strpos(ltrim($query), 'SELECT') !== 0) {
337
+        return [];
338
+    }
339
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
340
+    $prefixe = $connexion['prefixe'];
341
+    $link = $connexion['link'];
342
+    $db = $connexion['db'];
343
+
344
+    $query = 'EXPLAIN ' . _mysql_traite_query($query, $db, $prefixe);
345
+    $r = mysqli_query($link, $query);
346
+
347
+    return spip_mysql_fetch($r, null, $serveur);
348 348
 }
349 349
 
350 350
 
@@ -373,35 +373,35 @@  discard block
 block discarded – undo
373 373
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
374 374
  */
375 375
 function spip_mysql_select(
376
-	$select,
377
-	$from,
378
-	$where = '',
379
-	$groupby = '',
380
-	$orderby = '',
381
-	$limit = '',
382
-	$having = '',
383
-	$serveur = '',
384
-	$requeter = true
376
+    $select,
377
+    $from,
378
+    $where = '',
379
+    $groupby = '',
380
+    $orderby = '',
381
+    $limit = '',
382
+    $having = '',
383
+    $serveur = '',
384
+    $requeter = true
385 385
 ) {
386 386
 
387 387
 
388
-	$from = (!is_array($from) ? $from : spip_mysql_select_as($from));
389
-	$query =
390
-		calculer_mysql_expression('SELECT', $select, ', ')
391
-		. calculer_mysql_expression('FROM', $from, ', ')
392
-		. calculer_mysql_expression('WHERE', $where)
393
-		. calculer_mysql_expression('GROUP BY', $groupby, ',')
394
-		. calculer_mysql_expression('HAVING', $having)
395
-		. ($orderby ? ("\nORDER BY " . spip_mysql_order($orderby)) : '')
396
-		. ($limit ? "\nLIMIT $limit" : '');
388
+    $from = (!is_array($from) ? $from : spip_mysql_select_as($from));
389
+    $query =
390
+        calculer_mysql_expression('SELECT', $select, ', ')
391
+        . calculer_mysql_expression('FROM', $from, ', ')
392
+        . calculer_mysql_expression('WHERE', $where)
393
+        . calculer_mysql_expression('GROUP BY', $groupby, ',')
394
+        . calculer_mysql_expression('HAVING', $having)
395
+        . ($orderby ? ("\nORDER BY " . spip_mysql_order($orderby)) : '')
396
+        . ($limit ? "\nLIMIT $limit" : '');
397 397
 
398
-	// renvoyer la requete inerte si demandee
399
-	if ($requeter === false) {
400
-		return $query;
401
-	}
402
-	$r = spip_mysql_query($query, $serveur, $requeter);
398
+    // renvoyer la requete inerte si demandee
399
+    if ($requeter === false) {
400
+        return $query;
401
+    }
402
+    $r = spip_mysql_query($query, $serveur, $requeter);
403 403
 
404
-	return $r ?: $query;
404
+    return $r ?: $query;
405 405
 }
406 406
 
407 407
 
@@ -418,7 +418,7 @@  discard block
 block discarded – undo
418 418
  * @return string Texte du orderby préparé
419 419
  */
420 420
 function spip_mysql_order($orderby) {
421
-	return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
421
+    return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
422 422
 }
423 423
 
424 424
 
@@ -441,26 +441,26 @@  discard block
 block discarded – undo
441 441
  *     Contrainte pour clause WHERE
442 442
  */
443 443
 function calculer_mysql_where($v) {
444
-	if (!is_array($v)) {
445
-		return $v;
446
-	}
447
-
448
-	$op = array_shift($v);
449
-	if (!($n = count($v))) {
450
-		return $op;
451
-	} else {
452
-		$arg = calculer_mysql_where(array_shift($v));
453
-		if ($n == 1) {
454
-			return "$op($arg)";
455
-		} else {
456
-			$arg2 = calculer_mysql_where(array_shift($v));
457
-			if ($n == 2) {
458
-				return "($arg $op $arg2)";
459
-			} else {
460
-				return "($arg $op ($arg2) : $v[0])";
461
-			}
462
-		}
463
-	}
444
+    if (!is_array($v)) {
445
+        return $v;
446
+    }
447
+
448
+    $op = array_shift($v);
449
+    if (!($n = count($v))) {
450
+        return $op;
451
+    } else {
452
+        $arg = calculer_mysql_where(array_shift($v));
453
+        if ($n == 1) {
454
+            return "$op($arg)";
455
+        } else {
456
+            $arg2 = calculer_mysql_where(array_shift($v));
457
+            if ($n == 2) {
458
+                return "($arg $op $arg2)";
459
+            } else {
460
+                return "($arg $op ($arg2) : $v[0])";
461
+            }
462
+        }
463
+    }
464 464
 }
465 465
 
466 466
 /**
@@ -475,21 +475,21 @@  discard block
 block discarded – undo
475 475
  * @return string            Texte de l'expression, une partie donc, du texte la requête.
476 476
  */
477 477
 function calculer_mysql_expression($expression, $v, $join = 'AND') {
478
-	if (empty($v)) {
479
-		return '';
480
-	}
481
-
482
-	$exp = "\n$expression ";
483
-
484
-	if (!is_array($v)) {
485
-		return $exp . $v;
486
-	} else {
487
-		if (strtoupper($join) === 'AND') {
488
-			return $exp . join("\n\t$join ", array_map('calculer_mysql_where', $v));
489
-		} else {
490
-			return $exp . join($join, $v);
491
-		}
492
-	}
478
+    if (empty($v)) {
479
+        return '';
480
+    }
481
+
482
+    $exp = "\n$expression ";
483
+
484
+    if (!is_array($v)) {
485
+        return $exp . $v;
486
+    } else {
487
+        if (strtoupper($join) === 'AND') {
488
+            return $exp . join("\n\t$join ", array_map('calculer_mysql_where', $v));
489
+        } else {
490
+            return $exp . join($join, $v);
491
+        }
492
+    }
493 493
 }
494 494
 
495 495
 
@@ -500,26 +500,26 @@  discard block
 block discarded – undo
500 500
  * @return string Sélection de colonnes pour une clause SELECT
501 501
  */
502 502
 function spip_mysql_select_as($args) {
503
-	$res = '';
504
-	foreach ($args as $k => $v) {
505
-		if (substr($k, -1) == '@') {
506
-			// c'est une jointure qui se refere au from precedent
507
-			// pas de virgule
508
-			$res .= '  ' . $v;
509
-		} else {
510
-			if (!is_numeric($k)) {
511
-				$p = strpos($v, ' ');
512
-				if ($p) {
513
-					$v = substr($v, 0, $p) . " AS `$k`" . substr($v, $p);
514
-				} else {
515
-					$v .= " AS `$k`";
516
-				}
517
-			}
518
-			$res .= ', ' . $v;
519
-		}
520
-	}
521
-
522
-	return substr($res, 2);
503
+    $res = '';
504
+    foreach ($args as $k => $v) {
505
+        if (substr($k, -1) == '@') {
506
+            // c'est une jointure qui se refere au from precedent
507
+            // pas de virgule
508
+            $res .= '  ' . $v;
509
+        } else {
510
+            if (!is_numeric($k)) {
511
+                $p = strpos($v, ' ');
512
+                if ($p) {
513
+                    $v = substr($v, 0, $p) . " AS `$k`" . substr($v, $p);
514
+                } else {
515
+                    $v .= " AS `$k`";
516
+                }
517
+            }
518
+            $res .= ', ' . $v;
519
+        }
520
+    }
521
+
522
+    return substr($res, 2);
523 523
 }
524 524
 
525 525
 
@@ -544,58 +544,58 @@  discard block
 block discarded – undo
544 544
  */
545 545
 function _mysql_traite_query($query, $db = '', $prefixe = '', $echappe_textes = true) {
546 546
 
547
-	if ($GLOBALS['mysql_rappel_nom_base'] and $db) {
548
-		$pref = '`' . $db . '`.';
549
-	} else {
550
-		$pref = '';
551
-	}
552
-
553
-	if ($prefixe) {
554
-		$pref .= $prefixe . '_';
555
-	}
556
-
557
-	if (!preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
558
-		$suite = '';
559
-	} else {
560
-		$suite = strstr($query, (string) $regs[0]);
561
-		$query = substr($query, 0, -strlen($suite));
562
-		// propager le prefixe en cas de requete imbriquee
563
-		// il faut alors echapper les chaine avant de le faire, pour ne pas risquer de
564
-		// modifier une requete qui est en fait juste du texte dans un champ
565
-		if (stripos($suite, 'SELECT') !== false) {
566
-			if ($echappe_textes) {
567
-				[$suite_echap, $textes] = query_echappe_textes($suite);
568
-			}
569
-			else {
570
-				$suite_echap = $suite;
571
-			}
572
-			if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite_echap, $r)) {
573
-				$suite_echap = $r[1] . _mysql_traite_query($r[2], $db, $prefixe, false);
574
-				if ($echappe_textes) {
575
-					$suite = query_reinjecte_textes($suite_echap, $textes);
576
-				}
577
-				else {
578
-					$suite = $suite_echap;
579
-				}
580
-			}
581
-		}
582
-	}
583
-	$r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1' . $pref, $query) . $suite;
584
-
585
-	// en option, remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
586
-	// remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
587
-	if (
588
-		defined('_MYSQL_NOPLANES')
589
-		and _MYSQL_NOPLANES
590
-		and !empty($GLOBALS['meta']['charset_sql_connexion'])
591
-		and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
592
-	) {
593
-		include_spip('inc/charsets');
594
-		$r = utf8_noplanes($r);
595
-	}
596
-
597
-	#spip_log("_mysql_traite_query: " . substr($r,0, 50) . ".... $db, $prefixe", _LOG_DEBUG);
598
-	return $r;
547
+    if ($GLOBALS['mysql_rappel_nom_base'] and $db) {
548
+        $pref = '`' . $db . '`.';
549
+    } else {
550
+        $pref = '';
551
+    }
552
+
553
+    if ($prefixe) {
554
+        $pref .= $prefixe . '_';
555
+    }
556
+
557
+    if (!preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
558
+        $suite = '';
559
+    } else {
560
+        $suite = strstr($query, (string) $regs[0]);
561
+        $query = substr($query, 0, -strlen($suite));
562
+        // propager le prefixe en cas de requete imbriquee
563
+        // il faut alors echapper les chaine avant de le faire, pour ne pas risquer de
564
+        // modifier une requete qui est en fait juste du texte dans un champ
565
+        if (stripos($suite, 'SELECT') !== false) {
566
+            if ($echappe_textes) {
567
+                [$suite_echap, $textes] = query_echappe_textes($suite);
568
+            }
569
+            else {
570
+                $suite_echap = $suite;
571
+            }
572
+            if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite_echap, $r)) {
573
+                $suite_echap = $r[1] . _mysql_traite_query($r[2], $db, $prefixe, false);
574
+                if ($echappe_textes) {
575
+                    $suite = query_reinjecte_textes($suite_echap, $textes);
576
+                }
577
+                else {
578
+                    $suite = $suite_echap;
579
+                }
580
+            }
581
+        }
582
+    }
583
+    $r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1' . $pref, $query) . $suite;
584
+
585
+    // en option, remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
586
+    // remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
587
+    if (
588
+        defined('_MYSQL_NOPLANES')
589
+        and _MYSQL_NOPLANES
590
+        and !empty($GLOBALS['meta']['charset_sql_connexion'])
591
+        and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
592
+    ) {
593
+        include_spip('inc/charsets');
594
+        $r = utf8_noplanes($r);
595
+    }
596
+
597
+    #spip_log("_mysql_traite_query: " . substr($r,0, 50) . ".... $db, $prefixe", _LOG_DEBUG);
598
+    return $r;
599 599
 }
600 600
 
601 601
 /**
@@ -613,17 +613,17 @@  discard block
 block discarded – undo
613 613
  *     - False en cas d'erreur.
614 614
  **/
615 615
 function spip_mysql_selectdb($db, $serveur = '', $requeter = true) {
616
-	$link = _mysql_link($serveur);
617
-	try {
618
-		$ok = mysqli_select_db($link, $db);
619
-	} catch (\mysqli_sql_exception $e) {
620
-		$ok = false;
621
-	}
622
-	if (!$ok) {
623
-		spip_log('Echec mysqli_selectdb. Erreur : ' . mysqli_error($link), 'mysql.' . _LOG_CRITIQUE);
624
-	}
625
-
626
-	return $ok;
616
+    $link = _mysql_link($serveur);
617
+    try {
618
+        $ok = mysqli_select_db($link, $db);
619
+    } catch (\mysqli_sql_exception $e) {
620
+        $ok = false;
621
+    }
622
+    if (!$ok) {
623
+        spip_log('Echec mysqli_selectdb. Erreur : ' . mysqli_error($link), 'mysql.' . _LOG_CRITIQUE);
624
+    }
625
+
626
+    return $ok;
627 627
 }
628 628
 
629 629
 
@@ -644,14 +644,14 @@  discard block
 block discarded – undo
644 644
  *     Liste de noms de bases de données
645 645
  **/
646 646
 function spip_mysql_listdbs($serveur = '', $requeter = true) {
647
-	$dbs = [];
648
-	if ($res = spip_mysql_query('SHOW DATABASES', $serveur)) {
649
-		while ($row = mysqli_fetch_assoc($res)) {
650
-			$dbs[] = $row['Database'];
651
-		}
652
-	}
653
-
654
-	return $dbs;
647
+    $dbs = [];
648
+    if ($res = spip_mysql_query('SHOW DATABASES', $serveur)) {
649
+        while ($row = mysqli_fetch_assoc($res)) {
650
+            $dbs[] = $row['Database'];
651
+        }
652
+    }
653
+
654
+    return $dbs;
655 655
 }
656 656
 
657 657
 
@@ -674,73 +674,73 @@  discard block
 block discarded – undo
674 674
  *     - true si la requête réussie, false sinon.
675 675
  */
676 676
 function spip_mysql_create(
677
-	$nom,
678
-	$champs,
679
-	$cles,
680
-	$autoinc = false,
681
-	$temporary = false,
682
-	$serveur = '',
683
-	$requeter = true
677
+    $nom,
678
+    $champs,
679
+    $cles,
680
+    $autoinc = false,
681
+    $temporary = false,
682
+    $serveur = '',
683
+    $requeter = true
684 684
 ) {
685 685
 
686
-	$query = '';
687
-	$keys = '';
688
-	$s = '';
689
-	$p = '';
690
-
691
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
692
-	// sans les renseigner (laisse le compilo recuperer la description)
693
-	if (!is_array($champs) || !is_array($cles)) {
694
-		return;
695
-	}
696
-
697
-	$res = spip_mysql_query('SELECT version() as v', $serveur);
698
-	if (($row = mysqli_fetch_array($res)) && (version_compare($row['v'], '5.0', '>='))) {
699
-		spip_mysql_query("SET sql_mode=''", $serveur);
700
-	}
701
-
702
-	foreach ($cles as $k => $v) {
703
-		$keys .= "$s\n\t\t$k ($v)";
704
-		if ($k == 'PRIMARY KEY') {
705
-			$p = $v;
706
-		}
707
-		$s = ',';
708
-	}
709
-	$s = '';
710
-
711
-	$character_set = '';
712
-	if (@$GLOBALS['meta']['charset_sql_base']) {
713
-		$character_set .= ' CHARACTER SET ' . $GLOBALS['meta']['charset_sql_base'];
714
-	}
715
-	if (@$GLOBALS['meta']['charset_collation_sql_base']) {
716
-		$character_set .= ' COLLATE ' . $GLOBALS['meta']['charset_collation_sql_base'];
717
-	}
718
-
719
-	foreach ($champs as $k => $v) {
720
-		$v = _mysql_remplacements_definitions_table($v);
721
-		if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) {
722
-			if (
723
-				preg_match(',(char|text),i', $defs[1])
724
-				and !preg_match(',(binary|CHARACTER|COLLATE),i', $v)
725
-			) {
726
-				$v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1]));
727
-			}
728
-		}
729
-
730
-		$query .= "$s\n\t\t$k $v"
731
-			. (($autoinc && ($p == $k) && preg_match(',\b(big|small|medium)?int\b,i', $v))
732
-				? ' auto_increment'
733
-				: ''
734
-			);
735
-		$s = ',';
736
-	}
737
-	$temporary = $temporary ? 'TEMPORARY' : '';
738
-	$q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ')'
739
-		. ' ENGINE=' . _MYSQL_ENGINE
740
-		. ($character_set ? " DEFAULT $character_set" : '')
741
-		. "\n";
742
-
743
-	return spip_mysql_query($q, $serveur);
686
+    $query = '';
687
+    $keys = '';
688
+    $s = '';
689
+    $p = '';
690
+
691
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
692
+    // sans les renseigner (laisse le compilo recuperer la description)
693
+    if (!is_array($champs) || !is_array($cles)) {
694
+        return;
695
+    }
696
+
697
+    $res = spip_mysql_query('SELECT version() as v', $serveur);
698
+    if (($row = mysqli_fetch_array($res)) && (version_compare($row['v'], '5.0', '>='))) {
699
+        spip_mysql_query("SET sql_mode=''", $serveur);
700
+    }
701
+
702
+    foreach ($cles as $k => $v) {
703
+        $keys .= "$s\n\t\t$k ($v)";
704
+        if ($k == 'PRIMARY KEY') {
705
+            $p = $v;
706
+        }
707
+        $s = ',';
708
+    }
709
+    $s = '';
710
+
711
+    $character_set = '';
712
+    if (@$GLOBALS['meta']['charset_sql_base']) {
713
+        $character_set .= ' CHARACTER SET ' . $GLOBALS['meta']['charset_sql_base'];
714
+    }
715
+    if (@$GLOBALS['meta']['charset_collation_sql_base']) {
716
+        $character_set .= ' COLLATE ' . $GLOBALS['meta']['charset_collation_sql_base'];
717
+    }
718
+
719
+    foreach ($champs as $k => $v) {
720
+        $v = _mysql_remplacements_definitions_table($v);
721
+        if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) {
722
+            if (
723
+                preg_match(',(char|text),i', $defs[1])
724
+                and !preg_match(',(binary|CHARACTER|COLLATE),i', $v)
725
+            ) {
726
+                $v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1]));
727
+            }
728
+        }
729
+
730
+        $query .= "$s\n\t\t$k $v"
731
+            . (($autoinc && ($p == $k) && preg_match(',\b(big|small|medium)?int\b,i', $v))
732
+                ? ' auto_increment'
733
+                : ''
734
+            );
735
+        $s = ',';
736
+    }
737
+    $temporary = $temporary ? 'TEMPORARY' : '';
738
+    $q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ')'
739
+        . ' ENGINE=' . _MYSQL_ENGINE
740
+        . ($character_set ? " DEFAULT $character_set" : '')
741
+        . "\n";
742
+
743
+    return spip_mysql_query($q, $serveur);
744 744
 }
745 745
 
746 746
 
@@ -753,25 +753,25 @@  discard block
 block discarded – undo
753 753
  *     Définition SQL adaptée pour MySQL d'un champ de table
754 754
  */
755 755
 function _mysql_remplacements_definitions_table($query) {
756
-	// quelques remplacements
757
-	$num = '(\s*\([0-9]*\))?';
758
-	$enum = '(\s*\([^\)]*\))?';
759
-
760
-	$remplace = [
761
-		'/VARCHAR(\s*[^\s\(])/is' => 'VARCHAR(255)\\1',
762
-		'/^TIMESTAMP($| NULL DEFAULT NULL)/is' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
763
-	];
764
-
765
-	if (is_string($query)) {
766
-		$query = preg_replace(array_keys($remplace), $remplace, $query);
767
-	} elseif (is_array($query)) {
768
-		$keys = array_keys($remplace);
769
-		foreach ($query as $k => $q) {
770
-			$query[$k] = preg_replace($keys, $remplace, $q);
771
-		}
772
-	}
773
-
774
-	return $query;
756
+    // quelques remplacements
757
+    $num = '(\s*\([0-9]*\))?';
758
+    $enum = '(\s*\([^\)]*\))?';
759
+
760
+    $remplace = [
761
+        '/VARCHAR(\s*[^\s\(])/is' => 'VARCHAR(255)\\1',
762
+        '/^TIMESTAMP($| NULL DEFAULT NULL)/is' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
763
+    ];
764
+
765
+    if (is_string($query)) {
766
+        $query = preg_replace(array_keys($remplace), $remplace, $query);
767
+    } elseif (is_array($query)) {
768
+        $keys = array_keys($remplace);
769
+        foreach ($query as $k => $q) {
770
+            $query[$k] = preg_replace($keys, $remplace, $q);
771
+        }
772
+    }
773
+
774
+    return $query;
775 775
 }
776 776
 
777 777
 
@@ -784,7 +784,7 @@  discard block
 block discarded – undo
784 784
  * @return bool true si la base est créee.
785 785
  **/
786 786
 function spip_mysql_create_base($nom, $serveur = '', $requeter = true) {
787
-	return spip_mysql_query("CREATE DATABASE `$nom`", $serveur, $requeter);
787
+    return spip_mysql_query("CREATE DATABASE `$nom`", $serveur, $requeter);
788 788
 }
789 789
 
790 790
 
@@ -805,19 +805,19 @@  discard block
 block discarded – undo
805 805
  *     - string texte de la requête si $requeter vaut false
806 806
  */
807 807
 function spip_mysql_create_view($nom, $query_select, $serveur = '', $requeter = true) {
808
-	if (!$query_select) {
809
-		return false;
810
-	}
811
-	// vue deja presente
812
-	if (sql_showtable($nom, false, $serveur)) {
813
-		spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", _LOG_ERREUR);
808
+    if (!$query_select) {
809
+        return false;
810
+    }
811
+    // vue deja presente
812
+    if (sql_showtable($nom, false, $serveur)) {
813
+        spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", _LOG_ERREUR);
814 814
 
815
-		return false;
816
-	}
815
+        return false;
816
+    }
817 817
 
818
-	$query = "CREATE VIEW $nom AS " . $query_select;
818
+    $query = "CREATE VIEW $nom AS " . $query_select;
819 819
 
820
-	return spip_mysql_query($query, $serveur, $requeter);
820
+    return spip_mysql_query($query, $serveur, $requeter);
821 821
 }
822 822
 
823 823
 
@@ -833,11 +833,11 @@  discard block
 block discarded – undo
833 833
  *     - true si la requête a réussie, false sinon
834 834
  */
835 835
 function spip_mysql_drop_table($table, $exist = '', $serveur = '', $requeter = true) {
836
-	if ($exist) {
837
-		$exist = ' IF EXISTS';
838
-	}
836
+    if ($exist) {
837
+        $exist = ' IF EXISTS';
838
+    }
839 839
 
840
-	return spip_mysql_query("DROP TABLE$exist $table", $serveur, $requeter);
840
+    return spip_mysql_query("DROP TABLE$exist $table", $serveur, $requeter);
841 841
 }
842 842
 
843 843
 /**
@@ -852,11 +852,11 @@  discard block
 block discarded – undo
852 852
  *     - true si la requête a réussie, false sinon
853 853
  */
854 854
 function spip_mysql_drop_view($view, $exist = '', $serveur = '', $requeter = true) {
855
-	if ($exist) {
856
-		$exist = ' IF EXISTS';
857
-	}
855
+    if ($exist) {
856
+        $exist = ' IF EXISTS';
857
+    }
858 858
 
859
-	return spip_mysql_query("DROP VIEW$exist $view", $serveur, $requeter);
859
+    return spip_mysql_query("DROP VIEW$exist $view", $serveur, $requeter);
860 860
 }
861 861
 
862 862
 /**
@@ -873,7 +873,7 @@  discard block
 block discarded – undo
873 873
  *     Ressource à utiliser avec sql_fetch()
874 874
  **/
875 875
 function spip_mysql_showbase($match, $serveur = '', $requeter = true) {
876
-	return spip_mysql_query('SHOW TABLES LIKE ' . _q($match), $serveur, $requeter);
876
+    return spip_mysql_query('SHOW TABLES LIKE ' . _q($match), $serveur, $requeter);
877 877
 }
878 878
 
879 879
 /**
@@ -889,17 +889,17 @@  discard block
 block discarded – undo
889 889
  *     - true si la requête a réussie, false sinon
890 890
  */
891 891
 function spip_mysql_repair($table, $serveur = '', $requeter = true) {
892
-	$table_status = spip_mysql_fetch(spip_mysql_query('SHOW TABLE STATUS WHERE Name = ' . _q($table), $serveur, true));
893
-	$engine = $table_status['Engine'];
894
-	if ($engine == 'InnoDB') {
895
-		if (spip_mysql_alter("TABLE $table ENGINE = InnoDB", $serveur, $requeter)) {
896
-			return [' OK '];
897
-		}
898
-	} elseif ($engine == 'MyISAM') {
899
-		return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
900
-	} else {
901
-		spip_log("spip_mysql_repair impossible pour la table $table engine $engine", 'mysql.' . _LOG_DEBUG);
902
-	}
892
+    $table_status = spip_mysql_fetch(spip_mysql_query('SHOW TABLE STATUS WHERE Name = ' . _q($table), $serveur, true));
893
+    $engine = $table_status['Engine'];
894
+    if ($engine == 'InnoDB') {
895
+        if (spip_mysql_alter("TABLE $table ENGINE = InnoDB", $serveur, $requeter)) {
896
+            return [' OK '];
897
+        }
898
+    } elseif ($engine == 'MyISAM') {
899
+        return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
900
+    } else {
901
+        spip_log("spip_mysql_repair impossible pour la table $table engine $engine", 'mysql.' . _LOG_DEBUG);
902
+    }
903 903
 }
904 904
 
905 905
 /**
@@ -917,12 +917,12 @@  discard block
 block discarded – undo
917 917
  *     - string : requete sql, si $requeter = true
918 918
  **/
919 919
 function spip_mysql_table_exists(string $table, $serveur = '', $requeter = true) {
920
-	$r = spip_mysql_query('SHOW TABLES LIKE ' . _q($table), $serveur, $requeter);
921
-	if (!$requeter) {
922
-		return $r;
923
-	}
924
-	$res = spip_mysql_fetch($r);
925
-	return (bool) $res;
920
+    $r = spip_mysql_query('SHOW TABLES LIKE ' . _q($table), $serveur, $requeter);
921
+    if (!$requeter) {
922
+        return $r;
923
+    }
924
+    $res = spip_mysql_fetch($r);
925
+    return (bool) $res;
926 926
 }
927 927
 
928 928
 define('_MYSQL_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
@@ -945,86 +945,86 @@  discard block
 block discarded – undo
945 945
  *     - array description de la table sinon
946 946
  */
947 947
 function spip_mysql_showtable($nom_table, $serveur = '', $requeter = true) {
948
-	$s = spip_mysql_query("SHOW CREATE TABLE `$nom_table`", $serveur, $requeter);
949
-	if (!$s) {
950
-		return '';
951
-	}
952
-	if (!$requeter) {
953
-		return $s;
954
-	}
955
-
956
-	[, $a] = mysqli_fetch_array($s, MYSQLI_NUM);
957
-	if (preg_match(_MYSQL_RE_SHOW_TABLE, $a, $r)) {
958
-		$desc = $r[1];
959
-		// extraction d'une KEY éventuelle en prenant garde de ne pas
960
-		// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
961
-		if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
962
-			$namedkeys = $r[2];
963
-			$desc = $r[1];
964
-		} else {
965
-			$namedkeys = '';
966
-		}
967
-
968
-		$fields = [];
969
-		foreach (preg_split('/,\s*`/', $desc) as $v) {
970
-			preg_match('/^\s*`?([^`]*)`\s*(.*)/', $v, $r);
971
-			$fields[strtolower($r[1])] = $r[2];
972
-		}
973
-		$keys = [];
974
-
975
-		foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
976
-			if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
977
-				$k = str_replace('`', '', trim($r[1]));
978
-				$t = strtolower(str_replace('`', '', $r[2]));
979
-				if ($k && !isset($keys[$k])) {
980
-					$keys[$k] = $t;
981
-				} else {
982
-					$keys[] = $t;
983
-				}
984
-			}
985
-		}
986
-		spip_mysql_free($s);
987
-
988
-		return ['field' => $fields, 'key' => $keys];
989
-	}
990
-
991
-	$res = spip_mysql_query("SHOW COLUMNS FROM `$nom_table`", $serveur);
992
-	if ($res) {
993
-		$nfields = [];
994
-		$nkeys = [];
995
-		while ($val = spip_mysql_fetch($res)) {
996
-			$nfields[$val['Field']] = $val['Type'];
997
-			if ($val['Null'] == 'NO') {
998
-				$nfields[$val['Field']] .= ' NOT NULL';
999
-			}
1000
-			if ($val['Default'] === '0' || $val['Default']) {
1001
-				if (preg_match('/[A-Z_]/', $val['Default'])) {
1002
-					$nfields[$val['Field']] .= ' DEFAULT ' . $val['Default'];
1003
-				} else {
1004
-					$nfields[$val['Field']] .= " DEFAULT '" . $val['Default'] . "'";
1005
-				}
1006
-			}
1007
-			if ($val['Extra']) {
1008
-				$nfields[$val['Field']] .= ' ' . $val['Extra'];
1009
-			}
1010
-			if ($val['Key'] == 'PRI') {
1011
-				$nkeys['PRIMARY KEY'] = $val['Field'];
1012
-			} else {
1013
-				if ($val['Key'] == 'MUL') {
1014
-					$nkeys['KEY ' . $val['Field']] = $val['Field'];
1015
-				} else {
1016
-					if ($val['Key'] == 'UNI') {
1017
-						$nkeys['UNIQUE KEY ' . $val['Field']] = $val['Field'];
1018
-					}
1019
-				}
1020
-			}
1021
-		}
1022
-		spip_mysql_free($res);
1023
-
1024
-		return ['field' => $nfields, 'key' => $nkeys];
1025
-	}
1026
-
1027
-	return '';
948
+    $s = spip_mysql_query("SHOW CREATE TABLE `$nom_table`", $serveur, $requeter);
949
+    if (!$s) {
950
+        return '';
951
+    }
952
+    if (!$requeter) {
953
+        return $s;
954
+    }
955
+
956
+    [, $a] = mysqli_fetch_array($s, MYSQLI_NUM);
957
+    if (preg_match(_MYSQL_RE_SHOW_TABLE, $a, $r)) {
958
+        $desc = $r[1];
959
+        // extraction d'une KEY éventuelle en prenant garde de ne pas
960
+        // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
961
+        if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
962
+            $namedkeys = $r[2];
963
+            $desc = $r[1];
964
+        } else {
965
+            $namedkeys = '';
966
+        }
967
+
968
+        $fields = [];
969
+        foreach (preg_split('/,\s*`/', $desc) as $v) {
970
+            preg_match('/^\s*`?([^`]*)`\s*(.*)/', $v, $r);
971
+            $fields[strtolower($r[1])] = $r[2];
972
+        }
973
+        $keys = [];
974
+
975
+        foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
976
+            if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
977
+                $k = str_replace('`', '', trim($r[1]));
978
+                $t = strtolower(str_replace('`', '', $r[2]));
979
+                if ($k && !isset($keys[$k])) {
980
+                    $keys[$k] = $t;
981
+                } else {
982
+                    $keys[] = $t;
983
+                }
984
+            }
985
+        }
986
+        spip_mysql_free($s);
987
+
988
+        return ['field' => $fields, 'key' => $keys];
989
+    }
990
+
991
+    $res = spip_mysql_query("SHOW COLUMNS FROM `$nom_table`", $serveur);
992
+    if ($res) {
993
+        $nfields = [];
994
+        $nkeys = [];
995
+        while ($val = spip_mysql_fetch($res)) {
996
+            $nfields[$val['Field']] = $val['Type'];
997
+            if ($val['Null'] == 'NO') {
998
+                $nfields[$val['Field']] .= ' NOT NULL';
999
+            }
1000
+            if ($val['Default'] === '0' || $val['Default']) {
1001
+                if (preg_match('/[A-Z_]/', $val['Default'])) {
1002
+                    $nfields[$val['Field']] .= ' DEFAULT ' . $val['Default'];
1003
+                } else {
1004
+                    $nfields[$val['Field']] .= " DEFAULT '" . $val['Default'] . "'";
1005
+                }
1006
+            }
1007
+            if ($val['Extra']) {
1008
+                $nfields[$val['Field']] .= ' ' . $val['Extra'];
1009
+            }
1010
+            if ($val['Key'] == 'PRI') {
1011
+                $nkeys['PRIMARY KEY'] = $val['Field'];
1012
+            } else {
1013
+                if ($val['Key'] == 'MUL') {
1014
+                    $nkeys['KEY ' . $val['Field']] = $val['Field'];
1015
+                } else {
1016
+                    if ($val['Key'] == 'UNI') {
1017
+                        $nkeys['UNIQUE KEY ' . $val['Field']] = $val['Field'];
1018
+                    }
1019
+                }
1020
+            }
1021
+        }
1022
+        spip_mysql_free($res);
1023
+
1024
+        return ['field' => $nfields, 'key' => $nkeys];
1025
+    }
1026
+
1027
+    return '';
1028 1028
 }
1029 1029
 
1030 1030
 
@@ -1043,13 +1043,13 @@  discard block
 block discarded – undo
1043 1043
  *     - false Erreur
1044 1044
  */
1045 1045
 function spip_mysql_fetch($r, $t = '', $serveur = '', $requeter = true) {
1046
-	if (!$t) {
1047
-		$t = \MYSQLI_ASSOC;
1048
-	}
1049
-	if ($r) {
1050
-		return mysqli_fetch_array($r, $t);
1051
-	}
1052
-	return false;
1046
+    if (!$t) {
1047
+        $t = \MYSQLI_ASSOC;
1048
+    }
1049
+    if ($r) {
1050
+        return mysqli_fetch_array($r, $t);
1051
+    }
1052
+    return false;
1053 1053
 }
1054 1054
 
1055 1055
 /**
@@ -1062,9 +1062,9 @@  discard block
 block discarded – undo
1062 1062
  * @return bool True si déplacement réussi, false sinon.
1063 1063
  **/
1064 1064
 function spip_mysql_seek($r, $row_number, $serveur = '', $requeter = true) {
1065
-	if ($r and mysqli_num_rows($r)) {
1066
-		return mysqli_data_seek($r, $row_number);
1067
-	}
1065
+    if ($r and mysqli_num_rows($r)) {
1066
+        return mysqli_data_seek($r, $row_number);
1067
+    }
1068 1068
 }
1069 1069
 
1070 1070
 
@@ -1082,26 +1082,26 @@  discard block
 block discarded – undo
1082 1082
  *     - int Nombre de lignes (0 si la requête n'a pas réussie)
1083 1083
  **/
1084 1084
 function spip_mysql_countsel(
1085
-	$from = [],
1086
-	$where = [],
1087
-	$groupby = '',
1088
-	$having = [],
1089
-	$serveur = '',
1090
-	$requeter = true
1085
+    $from = [],
1086
+    $where = [],
1087
+    $groupby = '',
1088
+    $having = [],
1089
+    $serveur = '',
1090
+    $requeter = true
1091 1091
 ) {
1092
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
1093
-
1094
-	$r = spip_mysql_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
1095
-	if (!$requeter) {
1096
-		return $r;
1097
-	}
1098
-	if (!$r instanceof mysqli_result) {
1099
-		return 0;
1100
-	}
1101
-	[$c] = mysqli_fetch_array($r, MYSQLI_NUM);
1102
-	mysqli_free_result($r);
1103
-
1104
-	return $c;
1092
+    $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
1093
+
1094
+    $r = spip_mysql_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
1095
+    if (!$requeter) {
1096
+        return $r;
1097
+    }
1098
+    if (!$r instanceof mysqli_result) {
1099
+        return 0;
1100
+    }
1101
+    [$c] = mysqli_fetch_array($r, MYSQLI_NUM);
1102
+    mysqli_free_result($r);
1103
+
1104
+    return $c;
1105 1105
 }
1106 1106
 
1107 1107
 
@@ -1124,16 +1124,16 @@  discard block
 block discarded – undo
1124 1124
  *     Erreur eventuelle
1125 1125
  **/
1126 1126
 function spip_mysql_error($query = '', $serveur = '', $requeter = true) {
1127
-	$link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link'];
1128
-	$s = mysqli_error($link);
1129
-	if ($s) {
1130
-		$trace = debug_backtrace();
1131
-		if ($trace[0]['function'] != 'spip_mysql_error') {
1132
-			spip_log("$s - $query - " . sql_error_backtrace(), 'mysql.' . _LOG_ERREUR);
1133
-		}
1134
-	}
1135
-
1136
-	return $s;
1127
+    $link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link'];
1128
+    $s = mysqli_error($link);
1129
+    if ($s) {
1130
+        $trace = debug_backtrace();
1131
+        if ($trace[0]['function'] != 'spip_mysql_error') {
1132
+            spip_log("$s - $query - " . sql_error_backtrace(), 'mysql.' . _LOG_ERREUR);
1133
+        }
1134
+    }
1135
+
1136
+    return $s;
1137 1137
 }
1138 1138
 
1139 1139
 
@@ -1148,18 +1148,18 @@  discard block
 block discarded – undo
1148 1148
  *     0, pas d'erreur. Autre, numéro de l'erreur.
1149 1149
  **/
1150 1150
 function spip_mysql_errno($serveur = '', $requeter = true) {
1151
-	$link = $GLOBALS['connexions'][$serveur ?: 0]['link'];
1152
-	$s = mysqli_errno($link);
1153
-	// 2006 MySQL server has gone away
1154
-	// 2013 Lost connection to MySQL server during query
1155
-	if (in_array($s, [2006, 2013])) {
1156
-		define('spip_interdire_cache', true);
1157
-	}
1158
-	if ($s) {
1159
-		spip_log("Erreur mysql $s", _LOG_ERREUR);
1160
-	}
1161
-
1162
-	return $s;
1151
+    $link = $GLOBALS['connexions'][$serveur ?: 0]['link'];
1152
+    $s = mysqli_errno($link);
1153
+    // 2006 MySQL server has gone away
1154
+    // 2013 Lost connection to MySQL server during query
1155
+    if (in_array($s, [2006, 2013])) {
1156
+        define('spip_interdire_cache', true);
1157
+    }
1158
+    if ($s) {
1159
+        spip_log("Erreur mysql $s", _LOG_ERREUR);
1160
+    }
1161
+
1162
+    return $s;
1163 1163
 }
1164 1164
 
1165 1165
 
@@ -1173,9 +1173,9 @@  discard block
 block discarded – undo
1173 1173
  * @return int               Nombre de lignes
1174 1174
  */
1175 1175
 function spip_mysql_count($r, $serveur = '', $requeter = true) {
1176
-	if ($r) {
1177
-		return mysqli_num_rows($r);
1178
-	}
1176
+    if ($r) {
1177
+        return mysqli_num_rows($r);
1178
+    }
1179 1179
 }
1180 1180
 
1181 1181
 
@@ -1191,7 +1191,7 @@  discard block
 block discarded – undo
1191 1191
  * @return bool              True si réussi
1192 1192
  */
1193 1193
 function spip_mysql_free($r, $serveur = '', $requeter = true) {
1194
-	return (($r instanceof mysqli_result) ? mysqli_free_result($r) : false);
1194
+    return (($r instanceof mysqli_result) ? mysqli_free_result($r) : false);
1195 1195
 }
1196 1196
 
1197 1197
 
@@ -1219,59 +1219,59 @@  discard block
 block discarded – undo
1219 1219
  **/
1220 1220
 function spip_mysql_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true) {
1221 1221
 
1222
-	$e = null;
1223
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1224
-	$link = $connexion['link'];
1225
-	$table = prefixer_table_spip($table, $connexion['prefixe']);
1226
-
1227
-	// remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
1228
-	if (
1229
-		defined('_MYSQL_NOPLANES')
1230
-		and _MYSQL_NOPLANES
1231
-		and !empty($GLOBALS['meta']['charset_sql_connexion'])
1232
-		and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
1233
-	) {
1234
-		include_spip('inc/charsets');
1235
-		$valeurs = utf8_noplanes($valeurs);
1236
-	}
1237
-
1238
-	$query = "INSERT INTO $table $champs VALUES $valeurs";
1239
-	if (!$requeter) {
1240
-		return $query;
1241
-	}
1242
-
1243
-	if (isset($_GET['var_profile'])) {
1244
-		include_spip('public/tracer');
1245
-		$t = trace_query_start();
1246
-		$e = '';
1247
-	} else {
1248
-		$t = 0;
1249
-	}
1250
-
1251
-	$connexion['last'] = $query;
1252
-	#spip_log($query, 'mysql.'._LOG_DEBUG);
1253
-	$r = false;
1254
-	$insert = false;
1255
-	try {
1256
-		$insert = mysqli_query($link, $query);
1257
-	} catch (\mysqli_sql_exception $e) {
1258
-		spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
1259
-		// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
1260
-		// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
1261
-	}
1262
-	if ($insert) {
1263
-		$r = mysqli_insert_id($link);
1264
-	} else {
1265
-		// Log de l'erreur eventuelle
1266
-		if ($e = spip_mysql_errno($serveur)) {
1267
-			// et du fautif
1268
-			$e .= spip_mysql_error($query, $serveur);
1269
-		}
1270
-	}
1271
-
1272
-	return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
1273
-
1274
-	// return $r ? $r : (($r===0) ? -1 : 0); pb avec le multi-base.
1222
+    $e = null;
1223
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1224
+    $link = $connexion['link'];
1225
+    $table = prefixer_table_spip($table, $connexion['prefixe']);
1226
+
1227
+    // remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
1228
+    if (
1229
+        defined('_MYSQL_NOPLANES')
1230
+        and _MYSQL_NOPLANES
1231
+        and !empty($GLOBALS['meta']['charset_sql_connexion'])
1232
+        and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
1233
+    ) {
1234
+        include_spip('inc/charsets');
1235
+        $valeurs = utf8_noplanes($valeurs);
1236
+    }
1237
+
1238
+    $query = "INSERT INTO $table $champs VALUES $valeurs";
1239
+    if (!$requeter) {
1240
+        return $query;
1241
+    }
1242
+
1243
+    if (isset($_GET['var_profile'])) {
1244
+        include_spip('public/tracer');
1245
+        $t = trace_query_start();
1246
+        $e = '';
1247
+    } else {
1248
+        $t = 0;
1249
+    }
1250
+
1251
+    $connexion['last'] = $query;
1252
+    #spip_log($query, 'mysql.'._LOG_DEBUG);
1253
+    $r = false;
1254
+    $insert = false;
1255
+    try {
1256
+        $insert = mysqli_query($link, $query);
1257
+    } catch (\mysqli_sql_exception $e) {
1258
+        spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
1259
+        // TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
1260
+        // mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
1261
+    }
1262
+    if ($insert) {
1263
+        $r = mysqli_insert_id($link);
1264
+    } else {
1265
+        // Log de l'erreur eventuelle
1266
+        if ($e = spip_mysql_errno($serveur)) {
1267
+            // et du fautif
1268
+            $e .= spip_mysql_error($query, $serveur);
1269
+        }
1270
+    }
1271
+
1272
+    return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
1273
+
1274
+    // return $r ? $r : (($r===0) ? -1 : 0); pb avec le multi-base.
1275 1275
 }
1276 1276
 
1277 1277
 /**
@@ -1296,26 +1296,26 @@  discard block
 block discarded – undo
1296 1296
  **/
1297 1297
 function spip_mysql_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true) {
1298 1298
 
1299
-	if (!$desc) {
1300
-		$desc = description_table($table, $serveur);
1301
-	}
1302
-	if (!$desc) {
1303
-		$couples = [];
1304
-	}
1305
-	$fields = $desc['field'] ?? [];
1306
-
1307
-	foreach ($couples as $champ => $val) {
1308
-		$couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1309
-	}
1310
-
1311
-	return spip_mysql_insert(
1312
-		$table,
1313
-		'(' . join(',', array_keys($couples)) . ')',
1314
-		'(' . join(',', $couples) . ')',
1315
-		$desc,
1316
-		$serveur,
1317
-		$requeter
1318
-	);
1299
+    if (!$desc) {
1300
+        $desc = description_table($table, $serveur);
1301
+    }
1302
+    if (!$desc) {
1303
+        $couples = [];
1304
+    }
1305
+    $fields = $desc['field'] ?? [];
1306
+
1307
+    foreach ($couples as $champ => $val) {
1308
+        $couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1309
+    }
1310
+
1311
+    return spip_mysql_insert(
1312
+        $table,
1313
+        '(' . join(',', array_keys($couples)) . ')',
1314
+        '(' . join(',', $couples) . ')',
1315
+        $desc,
1316
+        $serveur,
1317
+        $requeter
1318
+    );
1319 1319
 }
1320 1320
 
1321 1321
 
@@ -1340,34 +1340,34 @@  discard block
 block discarded – undo
1340 1340
  **/
1341 1341
 function spip_mysql_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true) {
1342 1342
 
1343
-	if (!$desc) {
1344
-		$desc = description_table($table, $serveur);
1345
-	}
1346
-	if (!$desc) {
1347
-		$tab_couples = [];
1348
-	}
1349
-	$fields = $desc['field'] ?? [];
1350
-
1351
-	$cles = '(' . join(',', array_keys(reset($tab_couples))) . ')';
1352
-	$valeurs = [];
1353
-	$r = false;
1354
-
1355
-	// Quoter et Inserer par groupes de 100 max pour eviter un debordement de pile
1356
-	foreach ($tab_couples as $couples) {
1357
-		foreach ($couples as $champ => $val) {
1358
-			$couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1359
-		}
1360
-		$valeurs[] = '(' . join(',', $couples) . ')';
1361
-		if (count($valeurs) >= 100) {
1362
-			$r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1363
-			$valeurs = [];
1364
-		}
1365
-	}
1366
-	if (count($valeurs)) {
1367
-		$r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1368
-	}
1369
-
1370
-	return $r; // dans le cas d'une table auto_increment, le dernier insert_id
1343
+    if (!$desc) {
1344
+        $desc = description_table($table, $serveur);
1345
+    }
1346
+    if (!$desc) {
1347
+        $tab_couples = [];
1348
+    }
1349
+    $fields = $desc['field'] ?? [];
1350
+
1351
+    $cles = '(' . join(',', array_keys(reset($tab_couples))) . ')';
1352
+    $valeurs = [];
1353
+    $r = false;
1354
+
1355
+    // Quoter et Inserer par groupes de 100 max pour eviter un debordement de pile
1356
+    foreach ($tab_couples as $couples) {
1357
+        foreach ($couples as $champ => $val) {
1358
+            $couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1359
+        }
1360
+        $valeurs[] = '(' . join(',', $couples) . ')';
1361
+        if (count($valeurs) >= 100) {
1362
+            $r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1363
+            $valeurs = [];
1364
+        }
1365
+    }
1366
+    if (count($valeurs)) {
1367
+        $r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1368
+    }
1369
+
1370
+    return $r; // dans le cas d'une table auto_increment, le dernier insert_id
1371 1371
 }
1372 1372
 
1373 1373
 /**
@@ -1392,19 +1392,19 @@  discard block
 block discarded – undo
1392 1392
  *     - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif
1393 1393
  */
1394 1394
 function spip_mysql_update($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1395
-	$set = [];
1396
-	foreach ($champs as $champ => $val) {
1397
-		$set[] = $champ . "=$val";
1398
-	}
1399
-	if (!empty($set)) {
1400
-		return spip_mysql_query(
1401
-			calculer_mysql_expression('UPDATE', $table, ',')
1402
-			. calculer_mysql_expression('SET', $set, ',')
1403
-			. calculer_mysql_expression('WHERE', $where),
1404
-			$serveur,
1405
-			$requeter
1406
-		);
1407
-	}
1395
+    $set = [];
1396
+    foreach ($champs as $champ => $val) {
1397
+        $set[] = $champ . "=$val";
1398
+    }
1399
+    if (!empty($set)) {
1400
+        return spip_mysql_query(
1401
+            calculer_mysql_expression('UPDATE', $table, ',')
1402
+            . calculer_mysql_expression('SET', $set, ',')
1403
+            . calculer_mysql_expression('WHERE', $where),
1404
+            $serveur,
1405
+            $requeter
1406
+        );
1407
+    }
1408 1408
 }
1409 1409
 
1410 1410
 /**
@@ -1437,29 +1437,29 @@  discard block
 block discarded – undo
1437 1437
  */
1438 1438
 function spip_mysql_updateq($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1439 1439
 
1440
-	if (!$champs) {
1441
-		return;
1442
-	}
1443
-	if (!$desc) {
1444
-		$desc = description_table($table, $serveur);
1445
-	}
1446
-	if (!$desc) {
1447
-		$champs = [];
1448
-	} else {
1449
-		$fields = $desc['field'];
1450
-	}
1451
-	$set = [];
1452
-	foreach ($champs as $champ => $val) {
1453
-		$set[] = $champ . '=' . spip_mysql_cite($val, @$fields[$champ]);
1454
-	}
1455
-
1456
-	return spip_mysql_query(
1457
-		calculer_mysql_expression('UPDATE', $table, ',')
1458
-		. calculer_mysql_expression('SET', $set, ',')
1459
-		. calculer_mysql_expression('WHERE', $where),
1460
-		$serveur,
1461
-		$requeter
1462
-	);
1440
+    if (!$champs) {
1441
+        return;
1442
+    }
1443
+    if (!$desc) {
1444
+        $desc = description_table($table, $serveur);
1445
+    }
1446
+    if (!$desc) {
1447
+        $champs = [];
1448
+    } else {
1449
+        $fields = $desc['field'];
1450
+    }
1451
+    $set = [];
1452
+    foreach ($champs as $champ => $val) {
1453
+        $set[] = $champ . '=' . spip_mysql_cite($val, @$fields[$champ]);
1454
+    }
1455
+
1456
+    return spip_mysql_query(
1457
+        calculer_mysql_expression('UPDATE', $table, ',')
1458
+        . calculer_mysql_expression('SET', $set, ',')
1459
+        . calculer_mysql_expression('WHERE', $where),
1460
+        $serveur,
1461
+        $requeter
1462
+    );
1463 1463
 }
1464 1464
 
1465 1465
 /**
@@ -1475,22 +1475,22 @@  discard block
 block discarded – undo
1475 1475
  *     - False en cas d'erreur.
1476 1476
  **/
1477 1477
 function spip_mysql_delete($table, $where = '', $serveur = '', $requeter = true) {
1478
-	$res = spip_mysql_query(
1479
-		calculer_mysql_expression('DELETE FROM', $table, ',')
1480
-		. calculer_mysql_expression('WHERE', $where),
1481
-		$serveur,
1482
-		$requeter
1483
-	);
1484
-	if (!$requeter) {
1485
-		return $res;
1486
-	}
1487
-	if ($res) {
1488
-		$link = _mysql_link($serveur);
1489
-
1490
-		return mysqli_affected_rows($link);
1491
-	} else {
1492
-		return false;
1493
-	}
1478
+    $res = spip_mysql_query(
1479
+        calculer_mysql_expression('DELETE FROM', $table, ',')
1480
+        . calculer_mysql_expression('WHERE', $where),
1481
+        $serveur,
1482
+        $requeter
1483
+    );
1484
+    if (!$requeter) {
1485
+        return $res;
1486
+    }
1487
+    if ($res) {
1488
+        $link = _mysql_link($serveur);
1489
+
1490
+        return mysqli_affected_rows($link);
1491
+    } else {
1492
+        return false;
1493
+    }
1494 1494
 }
1495 1495
 
1496 1496
 
@@ -1519,10 +1519,10 @@  discard block
 block discarded – undo
1519 1519
  *     - False en cas d'erreur.
1520 1520
  **/
1521 1521
 function spip_mysql_replace($table, $couples, $desc = [], $serveur = '', $requeter = true) {
1522
-	return spip_mysql_query("REPLACE $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1523
-		',',
1524
-		array_map('_q', $couples)
1525
-	) . ')', $serveur, $requeter);
1522
+    return spip_mysql_query("REPLACE $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1523
+        ',',
1524
+        array_map('_q', $couples)
1525
+    ) . ')', $serveur, $requeter);
1526 1526
 }
1527 1527
 
1528 1528
 
@@ -1551,14 +1551,14 @@  discard block
 block discarded – undo
1551 1551
  *     - False en cas d'erreur.
1552 1552
  **/
1553 1553
 function spip_mysql_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true) {
1554
-	$cles = '(' . join(',', array_keys($tab_couples[0])) . ')';
1555
-	$valeurs = [];
1556
-	foreach ($tab_couples as $couples) {
1557
-		$valeurs[] = '(' . join(',', array_map('_q', $couples)) . ')';
1558
-	}
1559
-	$valeurs = implode(', ', $valeurs);
1560
-
1561
-	return spip_mysql_query("REPLACE $table $cles VALUES $valeurs", $serveur, $requeter);
1554
+    $cles = '(' . join(',', array_keys($tab_couples[0])) . ')';
1555
+    $valeurs = [];
1556
+    foreach ($tab_couples as $couples) {
1557
+        $valeurs[] = '(' . join(',', array_map('_q', $couples)) . ')';
1558
+    }
1559
+    $valeurs = implode(', ', $valeurs);
1560
+
1561
+    return spip_mysql_query("REPLACE $table $cles VALUES $valeurs", $serveur, $requeter);
1562 1562
 }
1563 1563
 
1564 1564
 
@@ -1573,32 +1573,32 @@  discard block
 block discarded – undo
1573 1573
  * @return string       Texte de sélection pour la requête
1574 1574
  */
1575 1575
 function spip_mysql_multi($objet, $lang) {
1576
-	$lengthlang = strlen("[$lang]");
1577
-	$posmulti = 'INSTR(' . $objet . ", '<multi>')";
1578
-	$posfinmulti = 'INSTR(' . $objet . ", '</multi>')";
1579
-	$debutchaine = 'LEFT(' . $objet . ", $posmulti-1)";
1580
-	$finchaine = 'RIGHT(' . $objet . ', CHAR_LENGTH(' . $objet . ") -(7+$posfinmulti))";
1581
-	$chainemulti = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7, $posfinmulti -(7+$posmulti)))";
1582
-	$poslang = "INSTR($chainemulti,'[" . $lang . "]')";
1583
-	$poslang = "IF($poslang=0,INSTR($chainemulti,']')+1,$poslang+$lengthlang)";
1584
-	$chainelang = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))";
1585
-	$posfinlang = 'INSTR(' . $chainelang . ", '[')";
1586
-	$chainelang = "IF($posfinlang>0,LEFT($chainelang,$posfinlang-1),$chainelang)";
1587
-	//$chainelang = "LEFT($chainelang,$posfinlang-1)";
1588
-	$retour = "(TRIM(IF($posmulti = 0 , " .
1589
-		'     TRIM(' . $objet . '), ' .
1590
-		'     CONCAT( ' .
1591
-		"          $debutchaine, " .
1592
-		'          IF( ' .
1593
-		"               $poslang = 0, " .
1594
-		"                     $chainemulti, " .
1595
-		"               $chainelang" .
1596
-		'          ), ' .
1597
-		"          $finchaine" .
1598
-		'     ) ' .
1599
-		'))) AS multi';
1600
-
1601
-	return $retour;
1576
+    $lengthlang = strlen("[$lang]");
1577
+    $posmulti = 'INSTR(' . $objet . ", '<multi>')";
1578
+    $posfinmulti = 'INSTR(' . $objet . ", '</multi>')";
1579
+    $debutchaine = 'LEFT(' . $objet . ", $posmulti-1)";
1580
+    $finchaine = 'RIGHT(' . $objet . ', CHAR_LENGTH(' . $objet . ") -(7+$posfinmulti))";
1581
+    $chainemulti = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7, $posfinmulti -(7+$posmulti)))";
1582
+    $poslang = "INSTR($chainemulti,'[" . $lang . "]')";
1583
+    $poslang = "IF($poslang=0,INSTR($chainemulti,']')+1,$poslang+$lengthlang)";
1584
+    $chainelang = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))";
1585
+    $posfinlang = 'INSTR(' . $chainelang . ", '[')";
1586
+    $chainelang = "IF($posfinlang>0,LEFT($chainelang,$posfinlang-1),$chainelang)";
1587
+    //$chainelang = "LEFT($chainelang,$posfinlang-1)";
1588
+    $retour = "(TRIM(IF($posmulti = 0 , " .
1589
+        '     TRIM(' . $objet . '), ' .
1590
+        '     CONCAT( ' .
1591
+        "          $debutchaine, " .
1592
+        '          IF( ' .
1593
+        "               $poslang = 0, " .
1594
+        "                     $chainemulti, " .
1595
+        "               $chainelang" .
1596
+        '          ), ' .
1597
+        "          $finchaine" .
1598
+        '     ) ' .
1599
+        '))) AS multi';
1600
+
1601
+    return $retour;
1602 1602
 }
1603 1603
 
1604 1604
 /**
@@ -1612,7 +1612,7 @@  discard block
 block discarded – undo
1612 1612
  *     Valeur hexadécimale pour MySQL
1613 1613
  **/
1614 1614
 function spip_mysql_hex($v) {
1615
-	return '0x' . $v;
1615
+    return '0x' . $v;
1616 1616
 }
1617 1617
 
1618 1618
 /**
@@ -1628,15 +1628,15 @@  discard block
 block discarded – undo
1628 1628
  *    Donnée prête à être utilisée par le gestionnaire SQL
1629 1629
  */
1630 1630
 function spip_mysql_quote($v, $type = '') {
1631
-	if (!is_array($v)) {
1632
-		return spip_mysql_cite($v, $type);
1633
-	}
1634
-
1635
-	// si c'est un tableau, le parcourir en propageant le type
1636
-	foreach ($v as $k => $r) {
1637
-		$v[$k] = spip_mysql_quote($r, $type);
1638
-	}
1639
-	return implode(',', $v);
1631
+    if (!is_array($v)) {
1632
+        return spip_mysql_cite($v, $type);
1633
+    }
1634
+
1635
+    // si c'est un tableau, le parcourir en propageant le type
1636
+    foreach ($v as $k => $r) {
1637
+        $v[$k] = spip_mysql_quote($r, $type);
1638
+    }
1639
+    return implode(',', $v);
1640 1640
 }
1641 1641
 
1642 1642
 /**
@@ -1652,18 +1652,18 @@  discard block
 block discarded – undo
1652 1652
  *     Expression SQL
1653 1653
  **/
1654 1654
 function spip_mysql_date_proche($champ, $interval, $unite) {
1655
-	$use_now = ( ($champ === 'maj' or strpos($champ, '.maj')) ? true : false );
1656
-	return '('
1657
-	. $champ
1658
-	. (($interval <= 0) ? '>' : '<')
1659
-	. (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
1660
-	. '('
1661
-	. ($use_now ? 'NOW()' : sql_quote(date('Y-m-d H:i:s')))
1662
-	. ', INTERVAL '
1663
-	. (($interval > 0) ? $interval : (0 - $interval))
1664
-	. ' '
1665
-	. $unite
1666
-	. '))';
1655
+    $use_now = ( ($champ === 'maj' or strpos($champ, '.maj')) ? true : false );
1656
+    return '('
1657
+    . $champ
1658
+    . (($interval <= 0) ? '>' : '<')
1659
+    . (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
1660
+    . '('
1661
+    . ($use_now ? 'NOW()' : sql_quote(date('Y-m-d H:i:s')))
1662
+    . ', INTERVAL '
1663
+    . (($interval > 0) ? $interval : (0 - $interval))
1664
+    . ' '
1665
+    . $unite
1666
+    . '))';
1667 1667
 }
1668 1668
 
1669 1669
 
@@ -1687,7 +1687,7 @@  discard block
 block discarded – undo
1687 1687
  *     Expression de requête SQL
1688 1688
  **/
1689 1689
 function spip_mysql_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) {
1690
-	return "($val $not IN ($valeurs))";
1690
+    return "($val $not IN ($valeurs))";
1691 1691
 }
1692 1692
 
1693 1693
 
@@ -1699,39 +1699,39 @@  discard block
 block discarded – undo
1699 1699
  * @return string|number     Texte ou nombre échappé
1700 1700
  */
1701 1701
 function spip_mysql_cite($v, $type) {
1702
-	if (!$type) {
1703
-		if (is_bool($v)) {
1704
-			return strval(intval($v));
1705
-		} elseif (is_numeric($v)) {
1706
-			return strval($v);
1707
-		} elseif ($v === null) {
1708
-			return "''";
1709
-		}
1710
-		return "'" . addslashes($v) . "'";
1711
-	}
1712
-
1713
-	if ($v === null) {
1714
-		if (stripos($type, 'NOT NULL') === false) {
1715
-			// null php se traduit en NULL SQL
1716
-			return 'NULL';
1717
-		} else {
1718
-			return "''";
1719
-		}
1720
-	} elseif (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
1721
-		return $v;
1722
-	} elseif (sql_test_int($type)) {
1723
-		if (
1724
-			is_numeric($v)
1725
-			or ($v and ctype_xdigit(substr($v, 2)) and $v[0] === '0' and $v[1] === 'x')
1726
-		) {
1727
-			return $v;
1728
-		} else {
1729
-			// si pas numerique, forcer le intval
1730
-			return intval($v);
1731
-		}
1732
-	}
1733
-
1734
-	return ("'" . addslashes($v) . "'");
1702
+    if (!$type) {
1703
+        if (is_bool($v)) {
1704
+            return strval(intval($v));
1705
+        } elseif (is_numeric($v)) {
1706
+            return strval($v);
1707
+        } elseif ($v === null) {
1708
+            return "''";
1709
+        }
1710
+        return "'" . addslashes($v) . "'";
1711
+    }
1712
+
1713
+    if ($v === null) {
1714
+        if (stripos($type, 'NOT NULL') === false) {
1715
+            // null php se traduit en NULL SQL
1716
+            return 'NULL';
1717
+        } else {
1718
+            return "''";
1719
+        }
1720
+    } elseif (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
1721
+        return $v;
1722
+    } elseif (sql_test_int($type)) {
1723
+        if (
1724
+            is_numeric($v)
1725
+            or ($v and ctype_xdigit(substr($v, 2)) and $v[0] === '0' and $v[1] === 'x')
1726
+        ) {
1727
+            return $v;
1728
+        } else {
1729
+            // si pas numerique, forcer le intval
1730
+            return intval($v);
1731
+        }
1732
+    }
1733
+
1734
+    return ("'" . addslashes($v) . "'");
1735 1735
 }
1736 1736
 
1737 1737
 /**
@@ -1741,7 +1741,7 @@  discard block
 block discarded – undo
1741 1741
  *     True si on a les fonctions, false sinon
1742 1742
  */
1743 1743
 function spip_versions_mysql() {
1744
-	return function_exists('mysqli_query');
1744
+    return function_exists('mysqli_query');
1745 1745
 }
1746 1746
 
1747 1747
 
@@ -1754,20 +1754,20 @@  discard block
 block discarded – undo
1754 1754
  *     - chaîne : code compilé pour le faire désactiver par SPIP sinon
1755 1755
  */
1756 1756
 function test_rappel_nom_base_mysql($server_db) {
1757
-	$GLOBALS['mysql_rappel_nom_base'] = true;
1758
-	sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1759
-	$ok = spip_query("INSERT INTO spip_meta (nom,valeur) VALUES ('mysql_rappel_nom_base', 'test')", $server_db);
1757
+    $GLOBALS['mysql_rappel_nom_base'] = true;
1758
+    sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1759
+    $ok = spip_query("INSERT INTO spip_meta (nom,valeur) VALUES ('mysql_rappel_nom_base', 'test')", $server_db);
1760 1760
 
1761
-	if ($ok) {
1762
-		sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1761
+    if ($ok) {
1762
+        sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1763 1763
 
1764
-		return '';
1765
-	} else {
1766
-		$GLOBALS['mysql_rappel_nom_base'] = false;
1764
+        return '';
1765
+    } else {
1766
+        $GLOBALS['mysql_rappel_nom_base'] = false;
1767 1767
 
1768
-		return "\$GLOBALS['mysql_rappel_nom_base'] = false; " .
1769
-		"/* echec de test_rappel_nom_base_mysql a l'installation. */\n";
1770
-	}
1768
+        return "\$GLOBALS['mysql_rappel_nom_base'] = false; " .
1769
+        "/* echec de test_rappel_nom_base_mysql a l'installation. */\n";
1770
+    }
1771 1771
 }
1772 1772
 
1773 1773
 /**
@@ -1781,13 +1781,13 @@  discard block
 block discarded – undo
1781 1781
  *     - chaîne : code compilé pour l'indiquer le résultat du test à SPIP
1782 1782
  */
1783 1783
 function test_sql_mode_mysql($server_db) {
1784
-	$res = sql_select('version() as v', '', '', '', '', '', '', $server_db);
1785
-	$row = sql_fetch($res, $server_db);
1786
-	if (version_compare($row['v'], '5.0.0', '>=')) {
1787
-		defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE', true);
1784
+    $res = sql_select('version() as v', '', '', '', '', '', '', $server_db);
1785
+    $row = sql_fetch($res, $server_db);
1786
+    if (version_compare($row['v'], '5.0.0', '>=')) {
1787
+        defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE', true);
1788 1788
 
1789
-		return "defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE',true);\n";
1790
-	}
1789
+        return "defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE',true);\n";
1790
+    }
1791 1791
 
1792
-	return '';
1792
+    return '';
1793 1793
 }
Please login to merge, or discard this patch.