diff --git a/ecrire/exec/accueil.php b/ecrire/exec/accueil.php
index 257e3688889d6b543f99a7dad1c165253f1e7bf8..feb7e62f779734f4b84a25c95b6d11460f6a8f09 100644
--- a/ecrire/exec/accueil.php
+++ b/ecrire/exec/accueil.php
@@ -36,19 +36,19 @@ else
 	//
 
 
-afficher_articles(_T('info_articles_proposes'),	"WHERE statut='prop'$vos_articles ORDER BY date DESC");
+ afficher_articles(_T('info_articles_proposes'), array("WHERE" => "statut='prop'$vos_articles", 'ORDER BY' => "date DESC"));
 
 	//
 	// Les breves a valider
 	//
-afficher_breves(afficher_plus(generer_url_ecrire('breves'))._T('info_breves_valider'), "SELECT * FROM spip_breves WHERE statut='prepa' OR statut='prop' ORDER BY date_heure DESC", true);
+ afficher_breves(afficher_plus(generer_url_ecrire('breves'))._T('info_breves_valider'), array("FROM" => 'spip_breves', 'WHERE' => "statut='prepa' OR statut='prop'", 'ORDER BY' => "date_heure DESC"), true);
 
 	//
 	// Les sites references a valider
 	//
 if (afficher_plus(generer_url_ecrire('sites_tous')).$GLOBALS['meta']['activer_syndic'] != 'non') {
 		include_spip('inc/sites_voir');
-		afficher_sites(afficher_plus(generer_url_ecrire('sites_tous'))._T('info_site_valider'), "SELECT * FROM spip_syndic WHERE statut='prop' ORDER BY nom_site");
+		afficher_sites(afficher_plus(generer_url_ecrire('sites_tous'))._T('info_site_valider'), array("FROM" => 'spip_syndic', 'WHERE' => "statut='prop'", 'ORDER BY'=> "nom_site"));
 	}
 
 	//
