Skip to content
Extraits de code Groupes Projets
Valider 15f653fc rédigé par Fil's avatar Fil
Parcourir les fichiers

un safehtml inutile dans les forums

+ un code d'optimisation de la base de données qui semble marcher (à vérifier sur des bases de test !)
parent 6da93b1f
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
if (!defined("_ECRIRE_INC_VERSION")) return; if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/indexation');
function optimiser_base() { function optimiser_base() {
spip_log ("optimisation de la base"); spip_log ("optimisation de la base");
...@@ -23,25 +22,53 @@ function optimiser_base() { ...@@ -23,25 +22,53 @@ function optimiser_base() {
// Rubriques // Rubriques
// //
$query = "SELECT id_rubrique FROM spip_rubriques"; # les articles qui sont dans une id_rubrique inexistante
$result = spip_query($query); $query = "DELETE spip_articles FROM spip_articles AS articles
$rubriques = '0'; LEFT JOIN spip_rubriques AS rubriques
while ($row = spip_fetch_array($result)) $rubriques .= ','.$row['id_rubrique']; ON articles.id_rubrique=rubriques.id_rubrique
WHERE rubriques.id_rubrique IS NULL
AND articles.maj < $mydate";
spip_query($query);
if ($rubriques) { # les breves qui sont dans une id_rubrique inexistante
$query = "DELETE FROM spip_articles WHERE id_rubrique NOT IN ($rubriques) AND maj < $mydate"; $query = "DELETE spip_breves FROM spip_breves AS breves
spip_query($query); LEFT JOIN spip_rubriques AS rubriques
$query = "DELETE FROM spip_breves WHERE id_rubrique NOT IN ($rubriques) AND maj < $mydate"; ON breves.id_rubrique=rubriques.id_rubrique
spip_query($query); WHERE rubriques.id_rubrique IS NULL
$query = "DELETE FROM spip_forum WHERE id_rubrique NOT IN (0,$rubriques)"; AND breves.maj < $mydate";
spip_query($query); spip_query($query);
$query = "DELETE FROM spip_auteurs_rubriques WHERE id_rubrique NOT IN ($rubriques)";
spip_query($query); # les forums lies a une id_rubrique inexistante
$query = "DELETE FROM spip_documents_rubriques WHERE id_rubrique NOT IN ($rubriques)"; $query = "DELETE spip_forum FROM spip_forum AS forum
spip_query($query); LEFT JOIN spip_rubriques AS rubriques
$query = "DELETE FROM spip_mots_rubriques WHERE id_rubrique NOT IN ($rubriques)"; ON forum.id_rubrique=rubriques.id_rubrique
spip_query($query); WHERE rubriques.id_rubrique IS NULL
} AND forum.id_rubrique>0";
spip_query($query);
# les droits d'auteurs sur une id_rubrique inexistante
$query = "DELETE spip_auteurs_rubriques
FROM spip_auteurs_rubriques AS auteurs_rubriques
LEFT JOIN spip_rubriques AS rubriques
ON auteurs_rubriques.id_rubrique=rubriques.id_rubrique
WHERE rubriques.id_rubrique IS NULL";
spip_query($query);
# les liens des documents qui sont dans une id_rubrique inexistante
$query = "DELETE spip_documents_rubriques
FROM spip_documents_rubriques AS documents_rubriques
LEFT JOIN spip_rubriques AS rubriques
ON documents_rubriques.id_rubrique=rubriques.id_rubrique
WHERE rubriques.id_rubrique IS NULL";
spip_query($query);
# les liens des mots affectes a une id_rubrique inexistante
$query = "DELETE spip_mots_rubriques
FROM spip_mots_rubriques AS mots_rubriques
LEFT JOIN spip_rubriques AS rubriques
ON mots_rubriques.id_rubrique=rubriques.id_rubrique
WHERE rubriques.id_rubrique IS NULL";
spip_query($query);
// //
...@@ -50,21 +77,37 @@ function optimiser_base() { ...@@ -50,21 +77,37 @@ function optimiser_base() {
$query = "DELETE FROM spip_articles WHERE statut='poubelle' AND maj < $mydate"; $query = "DELETE FROM spip_articles WHERE statut='poubelle' AND maj < $mydate";
spip_query($query); spip_query($query);
$query = "SELECT id_article FROM spip_articles";
$result = spip_query($query);
$articles = '0';
while ($row = spip_fetch_array($result)) $articles .= ','.$row['id_article'];
if ($articles) { # les liens d'auteurs d'articles effaces
$query = "DELETE FROM spip_auteurs_articles WHERE id_article NOT IN ($articles)"; $query = "DELETE spip_auteurs_articles
spip_query($query); FROM spip_auteurs_articles AS auteurs_articles
$query = "DELETE FROM spip_documents_articles WHERE id_article NOT IN ($articles)"; LEFT JOIN spip_articles AS articles
spip_query($query); ON auteurs_articles.id_article=articles.id_article
$query = "DELETE FROM spip_mots_articles WHERE id_article NOT IN ($articles)"; WHERE articles.id_article IS NULL";
spip_query($query); spip_query($query);
$query = "DELETE FROM spip_forum WHERE id_article NOT IN (0,$articles)";
spip_query($query); # les liens de documents d'articles effaces
} $query = "DELETE spip_documents_articles
FROM spip_documents_articles AS documents_articles
LEFT JOIN spip_articles AS articles
ON documents_articles.id_article=articles.id_article
WHERE articles.id_article IS NULL";
spip_query($query);
# les liens de mots affectes a des articles effaces
$query = "DELETE spip_mots_articles FROM spip_mots_articles AS mots_articles
LEFT JOIN spip_articles AS articles
ON mots_articles.id_article=articles.id_article
WHERE articles.id_article IS NULL";
spip_query($query);
# les forums lies a des articles effaces
$query = "DELETE spip_forum FROM spip_forum AS forum
LEFT JOIN spip_articles AS articles
ON forum.id_article=articles.id_article
WHERE articles.id_article IS NULL
AND forum.id_article>0";
spip_query($query);
// //
...@@ -73,19 +116,29 @@ function optimiser_base() { ...@@ -73,19 +116,29 @@ function optimiser_base() {
$query = "DELETE FROM spip_breves WHERE statut='refuse' AND maj < $mydate"; $query = "DELETE FROM spip_breves WHERE statut='refuse' AND maj < $mydate";
spip_query($query); spip_query($query);
$breves = '0';
$query = "SELECT id_breve FROM spip_breves";
$result = spip_query($query);
while ($row = spip_fetch_array($result)) $breves .= ','.$row['id_breve'];
if ($breves) { # les liens de documents sur des breves effacees
$query = "DELETE FROM spip_documents_breves WHERE id_breve NOT IN ($breves)"; $query = "DELETE spip_documents_breves
spip_query($query); FROM spip_documents_breves AS documents_breves
$query = "DELETE FROM spip_mots_breves WHERE id_breve NOT IN ($breves)"; LEFT JOIN spip_breves AS breves
spip_query($query); ON documents_breves.id_breve=breves.id_breve
$query = "DELETE FROM spip_forum WHERE id_breve NOT IN (0,$breves)"; WHERE breves.id_breve IS NULL";
spip_query($query); spip_query($query);
}
# les liens de mots affectes a des breves effacees
$query = "DELETE spip_mots_breves FROM spip_mots_breves AS mots_breves
LEFT JOIN spip_breves AS breves
ON mots_breves.id_breve=breves.id_breve
WHERE breves.id_breve IS NULL";
spip_query($query);
# les forums lies a des breves effacees
$query = "DELETE spip_forum FROM spip_forum AS forum
LEFT JOIN spip_breves AS breves
ON forum.id_breve=breves.id_breve
WHERE breves.id_breve IS NULL
AND forum.id_breve>0";
spip_query($query);
// //
...@@ -95,78 +148,79 @@ function optimiser_base() { ...@@ -95,78 +148,79 @@ function optimiser_base() {
$query = "DELETE FROM spip_syndic WHERE maj < $mydate AND statut = 'refuse'"; $query = "DELETE FROM spip_syndic WHERE maj < $mydate AND statut = 'refuse'";
spip_query($query); spip_query($query);
$syndic = '0'; # les articles syndiques appartenant a des sites effaces
$query = "SELECT id_syndic FROM spip_syndic"; $query = "DELETE spip_syndic_articles
$result = spip_query($query); FROM spip_syndic_articles AS syndic_articles
while ($row = spip_fetch_array($result)) $syndic .= ','.$row['id_syndic']; LEFT JOIN spip_syndic AS syndic
ON syndic_articles.id_syndic=syndic.id_syndic
WHERE syndic.id_syndic IS NULL";
spip_query($query);
if ($syndic) { # les liens de mots affectes a des sites effaces
$query = "DELETE FROM spip_syndic_articles WHERE id_syndic NOT IN (0,$syndic)"; $query = "DELETE spip_mots_syndic FROM spip_mots_syndic AS mots_syndic
spip_query($query); LEFT JOIN spip_syndic AS syndic
$query = "DELETE FROM spip_mots_syndic WHERE id_syndic NOT IN ($syndic)"; ON mots_syndic.id_syndic=syndic.id_syndic
spip_query($query); WHERE syndic.id_syndic IS NULL";
$query = "DELETE FROM spip_forum WHERE id_syndic NOT IN (0,$syndic)"; spip_query($query);
spip_query($query);
} # les forums lies a des sites effaces
$query = "DELETE spip_forum FROM spip_forum AS forum
LEFT JOIN spip_syndic AS syndic
ON forum.id_syndic=syndic.id_syndic
WHERE syndic.id_syndic IS NULL
AND forum.id_syndic>0";
spip_query($query);
// //
// Auteurs // Auteurs
// //
$auteurs = '0'; # les liens d'articles sur des auteurs effaces
$query = "SELECT id_auteur FROM spip_auteurs"; $query = "DELETE spip_auteurs_articles
$result = spip_query($query); FROM spip_auteurs_articles AS auteurs_articles
while ($row = spip_fetch_array($result)) $auteurs .= ','.$row['id_auteur']; LEFT JOIN spip_auteurs AS auteurs
ON auteurs_articles.id_auteur=auteurs.id_auteur
WHERE auteurs.id_auteur IS NULL";
spip_query($query);
if ($auteurs) { # les liens de messages sur des auteurs effaces
$query = "DELETE FROM spip_auteurs_articles WHERE id_auteur NOT IN ($auteurs)"; $query = "DELETE spip_auteurs_messages
spip_query($query); FROM spip_auteurs_messages AS auteurs_messages
$query = "DELETE FROM spip_auteurs_messages WHERE id_auteur NOT IN ($auteurs)"; LEFT JOIN spip_auteurs AS auteurs
spip_query($query); ON auteurs_messages.id_auteur=auteurs.id_auteur
$query = "DELETE FROM spip_auteurs_rubriques WHERE id_auteur NOT IN ($auteurs)"; WHERE auteurs.id_auteur IS NULL";
spip_query($query); spip_query($query);
}
$query = "SELECT id_auteur,nom,email FROM spip_auteurs WHERE statut='5poubelle' AND maj < $mydate"; # les liens d'articles sur des auteurs effaces
$result = spip_query($query); $query = "DELETE spip_auteurs_rubriques
while ($row = spip_fetch_array($result)) { FROM spip_auteurs_rubriques AS auteurs_rubriques
$id_auteur = $row['id_auteur']; LEFT JOIN spip_rubriques AS rubriques
$nom = $row['nom']; ON auteurs_rubriques.id_rubrique=rubriques.id_rubrique
$email = $row['email']; WHERE rubriques.id_rubrique IS NULL";
spip_query($query);
$query2 = "SELECT * FROM spip_auteurs_articles WHERE id_auteur=$id_auteur";
$result2 = spip_query($query2); # effacer les auteurs poubelle qui ne sont lies a aucun article
if (!spip_num_rows($result2)) { $query = "DELETE spip_auteurs
$query3 = "DELETE FROM spip_auteurs WHERE id_auteur=$id_auteur"; FROM spip_auteurs AS auteurs
$result3 = spip_query($query3); LEFT JOIN spip_auteurs_articles AS auteurs_articles
spip_log ("suppression auteur $id_auteur ($nom, $email)"); ON auteurs_articles.id_auteur=auteurs.id_auteur
} WHERE auteurs_articles.id_auteur IS NULL
} AND auteurs.statut='5poubelle' AND auteurs.maj < $mydate";
spip_query($query);
// //
// Messages prives // Messages prives
// //
$query = "SELECT m.id_message FROM spip_messages AS m, spip_auteurs_messages AS lien ". # supprimer les messages lies a un auteur disparu
"WHERE m.id_message = lien.id_message GROUP BY m.id_message"; $query = "DELETE spip_messages
$result = spip_query($query); FROM spip_messages AS messages
while ($row = spip_fetch_array($result)) $messages[] = $row['id_message']; LEFT JOIN spip_auteurs AS auteurs
ON auteurs.id_auteur=messages.id_auteur
$query = "SELECT id_message FROM spip_messages ". WHERE auteurs.id_auteur IS NULL";
"WHERE type ='affich'"; spip_query($query);
$result = spip_query($query);
while ($row = spip_fetch_array($result)) $messages[] = $row['id_message'];
if ($messages) {
$messages = join(",", $messages);
$query = "DELETE FROM spip_messages WHERE id_message NOT IN ($messages)";
spip_query($query);
$query = "DELETE FROM spip_forum WHERE id_message NOT IN (0,$messages)";
spip_query($query);
}
// //
...@@ -176,23 +230,41 @@ function optimiser_base() { ...@@ -176,23 +230,41 @@ function optimiser_base() {
$query = "DELETE FROM spip_mots WHERE titre='' AND maj < $mydate"; $query = "DELETE FROM spip_mots WHERE titre='' AND maj < $mydate";
$result = spip_query($query); $result = spip_query($query);
$mots = '0'; # les liens mots-articles sur des mots effaces
$query = "SELECT id_mot FROM spip_mots"; $query = "DELETE spip_mots_articles FROM spip_mots_articles AS mots_articles
$result = spip_query($query); LEFT JOIN spip_mots AS mots
while ($row = spip_fetch_array($result)) $mots .= ','.$row['id_mot']; ON mots_articles.id_mot=mots.id_mot
WHERE mots.id_mot IS NULL";
spip_query($query);
if ($mots) { # les liens mots-breves sur des mots effaces
$query = "DELETE FROM spip_mots_articles WHERE id_mot NOT IN ($mots)"; $query = "DELETE spip_mots_breves FROM spip_mots_breves AS mots_breves
spip_query($query); LEFT JOIN spip_mots AS mots
$query = "DELETE FROM spip_mots_breves WHERE id_mot NOT IN ($mots)"; ON mots_breves.id_mot=mots.id_mot
spip_query($query); WHERE mots.id_mot IS NULL";
$query = "DELETE FROM spip_mots_forum WHERE id_mot NOT IN ($mots)"; spip_query($query);
spip_query($query);
$query = "DELETE FROM spip_mots_rubriques WHERE id_mot NOT IN ($mots)"; # les liens mots-forum sur des mots effaces
spip_query($query); $query = "DELETE spip_mots_forum FROM spip_mots_forum AS mots_forum
$query = "DELETE FROM spip_mots_syndic WHERE id_mot NOT IN ($mots)"; LEFT JOIN spip_mots AS mots
spip_query($query); ON mots_forum.id_mot=mots.id_mot
} WHERE mots.id_mot IS NULL";
spip_query($query);
# les liens mots-rubriques sur des mots effaces
$query = "DELETE spip_mots_rubriques
FROM spip_mots_rubriques AS mots_rubriques
LEFT JOIN spip_mots AS mots
ON mots_rubriques.id_mot=mots.id_mot
WHERE mots.id_mot IS NULL";
spip_query($query);
# les liens mots-syndic sur des mots effaces
$query = "DELETE spip_mots_syndic FROM spip_mots_syndic AS mots_syndic
LEFT JOIN spip_mots AS mots
ON mots_syndic.id_mot=mots.id_mot
WHERE mots.id_mot IS NULL";
spip_query($query);
// //
...@@ -202,17 +274,40 @@ function optimiser_base() { ...@@ -202,17 +274,40 @@ function optimiser_base() {
$query = "DELETE FROM spip_forum WHERE statut='redac' AND maj < $mydate"; $query = "DELETE FROM spip_forum WHERE statut='redac' AND maj < $mydate";
spip_query($query); spip_query($query);
$forums = '0'; ######### Ce code reste a verifier ; mais il semble marcher
$query = "SELECT id_forum FROM spip_forum"; /*
$result = spip_query($query); # les reponses a des forums effaces
while ($row = spip_fetch_array($result)) $forums .= ','.$row[0]; $query = "DELETE spip_forum FROM spip_forum AS sf1
LEFT JOIN spip_forum AS sf2
ON sf1.id_parent=sf2.id_forum
WHERE sf2.id_forum IS NULL
AND sf1.id_parent>0";
spip_query($query);
*/
#########
# ALTERNATIVEMENT (semblerait logique, mais horriblement lent....)
/*
$query = "CREATE TEMPORARY TABLE temp SELECT id_forum FROM spip_forum";
spip_query($query);
$query = "DELETE spip_forum FROM spip_forum AS sf1
LEFT JOIN temp
ON sf1.id_parent = temp.id_forum
WHERE temp.id_forum IS NULL
AND sf1.id_parent > 0";
spip_query($query);
# spip_query("DROP TABLE temp");
*/
# les liens mots-forum sur des forums effaces
$query = "DELETE spip_mots_forum FROM spip_mots_forum AS mots_forum
LEFT JOIN spip_forum AS forum
ON mots_forum.id_forum=forum.id_forum
WHERE forum.id_forum IS NULL";
spip_query($query);
if ($forums) {
$query = "DELETE FROM spip_forum WHERE id_parent NOT IN (0,$forums)";
spip_query($query);
$query = "DELETE FROM spip_mots_forum WHERE id_forum NOT IN ($forums)";
spip_query($query);
}
// //
...@@ -220,26 +315,27 @@ function optimiser_base() { ...@@ -220,26 +315,27 @@ function optimiser_base() {
// //
// les objets inutiles // les objets inutiles
include_spip('inc/indexation');
$liste_tables = liste_index_tables(); $liste_tables = liste_index_tables();
//$types = array('article','auteur','breve','mot','rubrique','forum','signature','syndic'); foreach ($liste_tables as $id_table => $table_objet) {
while (list($id_table,$table_objet) = each($liste_tables)) {
$table_index = 'spip_index';
$col_id = primary_index_table($table_objet); $col_id = primary_index_table($table_objet);
$critere = critere_optimisation($table_objet); $critere = critere_optimisation($table_objet);
if (strlen($critere)>0) if (strlen($critere)>0)
$critere = "AND $critere"; $critere = "AND $critere";
spip_query("UPDATE $table_objet SET idx='' WHERE idx<>'non' $critere"); spip_query("UPDATE $table_objet SET idx='' WHERE idx<>'non' $critere");
$suppr = ''; $suppr = '';
$s = spip_query("SELECT $col_id FROM $table_objet WHERE idx='' $critere"); $s = spip_query("SELECT $col_id FROM $table_objet
WHERE idx='' $critere");
while ($t = spip_fetch_array($s)) while ($t = spip_fetch_array($s))
$suppr .= ','.$t[0]; $suppr .= ','.$t[0];
$s = spip_query("SELECT $col_id FROM $table_objet WHERE idx='non'"); $s = spip_query("SELECT $col_id FROM $table_objet WHERE idx='non'");
while ($t = spip_fetch_array($s)) while ($t = spip_fetch_array($s))
$suppr .= ','.$t[0]; $suppr .= ','.$t[0];
if ($suppr) if ($suppr)
spip_query("DELETE FROM $table_index WHERE id_objet IN (0$suppr) AND id_table=$id_table"); spip_query("DELETE FROM spip_index
WHERE id_objet IN (0$suppr) AND id_table=$id_table");
} }
// //
...@@ -258,12 +354,7 @@ function optimiser_base() { ...@@ -258,12 +354,7 @@ function optimiser_base() {
spip_query($query); spip_query($query);
} }
spip_log("optimisation ok"); spip_log("optimisation terminee");
} }
## debug
if ($GLOBALS['auteur_session']['statut'] == '0minirezo'
AND $_GET['optimiser'] == 'oui')
optimiser_base();
?> ?>
...@@ -2485,7 +2485,7 @@ function barre_textarea($texte, $rows, $cols) { ...@@ -2485,7 +2485,7 @@ function barre_textarea($texte, $rows, $cols) {
static $num_textarea = 0; static $num_textarea = 0;
include_spip('inc/layer'); include_spip('inc/layer');
$texte = safehtml(entites_html($texte)); $texte = entites_html($texte);
if (!$GLOBALS['browser_barre']) if (!$GLOBALS['browser_barre'])
return "<textarea name='texte' rows='$rows' class='forml' cols='$cols'>$texte</textarea>"; return "<textarea name='texte' rows='$rows' class='forml' cols='$cols'>$texte</textarea>";
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter