diff --git a/ecrire/balise/formulaire_signature.php b/ecrire/balise/formulaire_signature.php
index fbed9222c9703ec2eb31db22067da310a2332cd5..2cf7b12a88dca91ef75652ed112d95c7260a6381 100644
--- a/ecrire/balise/formulaire_signature.php
+++ b/ecrire/balise/formulaire_signature.php
@@ -93,8 +93,7 @@ function reponse_confirmation($var_confirm = '') {
 	static $confirm = '';
 	if (!$var_confirm) return $confirm;
 
-	spip_connect();
-	if ($GLOBALS['db_ok']) {
+	if (spip_connect()) {
 		include_spip('inc/texte');
 		include_spip('inc/filtres');
 
@@ -177,7 +176,7 @@ function reponse_confirmation($var_confirm = '') {
 
 function reponse_signature($id_article, $nom_email, $adresse_email, $message, $nom_site, $url_site, $url_page) {
 
-	if (!$GLOBALS['db_ok']) return _T('form_pet_probleme_technique');
+	if (!spip_connect()) return _T('form_pet_probleme_technique');
 
 	include_spip('inc/texte');
 	include_spip('inc/filtres');
diff --git a/ecrire/base/db_mysql.php b/ecrire/base/db_mysql.php
index 22ac341d085611cb404f79c106d0587d7a02865e..1d0437f53c10ea146b406ca0e20c6dce79426ceb 100644
--- a/ecrire/base/db_mysql.php
+++ b/ecrire/base/db_mysql.php
@@ -21,6 +21,35 @@ define('SPIP_NUM', MYSQL_NUM);
 // Appel de requetes SQL
 //
 
+// fonction pour la premiere connexion
+
+function base_db_mysql_dist()
+{
+	// fichier d'init present ?
+	if (!_FILE_CONNECT) {
+		if ($GLOBALS['exec'] != 'install') // est-ce l'installation ?
+			return false; // non, faut faire sans
+		else  return 'spip_query_db'; // oui; valeur d'office
+	}
+
+	include_once(_FILE_CONNECT);
+
+	// Version courante = 0.3
+	//
+	// les versions 0.1 et 0.2 fonctionnent toujours, meme si :
+	// - la version 0.1 est moins performante que la 0.2
+	// - la 0.2 fait un include_ecrire('inc_db_mysql.php3')
+	// En tout cas on ne force pas la mise a niveau
+	if ($GLOBALS['spip_connect_version'] >= 0.1)
+		return 'spip_query_db';
+
+	// La version 0.0 (non numerotee) doit etre refaite par un admin
+
+	if (!_DIR_RESTREINT) return false;
+
+	redirige_par_entete(generer_url_ecrire('upgrade', 'reinstall=oui', true));
+}
+
 // http://doc.spip.org/@spip_query_db
 function spip_query_db($query) {
 
@@ -197,7 +226,7 @@ function spip_connect_db($host, $port, $login, $pass, $db) {
 		$err = 'Echec connexion MySQL '.spip_sql_errno().' '.spip_sql_error();
 		spip_log($err);
 		spip_log($err, 'mysql');
-	}
+	} else $GLOBALS['db_ok'] = 'spip_query_db';
 	return $GLOBALS['db_ok'];
 }
 
diff --git a/ecrire/exec/install.php b/ecrire/exec/install.php
index 8cb614b12989c354676efd78647ce013ddf2e511..d7c342a56fe74c2c815681168e7197a0413f681c 100644
--- a/ecrire/exec/install.php
+++ b/ecrire/exec/install.php
@@ -29,7 +29,7 @@ function exec_install_dist()
 	@unlink(_FILE_META);
 	unset($GLOBALS['meta']);
 	include_spip('inc/lang');
-	init_langues();
+	init_langues(); // pourquoi faut-il l'appeler encore une fois ?
 
 	include_spip('base/create');
 	include_spip('base/db_mysql');
diff --git a/ecrire/inc/actions.php b/ecrire/inc/actions.php
index 3958df19e78bba013dff6b07198bddf24575f1d8..cf2c279f1f334e0845fa539a71db6d764311da60 100644
--- a/ecrire/inc/actions.php
+++ b/ecrire/inc/actions.php
@@ -186,9 +186,7 @@ function verifier_php_auth() {
 	&& !$GLOBALS['ignore_auth_http']) {
 		$result = spip_query("SELECT * FROM spip_auteurs WHERE login=" . spip_abstract_quote($_SERVER['PHP_AUTH_USER']));
 
-		if (!$GLOBALS['db_ok'])	return false;
-
-		$row = spip_fetch_array($result);
+		$row = @spip_fetch_array($result);
 		if ($row AND $row['source'] != 'ldap') {
 		  if ($row['pass'] == md5($row['alea_actuel'] . $_SERVER['PHP_AUTH_PW'])) {
 			$GLOBALS['auteur_session'] = $row;
diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php
index d9c0ec41fa25ab06fa907ff9b6f2fb67bee5290e..540f14d6346546e6baaf557d4df7d2def00977f2 100644
--- a/ecrire/inc/auth.php
+++ b/ecrire/inc/auth.php
@@ -218,7 +218,7 @@ function auth_prefs()
 function auth_areconnecter($auth_login)
 {
 	include_spip('inc/minipres');
-	if (!$GLOBALS['db_ok']) {
+	if (!spip_connect()) {
 		spip_log("Erreur base de donnees");
 
 		minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'). "<p><tt>".spip_sql_errno()." ".spip_sql_error()."</tt></p>");
diff --git a/ecrire/inc/install_4.php b/ecrire/inc/install_4.php
index 293901e5da96d37abac3f27d3ed955a761cfd613..9208d9228169e866ca9a30dc2a1d02b6b8e4a312 100644
--- a/ecrire/inc/install_4.php
+++ b/ecrire/inc/install_4.php
@@ -17,9 +17,6 @@ function inc_install_4()
 
 	install_debut_html();
 
-	// Necessaire pour appeler les fonctions SQL wrappees
-	include_spip('base/db_mysql');
-
 	echo "<BR />\n<FONT FACE='Verdana,Arial,Sans,sans-serif' SIZE=3>"._T('info_creation_tables')."</FONT>";
 	echo "<P>\n";
 
@@ -38,7 +35,7 @@ function inc_install_4()
 	mysql_select_db($sel_db);
 
 	// Message pour spip_query : tout va bien !
-	$GLOBALS['db_ok'] = true;
+	$GLOBALS['db_ok'] = 'spip_connect_db';
 	$GLOBALS['spip_connect_version'] = 0.3;
 
 	// Test si SPIP deja installe
@@ -57,7 +54,7 @@ function inc_install_4()
 		$ligne_rappel = '';
 		spip_query("DELETE FROM spip_meta WHERE nom='mysql_rappel_nom_base'");
 	} else {
-		echo " (erreur rappel nom base `$sel_db`.spip_meta) ";
+		echo " (erreur rappel nom base `$sel_db`.spip_meta $nouvelle) ";
 		$GLOBALS['mysql_rappel_nom_base'] = false;
 		$ligne_rappel = "\$GLOBALS['mysql_rappel_nom_base'] = false; ".
 		"/* echec du test sur `$sel_db`.spip_meta lors de l'installation. */\n";
@@ -74,7 +71,6 @@ function inc_install_4()
 	}
 	echo "($result_ok) -->";
 
-
 	if ($result_ok) {
 		if (preg_match(',(.*):(.*),', $adresse_db, $r))
 			list(,$adresse_db, $port) = $r;
diff --git a/ecrire/inc/meta.php b/ecrire/inc/meta.php
index 4014dc0b6e98e5341c80a305f34229502ed2bed8..627f7a887bbcdb3ad54afefd21886ffbe34f45e2 100644
--- a/ecrire/inc/meta.php
+++ b/ecrire/inc/meta.php
@@ -14,14 +14,16 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 // http://doc.spip.org/@lire_metas
 function lire_metas() {
-	$result = spip_query("SELECT nom,valeur FROM spip_meta");
-	if($GLOBALS['db_ok']) {
+	if (!_FILE_CONNECT) return;
+	if ($result = @spip_query("SELECT nom,valeur FROM spip_meta")) {
+
 		$GLOBALS['meta'] = array();
 		while ($row = spip_fetch_array($result))
 			$GLOBALS['meta'][$row['nom']] = $row['valeur'];
+
+		if (!$GLOBALS['meta']['charset'])
+			ecrire_meta('charset', _DEFAULT_CHARSET);
 	}
-	if (!$GLOBALS['meta']['charset'])
-		ecrire_meta('charset', _DEFAULT_CHARSET);
 }
 
 // http://doc.spip.org/@ecrire_meta
@@ -73,7 +75,7 @@ if (!isset($GLOBALS['meta']))
 
 // On force le renouvellement de l'alea de l'espace prive tous les 2 jours
 
-if (!_DIR_RESTREINT AND abs(time() -  $GLOBALS['meta']['alea_ephemere_date']) > 2 * 24*3600) {
+if ((!_DIR_RESTREINT) AND _FILE_CONNECT AND abs(time() -  $GLOBALS['meta']['alea_ephemere_date']) > 2 * 24*3600) {
 	include_spip('inc/acces');
 	renouvelle_alea();
  }
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 1ea0b0e58b5636e249fe4c77cfb3e3fc9b6e5378..95a2d9afa83b5844bdc2ce77d012e6a35ba41328 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -203,53 +203,37 @@ function spip_log($message, $logname='spip') {
 		spip_log($message);
 }
 
+// API d'appel a la base de donnees:
+// on charge le fichier du repertoire base/ donne en argument
+// et on execute la fonction homonyme censee initaliser la connexion
+// et renvoyer le nom de la fonction a connexion persistante.
+// On memorise ce nom dans une statique pour n'appeler qu'une fois.
 
-// API d'appel a la base de donnees
 // http://doc.spip.org/@spip_connect
-function spip_connect() {
-	static $t;
-	if ($t++) return;
+function spip_connect($serveur='') {
+	static $t = array();
 
-	include_spip('base/db_mysql');
-	include_once(_FILE_CONNECT);
+// Assimiler spip_connect() et spip_connect('') [PHP les distingue].
+// Tous deux designent le serveur SQL std (moche mais historique)
 
-	// Version courante = 0.3
-	//
-	// les versions 0.1 et 0.2 fonctionnent toujours, meme si :
-	// - la version 0.1 est moins performante que la 0.2
-	// - la 0.2 fait un include_ecrire('inc_db_mysql.php3')
-	// En tout cas on ne force pas la mise a niveau
-	if ($GLOBALS['spip_connect_version'] >= 0.1)
-		return;
-
-	// La version 0.0 (non numerotee) doit etre refaite
-	if ($GLOBALS['spip_connect_version'] < 0.1) {
-		if (!_DIR_RESTREINT) {
-			$GLOBALS['db_ok'] = false;
-			return;
-		}
-		redirige_par_entete(
-			generer_url_ecrire('upgrade', 'reinstall=oui', true));
-	}
+	if (!$serveur) $serveur = 'db_mysql';
+
+	if (isset($t[$serveur])) return $t[$serveur];
+
+	$f = charger_fonction($serveur, 'base', true);
+
+	$t[$serveur] = ($f ? $f() : false);
+	spip_log("spip_connect($serveur) $f " . $t[$serveur]);
+	return $t[$serveur];
 }
 
 // http://doc.spip.org/@spip_query
-function spip_query($query) {
-
-	// Remarque : si on est appele par l'install,
-	// la connexion initiale a ete faite avant
-	if (!$GLOBALS['db_ok']) {
-		// Essaie de se connecter
-		if (_FILE_CONNECT)
-			spip_connect();
-
-		// Erreur de connexion
-		if (!$GLOBALS['db_ok'])
-			return;
-	}
+function spip_query($query, $serveur='') {
+
+	if (!($f = spip_connect($serveur))) return;  // Erreur de connexion
 
-	// Faire la requete
-	return spip_query_db($query);
+	// executer la requete
+	return $f($query);
 }
 
 // a demenager dans base/abstract_sql a terme
@@ -1084,7 +1068,7 @@ function spip_initialisation() {
 	$GLOBALS['spip_lang'] = $GLOBALS['langue_site'];
 
 	// Verifier le visiteur
-	verifier_visiteur();
+	if (_FILE_CONNECT) verifier_visiteur();
 }
 
 // Annuler les magic quotes \' sur GET POST COOKIE et GLOBALS ;
diff --git a/ecrire/public/cacher.php b/ecrire/public/cacher.php
index 371448c22b875bb1e9a8f3a2a8545a7f56e7293b..c97a1d1e3cad7783b6d5c447937389b97aca1dff 100644
--- a/ecrire/public/cacher.php
+++ b/ecrire/public/cacher.php
@@ -294,9 +294,8 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 
 	// Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
 	if (isset($GLOBALS['meta']['invalider'])) {
-		// tester si la base est dispo
-		spip_connect();
-		if ($GLOBALS['db_ok']) {
+		// le faire si la base est disponible
+		if (spip_connect()) {
 			include_spip('inc/meta');
 			lire_metas();
 			retire_caches($chemin_cache);
@@ -321,12 +320,8 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 		$use_cache = 1;
 	}
 
-
-	// tester si la base est dispo
-	spip_connect();
-
 	// Si pas valide mais pas de connexion a la base, le garder quand meme
-	if (!$GLOBALS['db_ok']) {
+	if (!spip_connect()) {
 		if (file_exists(_DIR_CACHE . $chemin_cache))
 			$use_cache = 0 ;
 		else {