@@ -56,7 +56,7 @@ if (afficher_plus(generer_url_ecrire('sites_tous')).$GLOBALS['meta']['activer_sy
 	//
 if ($GLOBALS['meta']['activer_syndic'] != 'non' AND $connect_statut == '0minirezo' AND $connect_toutes_rubriques) {
 		include_spip('inc/sites_voir');
-		afficher_sites(afficher_plus(generer_url_ecrire('sites_tous'))._T('avis_sites_syndiques_probleme'), "SELECT * FROM spip_syndic WHERE (syndication='off' OR syndication='sus') AND statut='publie' ORDER BY nom_site");
+		afficher_sites(afficher_plus(generer_url_ecrire('sites_tous'))._T('avis_sites_syndiques_probleme'), array('FROM' => 'spip_syndic', 'WHERE' => "(syndication='off' OR syndication='sus') AND statut='publie'", 'ORDER BY' => 'nom_site'));
 	}
 
 	// Les articles syndiques en attente de validation
@@ -451,7 +451,7 @@ $post_dates = $GLOBALS['meta']["post_dates"];
 
 if ($post_dates == "non" AND $connect_statut == '0minirezo' AND $options == 'avancees') {
 	echo "<p>";
-	afficher_articles(_T('info_article_a_paraitre'), "WHERE statut='publie' AND date>NOW() ORDER BY date");
+	afficher_articles(_T('info_article_a_paraitre'), array("WHERE" => "statut='publie' AND date>NOW()", 'ORDER BY' => "date"));
 }
 
 //
@@ -459,7 +459,7 @@ if ($post_dates == "non" AND $connect_statut == '0minirezo' AND $options == 'ava
 //
 
 echo "<p>";
-$vos_articles = afficher_articles(afficher_plus(generer_url_ecrire('articles_page'))._T('info_en_cours_validation'),	", spip_auteurs_articles AS lien WHERE articles.id_article=lien.id_article AND lien.id_auteur=$connect_id_auteur AND articles.statut='prepa' ORDER BY articles.date DESC");
+ $vos_articles = afficher_articles(afficher_plus(generer_url_ecrire('articles_page'))._T('info_en_cours_validation'),	array('FROM' => "spip_articles AS articles, spip_auteurs_articles AS lien", "WHERE" => "articles.id_article=lien.id_article AND lien.id_auteur=$connect_id_auteur AND articles.statut='prepa'", "ORDER BY" => "articles.date DESC"));
 
 if ($vos_articles) $vos_articles = ' AND articles.id_article NOT IN ('.join($vos_articles,',').')';
 
diff --git a/ecrire/exec/articles_page.php b/ecrire/exec/articles_page.php
index fa1720c35b33eede1fa35b6dac7a3fa0f56271ca..d5506c93e9b3fbe99ddd70707d70e0c954df44a3 100644
--- a/ecrire/exec/articles_page.php
+++ b/ecrire/exec/articles_page.php
@@ -49,7 +49,7 @@ debut_droite();
 //
 
 echo "<P align=left>";
-afficher_articles(_T('info_en_cours_validation'), ", spip_auteurs_articles AS lien ".	"WHERE articles.id_article=lien.id_article AND lien.id_auteur=$connect_id_auteur AND articles.statut='prepa' ORDER BY articles.date DESC");
+ afficher_articles(_T('info_en_cours_validation'), array('FROM' => "spip_articles AS articles, spip_auteurs_articles AS lien ", "WHERE" => "articles.id_article=lien.id_article AND lien.id_auteur=$connect_id_auteur AND articles.statut='prepa'", 'ORDER BY' => "articles.date DESC"));
 echo "</p>";
 
 
@@ -59,7 +59,7 @@ echo "</p>";
 //
 
 echo "<p>";
-afficher_articles(_T('info_attente_validation'), ", spip_auteurs_articles AS lien ".	"WHERE articles.id_article=lien.id_article AND lien.id_auteur=$connect_id_auteur AND articles.statut='prop' ORDER BY articles.date");
+ afficher_articles(_T('info_attente_validation'), array('FROM' => "spip_articles AS articles, spip_auteurs_articles AS lien ", "WHERE" => "articles.id_article=lien.id_article AND lien.id_auteur=$connect_id_auteur AND articles.statut='prop'", "ORDER BY" => "articles.date"));
 echo "</p>";
 
 //
@@ -67,7 +67,7 @@ echo "</p>";
 //
 
 echo "<p>";
-afficher_articles(_T('info_publies'),	", spip_auteurs_articles AS lien ".	"WHERE articles.id_article=lien.id_article AND lien.id_auteur=\"$connect_id_auteur\" AND articles.statut='publie' ORDER BY articles.date DESC", true);
+ afficher_articles(_T('info_publies'),	array("FROM" =>"spip_articles AS articles, spip_auteurs_articles AS lien ", "WHERE" => "articles.id_article=lien.id_article AND lien.id_auteur=\"$connect_id_auteur\" AND articles.statut='publie'", 'ORDER BY' => "articles.date DESC"), true);
 echo "</p>";
 
 //
@@ -75,7 +75,7 @@ echo "</p>";
 //
 
 echo "<p>";
-afficher_articles(_T('info_refuses'),	", spip_auteurs_articles AS lien ".	"WHERE articles.id_article=lien.id_article AND lien.id_auteur=\"$connect_id_auteur\" AND articles.statut='refuse' ORDER BY articles.date DESC");
+ afficher_articles(_T('info_refuses'),	array('FROM' =>"spip_articles AS articles, spip_auteurs_articles AS lien ", "WHERE" => "articles.id_article=lien.id_article AND lien.id_auteur=\"$connect_id_auteur\" AND articles.statut='refuse'",  'ORDER BY' => "articles.date DESC"));
 echo "</p>";
 
 fin_page();
diff --git a/ecrire/exec/auteurs_edit.php b/ecrire/exec/auteurs_edit.php
index 9a5031724bc4268855422ea5ecb1e47da82776f0..c80e4b80f77327cbcca88f272a068989f3cffe73 100644
--- a/ecrire/exec/auteurs_edit.php
+++ b/ecrire/exec/auteurs_edit.php
@@ -116,7 +116,7 @@ function table_auteurs_edit($auteur)
 	else if ($connect_id_auteur == $id_auteur) $aff_art = "'prepa','prop','publie'";
 	else $aff_art = "'prop','publie'";
 
-	afficher_articles(_T('info_articles_auteur'),  ", spip_auteurs_articles AS lien WHERE lien.id_auteur='$id_auteur' AND lien.id_article=articles.id_article AND articles.statut IN ($aff_art)  ORDER BY articles.date DESC", true);
+	afficher_articles(_T('info_articles_auteur'),  array('FROM' => "spip_articles AS articles, spip_auteurs_articles AS lien",  "WHERE" => "lien.id_auteur='$id_auteur' AND lien.id_article=articles.id_article AND articles.statut IN ($aff_art)",  'ORDER BY' => "articles.date DESC"), true);
 
 	if ($id_auteur != $connect_id_auteur
 	    AND ($statut == '0minirezo' OR $statut == '1comite')) {
diff --git a/ecrire/exec/breves.php b/ecrire/exec/breves.php
index 620e21852baa32ec3613c494f57c32eb3bf9b58e..ee3f44201274ab6b9e8108c4cc1475897815baa9 100644
--- a/ecrire/exec/breves.php
+++ b/ecrire/exec/breves.php
@@ -37,7 +37,8 @@ function exec_breves_dist()
 		$statuts = "'prop', 'publie'" . ($editatble ? ", 'refuse'": "");
 
 		debut_cadre_enfonce("secteur-24.gif", false, '', $titre.aide ("breves"));
-		afficher_breves('', "SELECT id_rubrique, id_breve, date_heure, titre, statut FROM spip_breves WHERE id_rubrique='$id_rubrique' AND statut IN ($statuts) ORDER BY date_heure DESC");
+
+		afficher_breves('', array("SELECT" => 'id_rubrique, id_breve, date_heure, titre, statut', "FROM" => 'spip_breves', 'WHERE' => "id_rubrique='$id_rubrique' AND statut IN ($statuts)", 'ORDER BY' => "date_heure DESC"));
 		
 		if ($editable) {
 		  echo "<div align='$spip_lang_right'>";
diff --git a/ecrire/exec/mots_edit.php b/ecrire/exec/mots_edit.php
index a5e7e11b0b61b3c9af8d88c15be2f326242716b2..b9ea9e5bfcdf26d966ad2f6231bb9837c2f0b98f 100644
--- a/ecrire/exec/mots_edit.php
+++ b/ecrire/exec/mots_edit.php
@@ -208,14 +208,14 @@ if ($id_mot) {
 	else
 		$aff_articles = "'prop','publie'";
 
-	afficher_rubriques(_T('info_rubriques_liees_mot'), "SELECT rubrique.* FROM spip_rubriques AS rubrique, spip_mots_rubriques AS lien WHERE lien.id_mot='$id_mot' AND lien.id_rubrique=rubrique.id_rubrique ORDER BY rubrique.titre");
+	afficher_rubriques(_T('info_rubriques_liees_mot'), array("FROM" => 'spip_rubriques AS rubrique, spip_mots_rubriques AS lien', 'WHERE' => "lien.id_mot='$id_mot' AND lien.id_rubrique=rubrique.id_rubrique", 'ORDER BY' => "rubrique.titre"));
 
-	afficher_articles(_T('info_articles_lies_mot'),	", spip_mots_articles AS lien WHERE lien.id_mot='$id_mot' AND lien.id_article=articles.id_article AND articles.statut IN ($aff_articles) ORDER BY articles.date DESC", true);
+	afficher_articles(_T('info_articles_lies_mot'),	array('FROM' => "spip_articles AS articles, spip_mots_articles AS lien", 'WHERE' => "lien.id_mot='$id_mot' AND lien.id_article=articles.id_article AND articles.statut IN ($aff_articles)", 'ORDER BY' => "articles.date DESC"), true);
 
-	afficher_breves(_T('info_breves_liees_mot'), "SELECT breves.* FROM spip_breves AS breves, spip_mots_breves AS lien WHERE lien.id_mot='$id_mot' AND lien.id_breve=breves.id_breve ORDER BY breves.date_heure DESC");
+	afficher_breves(_T('info_breves_liees_mot'), array("FROM" => 'spip_breves AS breves, spip_mots_breves AS lien', 'WHERE' => "lien.id_mot='$id_mot' AND lien.id_breve=breves.id_breve", 'ORDER BY' => "breves.date_heure DESC"));
 
 	include_spip('inc/sites_voir');
-	afficher_sites(_T('info_sites_lies_mot'), "SELECT syndic.* FROM spip_syndic AS syndic, spip_mots_syndic AS lien WHERE lien.id_mot='$id_mot' AND lien.id_syndic=syndic.id_syndic ORDER BY syndic.nom_site DESC");
+	afficher_sites(_T('info_sites_lies_mot'), array("FROM" => 'spip_syndic AS syndic, spip_mots_syndic AS lien', 'WHERE' => "lien.id_mot='$id_mot' AND lien.id_syndic=syndic.id_syndic", 'ORDER BY' => "syndic.nom_site DESC"));
 }
 
 fin_cadre_relief();
diff --git a/ecrire/exec/naviguer.php b/ecrire/exec/naviguer.php
index 8527411ff066977925c494422bb2bccaa8e047eb..3764401c27034e62e150bb1a4877b9d11202813c 100644
--- a/ecrire/exec/naviguer.php
+++ b/ecrire/exec/naviguer.php
@@ -299,12 +299,12 @@ if ($relief) {
 	//
 	// Les articles a valider
 	//
-	afficher_articles(_T('info_articles_proposes'),	"WHERE id_rubrique='$id_rubrique' AND statut='prop' ORDER BY date DESC");
+	afficher_articles(_T('info_articles_proposes'),	array('WHERE' => "id_rubrique='$id_rubrique' AND statut='prop'", 'ORDER BY' => "date DESC"));
 
 	//
 	// Les breves a valider
 	//
-	afficher_breves(_T('info_breves_valider'), "SELECT * FROM spip_breves WHERE id_rubrique='$id_rubrique' AND (statut='prepa' OR statut='prop') ORDER BY date_heure DESC", true);
+	afficher_breves(_T('info_breves_valider'), array("FROM" => 'spip_breves', 'WHERE' => "id_rubrique='$id_rubrique' AND (statut='prepa' OR statut='prop')", 'ORDER BY' => "date_heure DESC"), true);
 
 
 	//
@@ -312,7 +312,7 @@ if ($relief) {
 	//
 	if ($GLOBALS['meta']['activer_syndic'] != 'non') {
 		include_spip('inc/sites_voir');
-		afficher_sites(_T('info_site_valider'), "SELECT * FROM spip_syndic WHERE id_rubrique='$id_rubrique' AND statut='prop' ORDER BY nom_site");
+		afficher_sites(_T('info_site_valider'), array("FROM" => 'spip_syndic', 'WHERE' => "id_rubrique='$id_rubrique' AND statut='prop'", 'ORDER BY' => "nom_site"));
 	}
 
 	//
@@ -320,7 +320,7 @@ if ($relief) {
 	//
 	if ($GLOBALS['meta']['activer_syndic'] != 'non' AND $connect_statut == '0minirezo' AND $connect_toutes_rubriques) {
 		include_spip('inc/sites_voir');
-		afficher_sites(_T('avis_sites_syndiques_probleme'), "SELECT * FROM spip_syndic WHERE id_rubrique='$id_rubrique' AND (syndication='off' OR syndication='sus') AND statut='publie' ORDER BY nom_site");
+		afficher_sites(_T('avis_sites_syndiques_probleme'), array('FROM' => 'spip_syndic', 'WHERE' => "id_rubrique='$id_rubrique' AND (syndication='off' OR syndication='sus') AND statut='publie'", 'ORDER BY' => "nom_site"));
 	}
 
 	// Les articles syndiques en attente de validation
@@ -346,14 +346,14 @@ if ($relief) {
 /////////////////////////
 
 	if ($connect_statut == "0minirezo" AND $options == 'avancees') {
-	  afficher_articles(_T('info_tous_articles_en_redaction'), "WHERE statut='prepa' AND id_rubrique='$id_rubrique' ORDER BY date DESC");
+	  afficher_articles(_T('info_tous_articles_en_redaction'), array("WHERE" => "statut='prepa' AND id_rubrique='$id_rubrique'", 'ORDER BY' => "date DESC"));
 	}
 
 
 //////////  Les articles publies
 /////////////////////////
 
-	afficher_articles(_T('info_tous_articles_presents'),  "WHERE statut='publie' AND id_rubrique='$id_rubrique' ORDER BY date DESC", true);
+	  afficher_articles(_T('info_tous_articles_presents'), array("WHERE" => "statut='publie' AND id_rubrique='$id_rubrique'", 'ORDER BY' => "date DESC"), true);
 
 
 
@@ -365,7 +365,7 @@ if ($relief) {
 
 //// Les breves
 
-	afficher_breves(_T('icone_ecrire_nouvel_article'), "SELECT * FROM spip_breves WHERE id_rubrique='$id_rubrique' AND statut != 'prop' AND statut != 'prepa' ORDER BY date_heure DESC");
+	afficher_breves(_T('icone_ecrire_nouvel_article'), array("FROM" => 'spip_breves', 'WHERE' => "id_rubrique='$id_rubrique' AND statut != 'prop' AND statut != 'prepa'", 'ORDER BY' => "date_heure DESC"));
 
 	$activer_breves=$GLOBALS['meta']["activer_breves"];
 
@@ -379,7 +379,7 @@ if ($relief) {
 
 	if ($GLOBALS['meta']["activer_sites"] == 'oui') {
 		include_spip('inc/sites_voir');
-		afficher_sites(_T('titre_sites_references_rubrique'), "SELECT * FROM spip_syndic WHERE id_rubrique='$id_rubrique' AND statut!='refuse' AND statut != 'prop' AND syndication NOT IN ('off','sus') ORDER BY nom_site");
+		afficher_sites(_T('titre_sites_references_rubrique'), array("FROM" => 'spip_syndic', 'WHERE' => "id_rubrique='$id_rubrique' AND statut!='refuse' AND statut != 'prop' AND syndication NOT IN ('off','sus')", 'ORDER BY' => 'nom_site'));
 
 		if ($id_rubrique > 0 AND ($flag_editable OR $GLOBALS['meta']["proposer_sites"]> 0)) {
 	
diff --git a/ecrire/exec/recherche.php b/ecrire/exec/recherche.php
index 1aa12dd532e560c3579fbaa331f8e390d62f3b34..386cc0f4f1c821d255c447d616aab52f31c61ac2 100644
--- a/ecrire/exec/recherche.php
+++ b/ecrire/exec/recherche.php
@@ -45,37 +45,33 @@ function exec_recherche_dist()
 	echo "<FONT FACE='Verdana,Arial,Sans,sans-serif'><B>"._T('info_resultat_recherche')."</B><BR>";
 	echo "<FONT SIZE=5 COLOR='$couleur_foncee'><B>$recherche</B></FONT><p>";
 
-	$query_articles = "SELECT * FROM spip_articles WHERE";
-	$query_breves = "SELECT * FROM spip_breves WHERE ";
-	$query_rubriques = "SELECT * FROM spip_rubriques WHERE ";
-	$query_sites = "SELECT * FROM spip_syndic WHERE ";
-	
-	if (ereg("^[0-9]+$", $recherche)) {
-		$query_articles .= " (id_article = $recherche) OR ";
-		$query_breves .= " (id_breve = $recherche) OR ";
-		$query_rubriques .= " (id_rubrique = $recherche) OR ";
-		$query_sites .= " (id_syndic = $recherche) OR ";
-	}
-	
+	$query_articles['FROM'] = 'spip_articles AS articles';
+	$query_breves['FROM'] = 'spip_breves';
+	$query_rubriques['FROM'] = 'spip_rubriques';
+	$query_sites['FROM'] = 'spip_syndic';
+	$testnum = ereg("^[0-9]+$", $recherche);
+
 	// Eviter les symboles '%', caracteres SQL speciaux
-	$recherche = str_replace("%","\%",$recherche);
-	$rech2 = split("[[:space:]]+", $recherche);
-	if ($rech2)
-		$where = " (titre LIKE '%".join("%' AND titre LIKE '%", $rech2)."%') ";
-	else
-		$where = " 1=2";
-	
-	$query_articles .= " $where ORDER BY date_modif DESC";
-	$query_breves .= " $where ORDER BY maj DESC";
-	$query_rubriques .= " $where ORDER BY maj DESC";
-	
-	$query_sites .= " $where ORDER BY maj DESC";
-	$query_sites  = ereg_replace("titre LIKE", "nom_site LIKE", $query_sites);
+	$recherche1 = str_replace("%","\%",$recherche);
+	$where = split("[[:space:]]+", $recherche1);
+	if ($where)
+		$where = ($testnum ? "OR " : '') .
+		  "(titre LIKE '%".join("%' AND titre LIKE '%", $where)."%') ";
+	$query_articles['WHERE']= ($testnum ? "(id_article = $recherche)" :'') . $where;
+	$query_breves['WHERE']= ($testnum ? "(id_breve = $recherche)" : '') . $where;
+	$query_rubriques['WHERE']= ($testnum ? "(id_rubrique = $recherche)" : '') . $where;
+	$query_sites['WHERE']= ($testnum ? "(id_syndic = $recherche)" : '') . ereg_replace("titre LIKE", "nom_site LIKE",$where);
+	}
+
+	$query_articles['ORDER BY']= "date_modif DESC";
+	$query_breves['ORDER BY']= "maj DESC";
+	$query_rubriques['ORDER BY']= "maj DESC";
+	$query_sites['ORDER BY']= "maj DESC";
 	
 	$activer_moteur = ($GLOBALS['meta']['activer_moteur'] == 'oui');
 	if ($activer_moteur) {	// texte integral
 		include_spip('inc/indexation');
-		list($hash_recherche,) = requete_hash ($recherche);
+		list($hash_recherche,) = requete_hash($recherche1);
 		$query_articles_int = requete_txt_integral('spip_articles', $hash_recherche);
 		$query_breves_int = requete_txt_integral('spip_breves', $hash_recherche);
 		$query_rubriques_int = requete_txt_integral('spip_rubriques', $hash_recherche);
@@ -83,45 +79,40 @@ function exec_recherche_dist()
 		$query_auteurs_int = requete_txt_integral('spip_auteurs', $hash_recherche);
 	}
 	
-	if ($query_articles)
-		$nba = afficher_articles (_T('info_articles_trouves'), $query_articles);
+	$nba = afficher_articles (_T('info_articles_trouves'), $query_articles);
 	if ($activer_moteur) {
 		if ($nba) {
 			$doublons = join($nba, ",");
-			$query_articles_int = ereg_replace ("WHERE", "WHERE objet.id_article NOT IN ($doublons) AND", $query_articles_int);
+			$query_articles_int['WHERE'] .= " AND objet.id_article NOT IN ($doublons)";
 		}
 		$nba1 = afficher_articles (_T('info_articles_trouves_dans_texte'), $query_articles_int);
 	}
 	
-	if ($query_breves)
-		$nbb = afficher_breves (_T('info_breves_touvees'), $query_breves, true);
+	$nbb = afficher_breves (_T('info_breves_touvees'), $query_breves, true);
 	if ($activer_moteur) {
 		if ($nbb) {
 			$doublons = join($nbb, ",");
-			$query_breves_int = ereg_replace ("WHERE", "WHERE objet.id_breve NOT IN ($doublons) AND", $query_breves_int);
+			$query_breves_int["WHERE"].= " AND objet.id_breve NOT IN ($doublons)";
 		}
 		$nbb1 = afficher_breves (_T('info_breves_touvees_dans_texte'), $query_breves_int, true);
 	}
 	
-	if ($query_rubriques)
-		$nbr = afficher_rubriques (_T('info_rubriques_trouvees'), $query_rubriques);
+	$nbr = afficher_rubriques (_T('info_rubriques_trouvees'), $query_rubriques);
 	if ($activer_moteur) {
 		if ($nbr) {
 			$doublons = join($nbr, ",");
-			$query_rubriques_int = ereg_replace ("WHERE", "WHERE objet.id_rubrique NOT IN ($doublons) AND", $query_rubriques_int);
+			$query_rubriques_int["WHERE"].= " AND objet.id_rubrique NOT IN ($doublons)";
 		}
 		$nbr1 = afficher_rubriques (_T('info_rubriques_trouvees_dans_texte'), $query_rubriques_int);
 	}
 	
-	if ($activer_moteur)
-		$nbt = afficher_auteurs (_T('info_auteurs_trouves'), $query_auteurs_int);
+	$nbt = afficher_auteurs (_T('info_auteurs_trouves'), $query_auteurs_int);
 	
-	if ($query_sites)
-		$nbs = afficher_sites (_T('info_sites_trouves'), $query_sites);
+	$nbs = afficher_sites (_T('info_sites_trouves'), $query_sites);
 	if ($activer_moteur) {
 		if ($nbs) {
 			$doublons = join($nbs, ",");
-			$query_sites_int = ereg_replace ("WHERE", "WHERE objet.id_syndic NOT IN ($doublons) AND", $query_sites_int);
+			$query_sites_int["WHERE"].= " AND objet.id_syndic NOT IN ($doublons)";
 		}
 		$nbs1 = afficher_sites (_T('info_sites_trouves_dans_texte'), $query_sites_int);
 	}
@@ -129,7 +120,6 @@ function exec_recherche_dist()
 	if (!$nba AND !$nba1 AND !$nbb AND !$nbb1 AND !$nbr AND !$nbr1 AND !$nbt AND !$nbs AND !$nbs1) {
 		echo "<FONT FACE='Verdana,Arial,Sans,sans-serif'>"._T('avis_aucun_resultat')."</FONT><P>";
 	}
-}
 
 echo "<p>";
 
diff --git a/ecrire/exec/sites.php b/ecrire/exec/sites.php
index 18e7378ec26040bff4001015bb852b5897a2053d..ef2b4af21c0aa1cf0195240a09f78b3e643c3a63 100644
--- a/ecrire/exec/sites.php
+++ b/ecrire/exec/sites.php
@@ -396,9 +396,7 @@ if ($syndication == "oui" OR $syndication == "off" OR $syndication == "sus") {
 		echo _T('lien_nouvelle_recuperation')."</a></b></center>\n";
 		fin_boite_info();
 	}
-	afficher_syndic_articles(_T('titre_articles_syndiques'),
-		"SELECT * FROM spip_syndic_articles WHERE id_syndic=$id_syndic
-		ORDER BY date DESC");
+	afficher_syndic_articles(_T('titre_articles_syndiques'), array('FROM' => 'spip_syndic_articles', 'WHERE' => "id_syndic=$id_syndic", 'ORDER BY' => "date DESC"));
 
 
 	echo "<font face='verdana,arial,helvetica' size=2>";
diff --git a/ecrire/exec/sites_tous.php b/ecrire/exec/sites_tous.php
index d5ec371bcd3da54288f514cda101a240b13d88af..800b58a6d6d95485b6c4d5eee3686b4ac339f2f5 100644
--- a/ecrire/exec/sites_tous.php
+++ b/ecrire/exec/sites_tous.php
@@ -38,11 +38,11 @@ debut_page(_T('titre_page_sites_tous'),"documents","sites");
 debut_gauche();
 debut_droite();
 
-afficher_sites(_T('titre_sites_tous'), "SELECT * FROM spip_syndic WHERE syndication='non' AND statut='publie' ORDER BY nom_site");
+ afficher_sites(_T('titre_sites_tous'), array("FROM" => 'spip_syndic', 'WHERE' => "syndication='non' AND statut='publie'", 'ORDER BY'=> "nom_site"));
 
-afficher_sites(_T('titre_sites_syndiques'), "SELECT * FROM spip_syndic WHERE (syndication='oui' OR syndication='sus') AND statut='publie' ORDER BY nom_site");
+ afficher_sites(_T('titre_sites_syndiques'), array('FROM' => 'spip_syndic', 'WHERE' => "(syndication='oui' OR syndication='sus') AND statut='publie'", 'ORDER BY' => "nom_site"));
 
-afficher_sites(_T('titre_sites_proposes'), "SELECT * FROM spip_syndic WHERE statut='prop' ORDER BY nom_site");
+ afficher_sites(_T('titre_sites_proposes'), array("FROM" => 'spip_syndic', 'WHERE' => "statut='prop'", 'ORDER BY' => "nom_site"));
 
 if ($connect_statut == '0minirezo' OR $GLOBALS['meta']["proposer_sites"] > 0) {
 	echo "<div align='right'>";
@@ -50,14 +50,13 @@ if ($connect_statut == '0minirezo' OR $GLOBALS['meta']["proposer_sites"] > 0) {
 	echo "</div>";
 }
 
-afficher_sites(_T('avis_sites_probleme_syndication'), "SELECT * FROM spip_syndic WHERE syndication='off' AND statut='publie' ORDER BY nom_site");
+ afficher_sites(_T('avis_sites_probleme_syndication'), array("FROM" => 'spip_syndic', 'WHERE' => "syndication='off' AND statut='publie'", 'ORDER BY' => "nom_site"));
 
 if ($options == 'avancees' AND $connect_statut == '0minirezo') {
-	afficher_sites(_T('info_sites_refuses'), "SELECT * FROM spip_syndic WHERE statut='refuse' ORDER BY nom_site");
+  afficher_sites(_T('info_sites_refuses'), array("FROM" => 'spip_syndic', 'WHERE' => "statut='refuse'", 'ORDER BY' => "nom_site"));
 }
 
-afficher_syndic_articles(_T('titre_dernier_article_syndique'),
-			 "SELECT * FROM spip_syndic_articles ORDER BY date DESC LIMIT 50",  'afficher site');
+ afficher_syndic_articles(_T('titre_dernier_article_syndique'), array('FROM' => 'spip_syndic_articles', 'ORDER BY' => "date DESC",  'LIMIT' => "50"),  'afficher site');
 
 fin_page();
 }
diff --git a/ecrire/inc/indexation.php b/ecrire/inc/indexation.php
index 7208fafeef70a2664535ad8e2bb7efafa3934ddd..fe728eca8c8e7085d661af5798242844a26e02f8 100644
--- a/ecrire/inc/indexation.php
+++ b/ecrire/inc/indexation.php
@@ -623,14 +623,15 @@ function requete_txt_integral($table, $hash_recherche) {
 	$index_table = "spip_index";
 	$id_objet = primary_index_table($table);
 	$id_table = id_index_table($table);
-	return "SELECT objet.*, SUM(rec.points) AS points
-		FROM $table AS objet, $index_table AS rec
-		WHERE objet.$id_objet = rec.id_objet
-		AND rec.hash IN ($hash_recherche)
-		AND rec.id_table = $id_table
-		GROUP BY objet.$id_objet
-		ORDER BY points DESC
-		LIMIT 10";
+	return array(
+		     'SELECT' => "objet.*, SUM(rec.points) AS points",
+		     'FROM' => "$table AS objet, $index_table AS rec",
+		     'WHERE' => "objet.$id_objet = rec.id_objet
+AND rec.hash IN ($hash_recherche)
+AND rec.id_table = $id_table",
+		     'GROUP BY' => "objet.$id_objet",
+		     'ORDER BY' => "points DESC",
+		     'LIMIT' => "10");
 }
 
 // rechercher un mot dans le dico
diff --git a/ecrire/inc/mail.php b/ecrire/inc/mail.php
index 655265f99153a34ac82c2ee924b324f43c1cfb66..303d5b42d005b62f0e30356d6185a956cfd9ff71 100644
--- a/ecrire/inc/mail.php
+++ b/ecrire/inc/mail.php
@@ -16,7 +16,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // Infos de mails sur l'hebergeur (tout ca est assez sale)
 //
 global $hebergeur;
-global $HTTP_X_HOST, $REQUEST_URI, $SERVER_NAME, $HTTP_HOST;
+global $HTTP_X_HOST, $SERVER_NAME;
 $hebergeur = '';
 
 // Lycos (ex-Multimachin)
diff --git a/ecrire/inc/message_select.php b/ecrire/inc/message_select.php
index 458228cb20231046f7079a039e8a4f924101c37b..2b307ad52ea2166ab11e9e995be3771e125aab46 100644
--- a/ecrire/inc/message_select.php
+++ b/ecrire/inc/message_select.php
@@ -25,11 +25,11 @@ function afficher_messages($titre_table, $from, $where, &$messages_vus, $affiche
 	if (! ($obligatoire OR ($cpt = $cpt['n']))) return ;
 
 	$nb_aff = 1.5 * _TRANCHES;
+	$def_aff = intval(_request('t_' .$tmp_var));
 
 	if ($cpt > $nb_aff) {
-	  // 1er arg fictif ici
-		$tranches = afficher_tranches_requete($cpt, $cpt, ($afficher_auteurs ? 4 : 2), $tmp_var);
 		$nb_aff = (_TRANCHES); 
+		$tranches = afficher_tranches_requete($cpt, ($afficher_auteurs ? 4 : 2), $tmp_var, '', $nb_aff);
 	}
 	if ($important) debut_cadre_couleur();
 
@@ -40,7 +40,7 @@ function afficher_messages($titre_table, $from, $where, &$messages_vus, $affiche
 	echo "<TABLE WIDTH='100%' CELLPADDING='2' CELLSPACING='0' BORDER='0'>";
 	echo $tranches;
 
-	$result_message = spip_query("SELECT messages.* FROM $from WHERE $where ORDER BY date_heure DESC LIMIT  " . intval(_request('t_' .$tmp_var)) . ", $nb_aff")
+	$result_message = spip_query("SELECT messages.* FROM $from WHERE $where ORDER BY date_heure DESC LIMIT  " . $deb_aff . ", $nb_aff")
 ;
 	while($row = spip_fetch_array($result_message)) {
 			$vals = array();
diff --git a/ecrire/inc/mots.php b/ecrire/inc/mots.php
index 232083da57822d6273a73c006f423499e32e9925..13c6ee69e480a4e6ec67dd77e5fa08e66f43bb69 100644
--- a/ecrire/inc/mots.php
+++ b/ecrire/inc/mots.php
@@ -579,7 +579,7 @@ function afficher_groupe_mots($id_groupe) {
 			  "id_groupe" => $id_groupe);
 	$jjscript = addslashes(serialize($jjscript));
 	$hash = "0x".substr(md5($connect_id_auteur.$jjscript), 0, 16);
-	$tmp_var = substr(md5($jjscript), 0, 4);
+	$tmp_var = substr($hash, 2, 6);
 			
 	$javascript = "charger_id_url('" . generer_url_ecrire("ajax_page", "fonction=sql&amp;id_ajax_fonc=::id_ajax_fonc::::deb::", true) . "','$tmp_var')";
 
@@ -593,37 +593,34 @@ function afficher_groupe_mots($id_groupe) {
 	if (! ($cpt = $cpt['n'])) return true ;
 
 	$nb_aff = 1.5 * _TRANCHES;
+	$deb_aff = intval(_request('t_' .$tmp_var));
 
 	if ($cpt > $nb_aff) {
-	  // 1er arg fictif ici
-		$tranches = afficher_tranches_requete($cpt, $cpt, 3, $tmp_var, $javascript);
 		$nb_aff = (_TRANCHES); 
+		$tranches = afficher_tranches_requete($cpt, 3, $tmp_var, $javascript, $nb_aff);
 	}
 
 	$occurrences = calculer_liens_mots();
-		$table = '';
-		$res_proch = spip_query("SELECT id_ajax_fonc FROM spip_ajax_fonc WHERE hash=$hash AND id_auteur=$connect_id_auteur ORDER BY id_ajax_fonc DESC LIMIT 1");
-		if ($row = spip_fetch_array($res_proch)) {
+	$table = '';
+	$res_proch = spip_query("SELECT id_ajax_fonc FROM spip_ajax_fonc WHERE hash=$hash AND id_auteur=$connect_id_auteur ORDER BY id_ajax_fonc DESC LIMIT 1");
+	if ($row = spip_fetch_array($res_proch)) {
 			$id_ajax_fonc = $row["id_ajax_fonc"];
-		} else  {
+	} else  {
 			include_spip('base/abstract_sql');
 			$id_ajax_fonc = spip_abstract_insert("spip_ajax_fonc", "(id_auteur, variables, hash, date)", "($connect_id_auteur, '$jjscript', $hash, NOW())");
-		}
+	}
 
-		if (!$GLOBALS["t_$tmp_var"]) echo "<div id='$tmp_var' style='position: relative;'>";
+	if (!$deb_aff) echo "<div id='$tmp_var' style='position: relative;'>";
 
-		echo http_img_pack("searching.gif", "*", "style='border: 0px; visibility: hidden; position: absolute; $spip_lang_right: 0px; top: -20px;' id = 'img_$tmp_var'");
+	echo http_img_pack("searching.gif", "*", "style='border: 0px; visibility: hidden; position: absolute; $spip_lang_right: 0px; top: -20px;' id = 'img_$tmp_var'");
 
-		
-		echo "<div class='liste'>";
-		echo "<table border=0 cellspacing=0 cellpadding=3 width=\"100%\">";
+	echo "<div class='liste'>";
+	echo "<table border=0 cellspacing=0 cellpadding=3 width=\"100%\">";
 
-		echo ereg_replace("\:\:id\_ajax\_fonc\:\:", $id_ajax_fonc, $tranches);
+	echo ereg_replace("\:\:id\_ajax\_fonc\:\:", $id_ajax_fonc, $tranches);
 
-
-		$result = spip_query($r = "SELECT $select FROM $from WHERE $where $order LIMIT  " . intval(_request('t_' .$tmp_var)) . ", $nb_aff");
-		if ($id_groupe == 7) spip_log($r);
-		while ($row = spip_fetch_array($result)) {
+	$result = spip_query("SELECT $select FROM $from WHERE $where $order LIMIT  $deb_aff, $nb_aff");
+	while ($row = spip_fetch_array($result)) {
 		
 			$vals = '';
 			
@@ -681,23 +678,22 @@ function afficher_groupe_mots($id_groupe) {
 
 				$table[] = $vals;			
 			}
-		}
-		if ($connect_statut=="0minirezo") {
+	}
+	if ($connect_statut=="0minirezo") {
 			$largeurs = array('', 100, 130);
 			$styles = array('arial11', 'arial1', 'arial1');
 		}
-		else {
+	else {
 			$largeurs = array('', 100);
 			$styles = array('arial11', 'arial1');
-		}
-		echo afficher_liste($largeurs, $table, $styles);
+	}
+	echo afficher_liste($largeurs, $table, $styles);
 
-		echo "</table>";
+	echo "</table>";
 //		fin_cadre_relief();
-		echo "</div>";
+	echo "</div>";
 		
-		if (!$GLOBALS["t_$tmp_var"]) echo "</div>";
-
+	if (!$deb_aff) echo "</div>";
 
 	return false;
 }
diff --git a/ecrire/inc/presentation.php b/ecrire/inc/presentation.php
index 546dbf5e19ba373caadb304eaa35bfbd70144cf1..da38c70e51bd75d69b25a1eef3440f402810d5ea 100644
--- a/ecrire/inc/presentation.php
+++ b/ecrire/inc/presentation.php
@@ -447,31 +447,18 @@ function afficher_liste($largeurs, $table, $styles = '') {
 	return $res;
 }
 
-function afficher_tranches_requete(&$query, $num_rows, $colspan, $tmp_var=false, $javascript=false, $nb_aff = 10) {
+function afficher_tranches_requete($num_rows, $colspan, $tmp_var, $javascript=false, $nb_aff = 10) {
 	static $ancre = 0;
 	global $spip_lang_right, $spip_display;
 
-	if (!$num_rows) return;
+	$tmp_var = 't_'. $tmp_var;
+	$deb_aff = intval(_request($tmp_var));
+	$ancre++;
+	$self = self();
+	$texte = "\n<a name='a$ancre'></a>";
+	if ($spip_display != 4) $texte .= "<tr style='background-color: #dddddd;'><td class=\"arial1\" style='border-bottom: 1px solid #444444;' colspan=\"".($colspan - 1)."\">";
 
-	// Ne pas couper pour trop peu
-	$nb_aff = ($num_rows <= 1.5 * _TRANCHES) ?  $num_rows : _TRANCHES;
-	if (preg_match('/LIMIT .*(,|OFFSET) *([0-9]+)/', $query, $regs)) {
-		if ($num_rows > $regs[2]) $num_rows = $regs[2];
-	}
-
-	$texte = "\n";
-
-	if ($num_rows > $nb_aff) {
-		if (!$tmp_var) $tmp_var = substr(md5($query), 0, 4);
-		$tmp_var = 't_'. $tmp_var;
-		
-		$deb_aff = intval($GLOBALS[$tmp_var]);
-		$ancre++;
-
-		$texte .= "<a name='a$ancre'></a>";
-		if ($spip_display != 4) $texte .= "<tr style='background-color: #dddddd;'><td class=\"arial1\" style='border-bottom: 1px solid #444444;' colspan=\"".($colspan - 1)."\">";
-
-		for ($i = 0; $i < $num_rows; $i += $nb_aff){
+	for ($i = 0; $i < $num_rows; $i += $nb_aff){
 			$deb = $i + 1;
 			$fin = $i + $nb_aff;
 			if ($fin > $num_rows) $fin = $num_rows;
@@ -480,26 +467,25 @@ function afficher_tranches_requete(&$query, $num_rows, $colspan, $tmp_var=false,
 				$texte .= "<B>$deb</B>";
 			}
 			else {
-				$url = parametre_url(self(), $tmp_var, $deb-1);
+				$url = parametre_url($self, $tmp_var, $deb-1);
 				if ($javascript) {
 					$jj = str_replace("::deb::", "&amp;$tmp_var=$deb", $javascript);
 					$texte .= "<a onClick=\"$jj; return false;\" href=\"$url#a$ancre\">$deb</a>";
 				}
 				else $texte .= "<a href=\"$url#a$ancre\">$deb</a>";
 			}
-		}
+	}
 	
-
-		if ($spip_display != 4) {
+	if ($spip_display != 4) {
 			$texte .= "</td>\n";
 			$texte .= "<td class=\"arial2\" style='border-bottom: 1px solid #444444; text-align: $spip_lang_right;' colspan=\"1\" align=\"right\" valign=\"top\">";
-		} else {
+	} else {
 			$texte .= " | ";
-		}
+	}
 		
-		if ($deb_aff == -1) {
+	if ($deb_aff == -1) {
 			//$texte .= "<B>"._T('info_tout_afficher')."</B>";
-		} else {
+	} else {
 			$lien = parametre_url(self(), $tmp_var, -1);
 			if ($javascript) {
 				$jj = str_replace("::deb::", "&amp;$tmp_var=-1", $javascript);
@@ -507,20 +493,10 @@ function afficher_tranches_requete(&$query, $num_rows, $colspan, $tmp_var=false,
 			}
 			else
 				$texte .= "<A HREF=\"$lien#a$ancre\"><img src='". _DIR_IMG_PACK . "plus.gif' title='"._T('lien_tout_afficher')."' style='border: 0px;'></A>";
-		}
-
-		if ($spip_display != 4) $texte .= "</td>\n";
-		if ($spip_display != 4) $texte .= "</tr>\n";
-
-
-		if ($deb_aff != -1) {
-			if ($deb_aff > 0) $deb_aff --;  // Correction de bug: si on affiche "de 1 a 10", alors LIMIT 0 OFFSET 10
-			$query = eregi_replace('LIMIT[[:space:]].*$', '', $query);
-#			$query .= " LIMIT  $nb_aff OFFSET $deb_aff";
-			$query .= " LIMIT  $deb_aff, $nb_aff ";
-		}
 	}
 
+	if ($spip_display != 4) $texte .= "</td></tr>\n";
+
 	return $texte;
 }
 
@@ -664,8 +640,7 @@ function afficher_script_statut($id, $type, $n, $img, $statut, $title, $act)
 //
 // Afficher tableau d'articles
 //
-function afficher_articles($titre_table, $requete, $afficher_visites = false, $afficher_auteurs = true,
-		$toujours_afficher = false, $afficher_cadre = true, $afficher_descriptif = true) {
+function afficher_articles($titre_table, $requete, $afficher_visites = false, $afficher_auteurs = true, $obligatoire = false, $afficher_cadre = true, $afficher_descriptif = true) {
 
 	global $connect_id_auteur, $connect_statut, $dir_lang;
 	global $options, $spip_display;
@@ -673,6 +648,7 @@ function afficher_articles($titre_table, $requete, $afficher_visites = false, $a
 
 	// Preparation pour basculer vers liens de traductions
 	$afficher_trad = ($GLOBALS['meta']['gerer_trad'] == "oui");
+
 	if ($afficher_trad) {
 		$jjscript_trad["fonction"] = "afficher_articles_trad";
 		$jjscript_trad["titre_table"] = $titre_table;
@@ -697,21 +673,19 @@ function afficher_articles($titre_table, $requete, $afficher_visites = false, $a
 	$afficher_visites = ($afficher_visites AND $connect_statut == "0minirezo" AND $activer_statistiques != "non");
 
 	// Preciser la requete (alleger les requetes)
-	if (!ereg("^SELECT", $requete)) {
-		$select = "SELECT articles.id_article, articles.titre, articles.id_rubrique, articles.statut, articles.date";
+	if (!$requete['SELECT']) {
+		$requete['SELECT'] = "articles.id_article, articles.titre, articles.id_rubrique, articles.statut, articles.date";
 
 		if (($GLOBALS['meta']['multi_rubriques'] == 'oui' AND $GLOBALS['id_rubrique'] == 0) OR $GLOBALS['meta']['multi_articles'] == 'oui') {
 			$afficher_langue = true;
 			if ($GLOBALS['langue_rubrique']) $langue_defaut = $GLOBALS['langue_rubrique'];
 			else $langue_defaut = $GLOBALS['meta']['langue_site'];
-			$select .= ", articles.lang";
+			$requete['SELECT'] .= ", articles.lang";
 		}
 		if ($afficher_visites)
-			$select .= ", articles.visites, articles.popularite";
+			$requete['SELECT'] .= ", articles.visites, articles.popularite";
 		if ($afficher_descriptif)
-			$select .= ", articles.descriptif";
-		$select .= ", petitions.id_article AS petition ";
-		$requete = $select . "FROM spip_articles AS articles " . $requete;
+			$requete['SELECT'] .= ", articles.descriptif";
 	}
 	
 	if ($options == "avancees")  $ajout_col = 1;
@@ -726,31 +700,43 @@ function afficher_articles($titre_table, $requete, $afficher_visites = false, $a
 	$jjscript = addslashes(serialize($jjscript));
 	$hash = "0x".substr(md5($connect_id_auteur.$jjscript), 0, 16);
 
-	$tmp_var = substr(md5($jjscript), 0, 4);
+	$tmp_var = substr($hash, 2, 6);
 	$javascript = "charger_id_url('" . generer_url_ecrire("ajax_page","fonction=sql&id_ajax_fonc=::id_ajax_fonc::::deb::", true) . "','$tmp_var')";
 
-	if (preg_match('/(\s+FROM\s+.*?)(ORDER\s+BY\s+.*)?$/D',
-			$requete,
-		       $r)) {
-	  $cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n$r[1]"));
-	  $cpt = $cpt['n'];
+	$tous_id = array();
+
+	$select = $requete['SELECT'] ? $requete['SELECT'] : '*';
+	$from = $requete['FROM'] ? $requete['FROM'] : 'spip_articles AS articles';
+	$where = $requete['WHERE'] ? (' WHERE ' . $requete['WHERE']) : '';
+	$order = $requete['ORDER BY'] ? (' ORDER BY ' . $requete['ORDER BY']) : '';
+	$group = $requete['GROUP BY'] ? (' GROUP BY ' . $requete['GROUP BY']) : '';
+	$limit = $requete['LIMIT'] ? (' LIMIT ' . $requete['LIMIT']) : '';
 
-	  $tranches = afficher_tranches_requete($requete, $cpt, $afficher_auteurs ? 4 + $ajout_col : 3 + $ajout_col, $tmp_var, $javascript);
+	$cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM $from$where$group"));
+	if (! ($obligatoire OR ($cpt = $cpt['n']))) return $tous_id ;
+	if ($requete['LIMIT']) $cpt = min($requete['LIMIT'], $cpt);
+
+	$nb_aff = 1.5 * _TRANCHES;
+	$deb_aff = intval(_request('t_' .$tmp_var));
+
+	if ($cpt > $nb_aff) {
+		$nb_aff = (_TRANCHES); 
+		$tranches = afficher_tranches_requete($cpt, $afficher_auteurs ? 4 + $ajout_col : 3 + $ajout_col, $tmp_var, $javascript, $nb_aff);
 
 	}
-	$requete = str_replace("FROM spip_articles AS articles ", "FROM spip_articles AS articles LEFT JOIN spip_petitions AS petitions USING (id_article)", $requete);
 
-	if (strlen($tranches) OR $toujours_afficher) {
+	$requete['FROM'] = str_replace("spip_articles AS articles ", "spip_articles AS articles LEFT JOIN spip_petitions AS petitions USING (id_article)", $requete['FROM']);
+	$requete['SELECT'] .= ", petitions.id_article AS petition ";
 
-		$res_proch = spip_query("SELECT id_ajax_fonc FROM spip_ajax_fonc WHERE hash=$hash AND id_auteur=$connect_id_auteur ORDER BY id_ajax_fonc DESC LIMIT 1");
-		if ($row = spip_fetch_array($res_proch)) {
+	$res_proch = spip_query("SELECT id_ajax_fonc FROM spip_ajax_fonc WHERE hash=$hash AND id_auteur=$connect_id_auteur ORDER BY id_ajax_fonc DESC LIMIT 1");
+	if ($row = spip_fetch_array($res_proch)) {
 			$id_ajax_fonc = $row["id_ajax_fonc"];
-		} else  {
+	} else  {
 			include_spip('base/abstract_sql');
 			$id_ajax_fonc = spip_abstract_insert("spip_ajax_fonc", "(id_auteur, variables, hash, date)", "($connect_id_auteur, '$jjscript', $hash, NOW())");
-		}
+	}
 
-		if (!$GLOBALS["t_$tmp_var"]) {
+	if (!$deb_aff) {
 
 			if ($afficher_trad) {
 				$tmp_trad = substr(md5($requete_trad), 0, 4);
@@ -773,19 +759,18 @@ function afficher_articles($titre_table, $requete, $afficher_visites = false, $a
 
 			echo "<div id='$tmp_var'>";
 
-		}
+	}
 		
-		$voir_logo = ($spip_display != 1 AND $spip_display != 4 AND $GLOBALS['meta']['image_process'] != "non");
+	$voir_logo = ($spip_display != 1 AND $spip_display != 4 AND $GLOBALS['meta']['image_process'] != "non");
 		
-		if ($voir_logo) include_spip('inc/logos');
+	if ($voir_logo) include_spip('inc/logos');
 
-		//echo "<table width='100%' cellpadding='2' cellspacing='0' border='0'>";
-		echo afficher_liste_debut_tableau();
+	//echo "<table width='100%' cellpadding='2' cellspacing='0' border='0'>";
+	echo afficher_liste_debut_tableau(), str_replace("::id_ajax_fonc::", $id_ajax_fonc, $tranches);
 
-		$tranches = str_replace("::id_ajax_fonc::", $id_ajax_fonc, $tranches);
-		echo $tranches;
-		$result = spip_query($requete);
-		while ($row = spip_fetch_array($result)) {
+	$result = spip_query("SELECT $select FROM $from$where$group$order LIMIT $deb_aff, $nb_aff");
+
+	while ($row = spip_fetch_array($result)) {
 			$vals = '';
 
 			$id_article = $row['id_article'];
@@ -859,18 +844,18 @@ function afficher_articles($titre_table, $requete, $afficher_visites = false, $a
 			
 
 			$table[] = $vals;
-		}
-		spip_free_result($result);
+	}
+	spip_free_result($result);
 
-		if ($options == "avancees") { // Afficher le numero (JMB)
-			if ($afficher_auteurs) {
+	if ($options == "avancees") { // Afficher le numero (JMB)
+		if ($afficher_auteurs) {
 				$largeurs = array(11, '', 80, 100, 50);
 				$styles = array('', 'arial2', 'arial1', 'arial1', 'arial1');
 			} else {
 				$largeurs = array(11, '', 100, 50);
 				$styles = array('', 'arial2', 'arial1', 'arial1');
 			}
-		} else {
+	} else {
 			if ($afficher_auteurs) {
 				$largeurs = array(11, '', 100, 100);
 				$styles = array('', 'arial2', 'arial1', 'arial1');
@@ -878,28 +863,27 @@ function afficher_articles($titre_table, $requete, $afficher_visites = false, $a
 				$largeurs = array(11, '', 100);
 				$styles = array('', 'arial2', 'arial1');
 			}
-		}
-		echo afficher_liste($largeurs, $table, $styles);
+	}
+	echo afficher_liste($largeurs, $table, $styles);
 
-		//echo "</table>";
-		echo afficher_liste_fin_tableau();
-		echo "</div>";
+	//echo "</table>";
+	echo afficher_liste_fin_tableau();
+	echo "</div>";
 		
-		if (!$GLOBALS["t_$tmp_var"]) {
+	if (!$deb_aff) {
 			echo "</div>";
 			if ($afficher_trad) echo "</div>";
 			
-		}
-		
-		//if ($afficher_cadre) fin_cadre_gris_clair();
-
 	}
+		
+	//if ($afficher_cadre) fin_cadre_gris_clair();
 
 	return $tous_id;
 }
 
+
 function afficher_articles_trad($titre_table, $requete, $afficher_visites = false, $afficher_auteurs = true,
-		$toujours_afficher = false, $afficher_cadre = true, $afficher_descriptif = true) {
+		$obligatoire = false, $afficher_cadre = true, $afficher_descriptif = true) {
 
 	global $connect_id_auteur, $connect_statut, $dir_lang;
 	global $options, $spip_lang_left, $spip_lang_right;
@@ -930,9 +914,9 @@ function afficher_articles_trad($titre_table, $requete, $afficher_visites = fals
 	$afficher_visites = ($afficher_visites AND $connect_statut == "0minirezo" AND $activer_statistiques != "non");
 
 	// Preciser la requete (alleger les requetes)
-	if (!ereg("^SELECT", $requete)) {
-		$select = "SELECT articles.id_article, articles.titre, articles.id_rubrique, articles.statut, articles.date, articles.id_trad, articles.lang";
-		$requete = $select . " FROM spip_articles AS articles " . $requete;
+	if (!$requete['SELECT']) {
+		$requete['SELECT'] = "articles.id_article, articles.titre, articles.id_rubrique, articles.statut, articles.date, articles.id_trad, articles.lang";
+
 	}
 	
 	if ($options == "avancees")  $ajout_col = 1;
@@ -950,28 +934,41 @@ function afficher_articles_trad($titre_table, $requete, $afficher_visites = fals
 	
 	$javascript = "charger_id_url('" . generer_url_ecrire("ajax_page", 'fonction=sql&id_ajax_fonc=::id_ajax_fonc::::deb::') . "','$tmp_var')";
 
-	if (preg_match('/(\s+FROM\s+.*?)(ORDER\s+BY\s+.*)?$/', 
-			$requete,
-		       $r)) {
-	  $cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n$r[1]"));
-	  $cpt = $cpt['n'];
+	$tous_id = array();
+
+	$select = $requete['SELECT'] ? $requete['SELECT'] : '*';
+	$from = $requete['FROM'] ? $requete['FROM'] : 'spip_articles AS articles';
+	$where = $requete['WHERE'] ? (' WHERE ' . $requete['WHERE']) : '';
+	$order = $requete['ORDER BY'] ? (' ORDER BY ' . $requete['ORDER BY']) : '';
+	$group = $requete['GROUP BY'] ? (' GROUP BY ' . $requete['GROUP BY']) : '';
+	$limit = $requete['LIMIT'] ? (' LIMIT ' . $requete['LIMIT']) : '';
+
+	$cpt = "$from$where$group";
+	$cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM $cpt"));
+	if (! ($obligatoire OR ($cpt = $cpt['n']))) return $tous_id ;
+	if ($requete['LIMIT']) $cpt = min($requete['LIMIT'], $cpt);
 
-	  $tranches = afficher_tranches_requete($requete, $cpt, 4, $tmp_var, $javascript);
+	$nb_aff = 1.5 * _TRANCHES;
+	$deb_aff = intval(_request('t_' .$tmp_var));
+
+	if ($cpt > $nb_aff) {
+		$nb_aff = (_TRANCHES); 
+		$tranches = afficher_tranches_requete($cpt,  4, $tmp_var, $javascript, $nb_aff);
 	}
 
-	$requete = str_replace("FROM spip_articles AS articles ", "FROM spip_articles AS articles LEFT JOIN spip_petitions AS petitions USING (id_article)", $requete);
+	$requete['FROM'] = str_replace("spip_articles AS articles ", "spip_articles AS articles LEFT JOIN spip_petitions AS petitions USING (id_article)", $requete['FROM']);
+	$requete['SELECT'] .= ", petitions.id_article AS petition ";
 
-	if (strlen($tranches) OR $toujours_afficher) {
 
-		$res_proch = spip_query("SELECT id_ajax_fonc FROM spip_ajax_fonc WHERE hash=$hash AND id_auteur=$connect_id_auteur ORDER BY id_ajax_fonc DESC LIMIT 1");
-		if ($row = spip_fetch_array($res_proch)) {
+	$res_proch = spip_query("SELECT id_ajax_fonc FROM spip_ajax_fonc WHERE hash=$hash AND id_auteur=$connect_id_auteur ORDER BY id_ajax_fonc DESC LIMIT 1");
+	if ($row = spip_fetch_array($res_proch)) {
 			$id_ajax_fonc = $row["id_ajax_fonc"];
-		} else  {
+	} else  {
 			include_spip('base/abstract_sql');
 			$id_ajax_fonc = spip_abstract_insert("spip_ajax_fonc", "(id_auteur, variables, hash, date)", "($connect_id_auteur, '$jjscript', $hash, NOW())");
 		}
 
-		if (!$GLOBALS["t_$tmp_var"]) {
+	if (!$deb_aff) {
 
 			echo "<div id='$div_trad'>";
 
@@ -988,18 +985,14 @@ function afficher_articles_trad($titre_table, $requete, $afficher_visites = fals
 			bandeau_titre_boite2($texte_img.$titre_table, "article-24.gif");
 
 			echo "<div id='$tmp_var'>";
-
-		}
+	}
 		
+	//echo "<table width='100%' cellpadding='2' cellspacing='0' border='0'>";
+	echo afficher_liste_debut_tableau(), ereg_replace("\:\:id\_ajax\_fonc\:\:", $id_ajax_fonc, $tranches);
 
-		//echo "<table width='100%' cellpadding='2' cellspacing='0' border='0'>";
-		echo afficher_liste_debut_tableau();
+	$result = spip_query("SELECT $select FROM $from$where$group$order LIMIT $deb_aff, $nb_aff");
 
-		$tranches = ereg_replace("\:\:id\_ajax\_fonc\:\:", $id_ajax_fonc, $tranches);
-		echo $tranches;
-
-		$result = spip_query($requete);
-		while ($row = spip_fetch_array($result)) {
+	while ($row = spip_fetch_array($result)) {
 			$vals = '';
 
 			$id_article = $row['id_article'];
@@ -1079,23 +1072,21 @@ function afficher_articles_trad($titre_table, $requete, $afficher_visites = fals
 			$vals[] = "";
 
 			$table[] = $vals;
-		}
-		spip_free_result($result);
+	}
+	spip_free_result($result);
 
-		$largeurs = array(11, 24, '', '1');
-		$styles = array('', 'arial1', 'arial1', '');
+	$largeurs = array(11, 24, '', '1');
+	$styles = array('', 'arial1', 'arial1', '');
 
-		echo afficher_liste($largeurs, $table, $styles);
+	echo afficher_liste($largeurs, $table, $styles);
 
-		//echo "</table>";
-		echo afficher_liste_fin_tableau();
-		echo "</div>";
+	//echo "</table>";
+	echo afficher_liste_fin_tableau();
+	echo "</div>";
 		
-		if (!$GLOBALS["t_$tmp_var"]) echo "</div>";
+	if (!$GLOBALS["t_$tmp_var"]) echo "</div>";
 		
-		//if ($afficher_cadre) fin_cadre_gris_clair();
-
-	}
+	//if ($afficher_cadre) fin_cadre_gris_clair();
 
 	return $tous_id;
 }
@@ -1109,46 +1100,60 @@ function afficher_articles_trad($titre_table, $requete, $afficher_visites = fals
 function afficher_breves($titre_table, $requete, $affrub=false) {
 	global $connect_id_auteur, $spip_lang_right, $spip_lang_left, $dir_lang, $couleur_foncee, $spip_display, $connect_statut, $options;	
 
-
-	if (($GLOBALS['meta']['multi_rubriques'] == 'oui' AND $GLOBALS['id_rubrique'] == 0) OR $GLOBALS['meta']['multi_articles'] == 'oui') {
+	if (($GLOBALS['meta']['multi_rubriques'] == 'oui'
+		AND $GLOBALS['id_rubrique'] == 0)
+	OR $GLOBALS['meta']['multi_articles'] == 'oui') {
 		$afficher_langue = true;
-		$requete = ereg_replace(" FROM", ", lang FROM", $requete);
+		if ($requete["SELECT"]) $requete["SELECT"].= ", lang";
 		if ($GLOBALS['langue_rubrique']) $langue_defaut = $GLOBALS['langue_rubrique'];
 		else $langue_defaut = $GLOBALS['meta']['langue_site'];
 	}
 
-	if (preg_match('/(\bFROM\s+.*?)(\s+ORDER\s+BY\s+.*)?$/', 
-			$requete,
-		       $r)) {
-		$cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n $r[1]"));
-		$cpt = $cpt['n'];
+	$tous_id = array();
+
+	$select = $requete['SELECT'] ? $requete['SELECT'] : '*';
+	$from = $requete['FROM'];
+	$where = $requete['WHERE'] ? (' WHERE ' . $requete['WHERE']) : '';
+	$order = $requete['ORDER BY'] ? (' ORDER BY ' . $requete['ORDER BY']) : '';
+	$group = $requete['GROUP BY'] ? (' GROUP BY ' . $requete['GROUP BY']) : '';
+	$limit = $requete['LIMIT'] ? (' LIMIT ' . $requete['LIMIT']) : '';
+
+	$cpt = "$from$where$group";
+	$tmp_var = substr(md5($cpt), 0, 4);
+
+	$cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM $cpt"));
+	if (! ($cpt = $cpt['n'])) return $tous_id ;
+	if ($requete['LIMIT']) $cpt = min($requete['LIMIT'], $cpt);
 
-		$tranches = afficher_tranches_requete($requete, $cpt, ($options == "avancees") ? 4 : 3);
+	$nb_aff = 1.5 * _TRANCHES;
+	$deb_aff = intval(_request('t_' .$tmp_var));
+
+	if ($cpt > $nb_aff) {
+		$nb_aff = (_TRANCHES); 
+		$tranches = afficher_tranches_requete($cpt,  ($options == "avancees") ? 4 : 3, $tmp_var, '', $nb_aff);
 	}
-	if (strlen($tranches)) {
 
-		//debut_cadre_relief("breve-24.gif");
+	if ($titre_table) echo "<div style='height: 12px;'></div>";
+	echo "<div class='liste'>";
 
-		if ($titre_table) echo "<div style='height: 12px;'></div>";
-		echo "<div class='liste'>";
+	if ($titre_table) {
+		bandeau_titre_boite2($titre_table, "breve-24.gif", $couleur_foncee, "white");
+	}
 
-		if ($titre_table) {
-			bandeau_titre_boite2($titre_table, "breve-24.gif", $couleur_foncee, "white");
-		}
+	echo "<table width='100%' cellpadding='2' cellspacing='0' border='0' background=''>";
 
-		echo "<table width='100%' cellpadding='2' cellspacing='0' border='0' background=''>";
+	echo $tranches;
 
-		echo $tranches;
 
-		$result = spip_query($requete);
+	$result = spip_query("SELECT $select FROM $from$where$group$order LIMIT $deb_aff, $nb_aff");
 
-		$table = '';
-		$droit = ($connect_statut == '0minirezo' && $options == 'avancees');
-		$voir_logo = ($spip_display != 1 AND $spip_display != 4 AND $GLOBALS['meta']['image_process'] != "non");
+	$table = '';
+	$droit = ($connect_statut == '0minirezo' && $options == 'avancees');
+	$voir_logo = ($spip_display != 1 AND $spip_display != 4 AND $GLOBALS['meta']['image_process'] != "non");
 		
-		if ($voir_logo) include_spip('inc/logos');
+	if ($voir_logo) include_spip('inc/logos');
 
-		while ($row = spip_fetch_array($result)) {
+	while ($row = spip_fetch_array($result)) {
 			$vals = '';
 
 			$id_breve = $row['id_breve'];
@@ -1206,7 +1211,6 @@ function afficher_breves($titre_table, $requete, $affrub=false) {
 
 		echo "</table></div>";
 		//fin_cadre_relief();
-	}
 	return $tous_id;
 }
 
@@ -1218,33 +1222,45 @@ function afficher_breves($titre_table, $requete, $affrub=false) {
 function afficher_rubriques($titre_table, $requete) {
 	global $connect_id_auteur;
 	global $spip_lang_rtl;
+	$tous_id = array();
 
-	if (preg_match('/(\s+FROM\s+.*?)(ORDER\s+BY\s+.*)?$/', 
-			$requete,
-		       $r)) {
-	  $cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n$r[1]"));
-	  $cpt = $cpt['n'];
+	$select = $requete['SELECT'] ? $requete['SELECT'] : '*';
+	$from = $requete['FROM'];
+	$where = $requete['WHERE'] ? (' WHERE ' . $requete['WHERE']) : '';
+	$order = $requete['ORDER BY'] ? (' ORDER BY ' . $requete['ORDER BY']) : '';
+	$group = $requete['GROUP BY'] ? (' GROUP BY ' . $requete['GROUP BY']) : '';
+	$limit = $requete['LIMIT'] ? (' LIMIT ' . $requete['LIMIT']) : '';
 
-	  $tranches = afficher_tranches_requete($requete, $cpt, 3);
-	}
+	$cpt = "$from$where$group";
+	$tmp_var = substr(md5($cpt), 0, 4);
 
-	if (strlen($tranches)) {
+	$cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM $cpt"));
+	if (! ($cpt = $cpt['n'])) return $tous_id ;
+	if ($requete['LIMIT']) $cpt = min($requete['LIMIT'], $cpt);
 
-		if ($titre_table) echo "<div style='height: 12px;'></div>";
-		echo "<div class='liste'>";
+	$nb_aff = 1.5 * _TRANCHES;
+	$deb_aff = intval(_request('t_' .$tmp_var));
+
+	if ($cpt > $nb_aff) {
+		$nb_aff = (_TRANCHES); 
+		$tranches = afficher_tranches_requete($cpt,  ($options == "avancees") ? 4 : 3, $tmp_var, '', $nb_aff);
+	}
+
+	if ($titre_table) echo "<div style='height: 12px;'></div>";
+	echo "<div class='liste'>";
 		//debut_cadre_relief("rubrique-24.gif");
 
-		if ($titre_table) {
+	if ($titre_table) {
 			bandeau_titre_boite2($titre_table, "rubrique-24.gif", "#999999", "white");
 		}
-		echo "<table width=100% cellpadding=3 cellspacing=0 border=0 background=''>";
+	echo "<table width=100% cellpadding=3 cellspacing=0 border=0 background=''>";
 
-		echo $tranches;
+	echo $tranches;
 
-		$result = spip_query($requete);
+	$result = spip_query("SELECT $select FROM $from$where$group$order LIMIT $deb_aff, $nb_aff");
 
-		$table = '';
-		while ($row = spip_fetch_array($result)) {
+	$table = '';
+	while ($row = spip_fetch_array($result)) {
 			$vals = '';
 
 			$id_rubrique = $row['id_rubrique'];
@@ -1275,17 +1291,17 @@ function afficher_rubriques($titre_table, $requete) {
 			$s .= "</div>";
 			$vals[] = $s;
 			$table[] = $vals;
-		}
-		spip_free_result($result);
+	}
+	spip_free_result($result);
 
-		$largeurs = array('12','', '');
-		$styles = array('', 'arial2', 'arial11');
-		echo afficher_liste($largeurs, $table, $styles);
+	$largeurs = array('12','', '');
+	$styles = array('', 'arial2', 'arial11');
+	echo afficher_liste($largeurs, $table, $styles);
+
+	echo "</TABLE>";
+	//fin_cadre_relief();
+	echo "</div>";
 
-		echo "</TABLE>";
-		//fin_cadre_relief();
-		echo "</div>";
-	}
 	return $tous_id;
 }
 
@@ -1338,36 +1354,49 @@ function puce_statut($statut, $type='article') {
 
 
 function afficher_auteurs ($titre_table, $requete) {
-	if (preg_match('/(\s+FROM\s+.*?)(ORDER\s+BY\s+.*)?$/', 
-			$requete,
-		       $r)) {
+	$tous_id = array();
 
-	  $cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n$r[1]"));
-	  $cpt = $cpt['n'];
-	  $tranches = afficher_tranches_requete($requete, $cpt, 2);
-	}
+	$select = $requete['SELECT'] ? $requete['SELECT'] : '*';
+	$from = $requete['FROM'];
+	$where = $requete['WHERE'] ? (' WHERE ' . $requete['WHERE']) : '';
+	$order = $requete['ORDER BY'] ? (' ORDER BY ' . $requete['ORDER BY']) : '';
+	$group = $requete['GROUP BY'] ? (' GROUP BY ' . $requete['GROUP BY']) : '';
+	$limit = $requete['LIMIT'] ? (' LIMIT ' . $requete['LIMIT']) : '';
 
-	if (strlen($tranches)) {
+	$cpt = "$from$where$group";
+	$tmp_var = substr(md5($cpt), 0, 4);
 
-		debut_cadre_relief("auteur-24.gif");
+	$cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM $cpt"));
+	if (! ($cpt = $cpt['n'])) return $tous_id ;
+	if ($requete['LIMIT']) $cpt = min($requete['LIMIT'], $cpt);
 
-		if ($titre_table) {
+	$nb_aff = 1.5 * _TRANCHES;
+	$deb_aff = intval(_request('t_' .$tmp_var));
+
+	if ($cpt > $nb_aff) {
+		$nb_aff = (_TRANCHES); 
+		$tranches = afficher_tranches_requete($cpt,  ($options == "avancees") ? 4 : 3, $tmp_var, '', $nb_aff);
+	}
+
+	debut_cadre_relief("auteur-24.gif");
+
+	if ($titre_table) {
 			echo "<p><table width=100% cellpadding=0 cellspacing=0 border=0 background=''>";
 			echo "<tr><td width=100% background=''>";
 			echo "<table width=100% cellpadding=3 cellspacing=0 border=0>";
 			echo "<tr bgcolor='#333333'><td width=100% colspan=2><font face='Verdana,Arial,Sans,sans-serif' size=3 color='#FFFFFF'>";
 			echo "<b>$titre_table</b></font></td></tr>";
 		}
-		else {
+	else {
 			echo "<p><table width=100% cellpadding=3 cellspacing=0 border=0 background=''>";
 		}
 
-		echo $tranches;
+	echo $tranches;
 
-		$result = spip_query($requete);
+	$result = spip_query("SELECT $select FROM $from$where$group$order LIMIT $deb_aff, $nb_aff");
 
-		$table = '';
-		while ($row = spip_fetch_array($result)) {
+	$table = '';
+	while ($row = spip_fetch_array($result)) {
 			$vals = '';
 
 			$id_auteur = $row['id_auteur'];
@@ -1380,17 +1409,17 @@ function afficher_auteurs ($titre_table, $requete) {
 			$s .= "</a>";
 			$vals[] = $s;
 			$table[] = $vals;
-		}
-		spip_free_result($result);
+	}
+	spip_free_result($result);
 
-		$largeurs = array('');
-		$styles = array('arial2');
-		echo afficher_liste($largeurs, $table, $styles);
+	$largeurs = array('');
+	$styles = array('arial2');
+	echo afficher_liste($largeurs, $table, $styles);
+
+	if ($titre_table) echo "</TABLE></TD></TR>";
+	echo "</TABLE>";
+	fin_cadre_relief();
 
-		if ($titre_table) echo "</TABLE></TD></TR>";
-		echo "</TABLE>";
-		fin_cadre_relief();
-	}
 	return $tous_id;
 }
 
diff --git a/ecrire/inc/sites_voir.php b/ecrire/inc/sites_voir.php
index d94e6d60d9942faf33e9e4fe61aaa9ce05fdfdc4..2abb640bdff43fb2e818dbad6c68829753358282 100644
--- a/ecrire/inc/sites_voir.php
+++ b/ecrire/inc/sites_voir.php
@@ -16,35 +16,46 @@ function afficher_sites($titre_table, $requete) {
 	global $couleur_claire, $spip_lang_left, $spip_lang_right;
 	global $connect_id_auteur;
 
-	if (preg_match('/(\s+FROM\s+.*?)(ORDER\s+BY\s+.*)?$/', 
-			$requete,
-		       $r)) {
+	$tous_id = array();
 
-	  $cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n$r[1]"));
-	  $cpt = $cpt['n'];
+	$from = $requete['FROM'];
+	$where = $requete['WHERE'] ? (' WHERE ' . $requete['WHERE']) : '';
+	$order = $requete['ORDER BY'] ? (' ORDER BY ' . $requete['ORDER BY']) : '';
+	$group = $requete['GROUP BY'] ? (' GROUP BY ' . $requete['GROUP BY']) : '';
+	$limit = $requete['LIMIT'] ? (' LIMIT ' . $requete['LIMIT']) : '';
 
-	  $tranches = afficher_tranches_requete($requete, $cpt, 3);
+	$cpt = "$from$where$group";
+	$tmp_var = substr(md5($cpt), 0, 4);
+
+	$cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM $cpt"));
+	if (! ($cpt = $cpt['n'])) return $tous_id ;
+	if ($requete['LIMIT']) $cpt = min($requete['LIMIT'], $cpt);
+
+	$nb_aff = 1.5 * _TRANCHES;
+	$deb_aff = intval(_request('t_' .$tmp_var));
+
+	if ($cpt > $nb_aff) {
+		$nb_aff = (_TRANCHES); 
+		$tranches = afficher_tranches_requete($cpt, 3, $tmp_var, '', $nb_aff);
 	}
-	if ($tranches) {
-//		debut_cadre_relief("site-24.gif");
-		if ($titre_table) echo "<div style='height: 12px;'></div>";
-		echo "<div class='liste'>";
-		bandeau_titre_boite2($titre_table, "site-24.gif", $couleur_claire, "black");
-		echo "<table width='100%' cellpadding='2' cellspacing='0' border='0'>";
 
-		echo $tranches;
+	if ($titre_table) echo "<div style='height: 12px;'></div>";
+	echo "<div class='liste'>";
+	bandeau_titre_boite2($titre_table, "site-24.gif", $couleur_claire, "black");
+	echo "<table width='100%' cellpadding='2' cellspacing='0' border='0'>";
+
+	echo $tranches;
 
-	 	$result = spip_query($requete);
-		$num_rows = spip_num_rows($result);
+	$result = spip_query("SELECT * FROM $from$where$group$order LIMIT $deb_aff, $nb_aff");
 
-		$ifond = 0;
-		$premier = true;
-		$voir_logo = ($spip_display != 1 AND $spip_display != 4 AND $GLOBALS['meta']['image_process'] != "non");
+	$ifond = 0;
+	$premier = true;
+	$voir_logo = ($spip_display != 1 AND $spip_display != 4 AND $GLOBALS['meta']['image_process'] != "non");
 		
-		if ($voir_logo) include_spip('inc/logos');
+	if ($voir_logo) include_spip('inc/logos');
 		
-		$compteur_liste = 0;
-		while ($row = spip_fetch_array($result)) {
+	$compteur_liste = 0;
+	while ($row = spip_fetch_array($result)) {
 			$vals = '';
 			$id_syndic=$row["id_syndic"];
 			$id_rubrique=$row["id_rubrique"];
@@ -127,66 +138,66 @@ function afficher_sites($titre_table, $requete) {
 			//echo "</td>";					
 			//echo "</tr></n>";
 			$table[] = $vals;
-		}
-		spip_free_result($result);
-		
-		$largeurs = array('','','');
-		$styles = array('arial11', 'arial1', 'arial1');
-		echo afficher_liste($largeurs, $table, $styles);
-		echo "</table>";
-		//fin_cadre_relief();
-		echo "</div>\n";
 	}
+	spip_free_result($result);
+		
+	$largeurs = array('','','');
+	$styles = array('arial11', 'arial1', 'arial1');
+	echo afficher_liste($largeurs, $table, $styles);
+	echo "</table>";
+	echo "</div>\n";
 	return $tous_id;
 }
 
 function afficher_syndic_articles($titre_table, $requete, $afficher_site = false) {
-	global $connect_statut;
-	global $REQUEST_URI;
-	global $debut_liste_sites;
-	global $flag_editable;
+	global $connect_statut, $REQUEST_URI, $spip_lang_rtl, $spip_lang_right;
 
-	static $n_liste_sites;
-	global $spip_lang_rtl, $spip_lang_right;
+	$cols = 2;
+	if ($connect_statut == '0minirezo') $cols ++;
+	if ($afficher_site) $cols ++;
 
-	$adresse_page = substr($REQUEST_URI, strpos($REQUEST_URI, "/ecrire")+8, strlen($REQUEST_URI));
-	$adresse_page = ereg_replace("\&?debut\_liste\_sites\[$n_liste_sites\]\=[0-9]+","",$adresse_page);
-	$adresse_page = ereg_replace("\&?(ajouter\_lien|supprimer_lien)\=[0-9]+","",$adresse_page);
+	$tous_id = array();
 
-	if (ereg("\?",$adresse_page)) $lien_url = "&";
-	else $lien_url = "?";
+	$from = $requete['FROM'] ? $requete['FROM'] : 'spip_syndic_articles';
+	$where = $requete['WHERE'] ? (' WHERE ' . $requete['WHERE']) : '';
+	$order = $requete['ORDER BY'] ? (' ORDER BY ' . $requete['ORDER BY']) : '';
+	$group = $requete['GROUP BY'] ? (' GROUP BY ' . $requete['GROUP BY']) : '';
+	$limit = $requete['LIMIT'] ? (' LIMIT ' . $requete['LIMIT']) : '';
 
-	$lien_url .= "debut_liste_sites[".$n_liste_sites."]=".$debut_liste_sites[$n_liste_sites]."&";
+	$cpt = "$from$where$group";
+	$tmp_var = substr(md5($cpt), 0, 4);
+	$cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM $cpt"));
+	if (! ($obligatoire OR ($cpt = $cpt['n']))) return $tous_id ;
+	if ($requete['LIMIT']) $cpt = min($requete['LIMIT'], $cpt);
 
-	$cols = 2;
-	if ($connect_statut == '0minirezo') $cols ++;
-	if ($afficher_site) $cols ++;
+	$nb_aff = 1.5 * _TRANCHES;
+	$deb_aff = intval(_request('t_' .$tmp_var));
 
-	if (preg_match('/(\s+FROM\s+.*?)(ORDER\s+BY\s+.*)?$/ms', 
-			$requete,
-		       $r)) {
-	  $cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n$r[1]"));
-	  $cpt = $cpt['n'];
-	  $tranches = afficher_tranches_requete($requete, $cpt, $cols);
-	}
+	if ($cpt > $nb_aff) {
+		$nb_aff = (_TRANCHES); 
+		$tranches = afficher_tranches_requete($cpt, $cols, $tmp_var, '', $nb_aff);
 
-	if (strlen($tranches)) {
+	}
 
-		if ($titre_table) echo "<div style='height: 12px;'></div>";
-		echo "<div class='liste'>";
+	if ($titre_table) echo "<div style='height: 12px;'></div>";
+	echo "<div class='liste'>";
 		//debut_cadre_relief("rubrique-24.gif");
 
-		if ($titre_table) {
+	if ($titre_table) {
 			bandeau_titre_boite2($titre_table, "site-24.gif", "#999999", "white");
-		}
-		echo "<table width=100% cellpadding=3 cellspacing=0 border=0 background=''>";
+	}
+	echo "<table width=100% cellpadding=3 cellspacing=0 border=0 background=''>";
 
-		echo $tranches;
+	echo $tranches;
 
-		$result = spip_query($requete);
+	$result = spip_query("SELECT * FROM $from$where$group$order LIMIT $deb_aff, $nb_aff");
 
-		$table = '';
-		while ($row = spip_fetch_array($result)) {
+	$adresse_page = substr($REQUEST_URI, strpos($REQUEST_URI, "/ecrire")+8, strlen($REQUEST_URI));
+	$adresse_page = ereg_replace("\&?(ajouter\_lien|supprimer_lien)\=[0-9]+","",$adresse_page);
+	$adresse_page = ereg_replace("\&?(t_$tmp_var)\=[0-9]+","",$adresse_page);
+	$adresse_page .=  (ereg("\?",$adresse_page) ? "&" : "?") . 't_' .$tmp_var . '=' . $deb_aff . '&'; 
+	$table = '';
+	while ($row = spip_fetch_array($result)) {
 			$vals = '';
 
 			$id_syndic_article=$row["id_syndic_article"];
@@ -270,11 +281,11 @@ function afficher_syndic_articles($titre_table, $requete, $afficher_site = false
 			
 			if ($connect_statut == '0minirezo'){
 				if ($statut == "publie"){
-					$s =  "[<a href='".$adresse_page.$lien_url."id_syndic=$id_syndic&supprimer_lien=$id_syndic_article'><font color='black'>"._T('info_bloquer_lien')."</font></a>]";
+					$s =  "[<a href='".$adresse_page."id_syndic=$id_syndic&supprimer_lien=$id_syndic_article'><font color='black'>"._T('info_bloquer_lien')."</font></a>]";
 				
 				}
 				else if ($statut == "refuse"){
-					$s =  "[<a href='".$adresse_page.$lien_url."id_syndic=$id_syndic&ajouter_lien=$id_syndic_article'>"._T('info_retablir_lien')."</a>]";
+					$s =  "[<a href='".$adresse_page."id_syndic=$id_syndic&ajouter_lien=$id_syndic_article'>"._T('info_retablir_lien')."</a>]";
 				}
 				else if ($statut == "off"
 				AND $my_sites[$id_syndic]['miroir'] == 'oui') {
@@ -282,34 +293,34 @@ function afficher_syndic_articles($titre_table, $requete, $afficher_site = false
 				}
 				else /* 'dispo' ou 'off' (dans le cas ancien site 'miroir') */
 				{
-					$s = "[<a href='".$adresse_page.$lien_url."id_syndic=$id_syndic&ajouter_lien=$id_syndic_article'>"._T('info_valider_lien')."</a>]";
+					$s = "[<a href='".$adresse_page."id_syndic=$id_syndic&ajouter_lien=$id_syndic_article'>"._T('info_valider_lien')."</a>]";
 				}
 				$vals[] = $s;
 			}
 					
 			$table[] = $vals;
 		}
-		spip_free_result($result);
+	spip_free_result($result);
 
 		
-		if ($afficher_site) {
+	if ($afficher_site) {
 			$largeurs = array(7, '', '100');
 			$styles = array('','arial11', 'arial1');
-		} else {
+	} else {
 			$largeurs = array(7, '');
 			$styles = array('','arial11');
-		}
-		if ($connect_statut == '0minirezo') {
+	}
+	if ($connect_statut == '0minirezo') {
 			$largeurs[] = '80';
 			$styles[] = 'arial1';
-		}
+	}
 		
-		echo afficher_liste($largeurs, $table, $styles);
+	echo afficher_liste($largeurs, $table, $styles);
+
+	echo "</TABLE>";
+	//fin_cadre_relief();
+	echo "</div>";
 
-		echo "</TABLE>";
-		//fin_cadre_relief();
-		echo "</div>";
-	}
 	return $tous_id;
 }
 ?>
diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index 1047617ff5df23b16a74af1252d9d82ab50ab5c3..642ac47c363206eb5086148095b19d8ae5416288 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -539,7 +539,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 
 	list($fct, $col, $op, $val, $args_sql) =
 	  calculer_critere_infixe_ops($idb, $boucles, $crit);
-		spip_log("col $col ");
+
 	// Cas particulier : id_enfant => utiliser la colonne id_objet
 	if ($col == 'id_enfant')
 	  $col = $boucle->primary;
@@ -554,7 +554,6 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 	$col, $regs)) {
 		list($col, $table) =
 		calculer_critere_infixe_date($idb, $boucles, $regs);
-		spip_log("col $col table $table");
 	}
 
 	// HACK : selection des documents selon mode 'image'