Index
Forums
Annuaire
Référencement
Télécharger
  phpBB SEO : Référencement Google, MSN, Yahoo, Annuaires, Forums  
phpBB SEO
Boards
Directory  
SEO  
Downloads
 
  Rechercher Search
    S'enregistrer
Pseudo :  Passe :  Auto  
Register  
 
   
Archivage de masse

 
Poster un nouveau sujet   Répondre au sujet    phpBB SEO » Forum Référencement  » Le Forum phpBB
::  
Auteur Message
FrenchKiss
PR1
PR1


Inscrit le: 22 Déc 2006
Messages: 101

Archivage de massePosté le: Mar Mai 01, 2007 11:47 am    Sujet du message: Archivage de masse

Hello

Je souhaite prendre tous les topics sur un forum précis, compris entre telle date et telle date, et les déplacer vers un autre forum (un forum d'archives).

est-ce que le script
Code:
$query_update = "UPDATE `phpbb_topics` SET forum_id = '59'
WHERE topic_time >1104480000 AND forum_id =110 AND topic_time <1136016000";
$resultat2 = mysql_query($query_update, $cnx) or die(mysql_error());


vous parait correct ?

Suffit-il de changer le forum_id des topics à déplacer ?
Revenir en haut de page
dcz
Administrateur - Site Admin
Administrateur - Site Admin


Inscrit le: 28 Avr 2006
Messages: 15131

Archivage de massePosté le: Mar Mai 01, 2007 12:03 pm    Sujet du message: Re: Archivage de masse

Autant commencer par sélectionner le forum je dirais :
Code:

$query_update = "UPDATE `phpbb_topics` SET forum_id = '59'
WHERE forum_id =110  AND topic_time >1104480000 AND topic_time <1136016000";
$resultat2 = mysql_query($query_update, $cnx) or die(mysql_error());


Il faudra ensuite certainement envoyer un tit coup de sync('forum', 59) et sync('forum', 110) pour resynchroniser le tout (cela concerne les comptes, nopmbre de topic etc ...).
La fonction sync se trouve dans includes/functions_admin.php, elle est utiliser dans l'acp et aussi dans viewtopic.php, exemple dans viewtopic.php :

Code:
if ($resync)
{
   include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
   sync('topic', $topic_id);

   $result = $db->sql_query('SELECT COUNT(post_id) AS total FROM ' . POSTS_TABLE . ' WHERE topic_id = ' . $topic_id);
   $row = $db->sql_fetchrow($result);
   $total_replies = $row['total'];
}



Je te conseil de tester en local avant tout de même.

++

_________________
Useful links :
SEO Forum || SEO Directory || SEO phpBB || SEO phpBB3 || Search
____________________

Liens Utiles :
Forum référencement || Annuaire référencement || Référencement phpBB || Référencement phpBB3 || Recherche
Revenir en haut de page
Visiter le site web de l'utilisateur
FrenchKiss
PR1
PR1


Inscrit le: 22 Déc 2006
Messages: 101

Archivage de massePosté le: Mar Mai 01, 2007 1:04 pm    Sujet du message: Re: Archivage de masse

Citation:
Autant commencer par sélectionner le forum je dirais :
Code:
$query_update = "UPDATE `phpbb_topics` SET forum_id = '59'
WHERE forum_id =110  AND topic_time >1104480000 AND topic_time <1136016000";
$resultat2 = mysql_query($query_update, $cnx) or die(mysql_error());
Ca change quelque chose ? Justement je me posais la question. Est-ce que ça apporte un gain de temps, ou une surcharge moindre au serveur ... ou est-ce que c'est une considération surtout esthétique / logique ?


Bon, ceci dit, j'ai testé, et ça ne fonctionne pas.
J'ai jeté un coup d'oeil à modcp.php, et il semblerait qu'il faille AUSSI mettre à jour la table des posts (j'y avais pas pensé).

Dans modcp, ça donne ça :
Code:
$sql = "SELECT *
               FROM " . TOPICS_TABLE . "
               WHERE topic_id IN ($topic_list)
                  AND forum_id = $old_forum_id
                  AND topic_status <> " . TOPIC_MOVED;
            if ( !($result = $db->sql_query($sql, BEGIN_TRANSACTION)) )
            {
               message_die(GENERAL_ERROR, 'Could not select from topic table', '', __LINE__, __FILE__, $sql);
            }

            $row = $db->sql_fetchrowset($result);
            $db->sql_freeresult($result);

            for($i = 0; $i < count($row); $i++)
            {
               $topic_id = $row[$i]['topic_id'];
               
               if ( isset($HTTP_POST_VARS['move_leave_shadow']) )
               {
                  // Insert topic in the old forum that indicates that the forum has moved.
                  $sql = "INSERT INTO " . TOPICS_TABLE . " (forum_id, topic_title, topic_poster, topic_time, topic_status, topic_type, topic_vote, topic_views, topic_replies, topic_first_post_id, topic_last_post_id, topic_moved_id)
                     VALUES ($old_forum_id, '" . addslashes(str_replace("\'", "''", $row[$i]['topic_title'])) . "', '" . str_replace("\'", "''", $row[$i]['topic_poster']) . "', " . $row[$i]['topic_time'] . ", " . TOPIC_MOVED . ", " . POST_NORMAL . ", " . $row[$i]['topic_vote'] . ", " . $row[$i]['topic_views'] . ", " . $row[$i]['topic_replies'] . ", " . $row[$i]['topic_first_post_id'] . ", " . $row[$i]['topic_last_post_id'] . ", $topic_id)";
                  if ( !$db->sql_query($sql) )
                  {
                     message_die(GENERAL_ERROR, 'Could not insert shadow topic', '', __LINE__, __FILE__, $sql);
                  }
               }

               $sql = "UPDATE " . TOPICS_TABLE . "
                  SET forum_id = $new_forum_id 
                  WHERE topic_id = $topic_id";
               if ( !$db->sql_query($sql) )
               {
                  message_die(GENERAL_ERROR, 'Could not update old topic', '', __LINE__, __FILE__, $sql);
               }

               $sql = "UPDATE " . POSTS_TABLE . "
                  SET forum_id = $new_forum_id
                  WHERE topic_id = $topic_id";
               if ( !$db->sql_query($sql) )
               {
                  message_die(GENERAL_ERROR, 'Could not update post topic ids', '', __LINE__, __FILE__, $sql);
               }
            }

            // Sync the forum indexes
            sync('forum', $new_forum_id);
            sync('forum', $old_forum_id);

            $message = $lang['Topics_Moved'] . '<br /><br />';



Un peu relou à adapter, mais je pense que tout y est.


Je posterai mon code, ça peut servir à ceux qui voudront faire comme moi un jour ou l'autre.
Revenir en haut de page
dcz
Administrateur - Site Admin
Administrateur - Site Admin


Inscrit le: 28 Avr 2006
Messages: 15131

Archivage de massePosté le: Mar Mai 01, 2007 1:10 pm    Sujet du message: Re: Archivage de masse

Pour l'ordre, c'est juste que tu va restreindre le premier champ sélectionné aux topic du forum en question, et pas à tous les topics remplissant la condition temporelle dans tous les forums.

Dans le cas de cette requête, vu qu'elle est pas censé être lancée toutes les 5 minutes, ça change pas grand chose, mais comme bonne pratique ...

Et si non, oui, tu as raison, s'inspirer directement de modcp, c'est le plus sûr, et aussi, c'est clair que c'est le genre de mod qui pourrait en intéresser plus d'un, faudrait même le publier quand tu l'aura finit Wink

++

_________________
Useful links :
SEO Forum || SEO Directory || SEO phpBB || SEO phpBB3 || Search
____________________

Liens Utiles :
Forum référencement || Annuaire référencement || Référencement phpBB || Référencement phpBB3 || Recherche
Revenir en haut de page
Visiter le site web de l'utilisateur
FrenchKiss
PR1
PR1


Inscrit le: 22 Déc 2006
Messages: 101

Archivage de massePosté le: Mar Mai 01, 2007 4:26 pm    Sujet du message: Re: Archivage de masse

Et voilà !

Sachant que d'autres passeraient derrière moi, j'ai passé un peu de temps pour expliquer les trucs.

Bon c'est pas un mod, y'a encore énormément de trucs à améliorer, mais au moins, ça fonctionne impeccable.

Code:
<?php

// ------------------------------------------------------------
//      MASS TOPICS MOVE                   v1.0 (01/05/07)
//      DEPLACEMENT DE TOPICS DE MASSE
// ------------------------------------------------------------


// Réalisée par Baptiste Legrand (FrenchKiss) pour l'administration de http://www.frenchtouchseduction.com
// Mis à la disposition de la communauté phpBB sur phpBB-seo.com (http://www.phpbb-seo.com)
// Topic officiel : (à définir)


// A QUOI CA SERT ---------------------------------------------
// Permet de déplacer tous les topics compris entre la date "$date_DE" et la date "$date_JUSQUA"
// du forum "$old_forum_id" vers le forum "$new_forum_id"
// => particulièrement utile pour l'archivage automatique des vieux posts sur un forum prévu à cet effet.


// MISE EN OEUVRE ---------------------------------------------
// 1. Effectuez une sauvegarde de votre base de données, ou au moins des tables phpbb_topics et phpbb_posts
// 2. Configurer le script
//      - chemin vers votre forum, ligne 32
//      - ID des forums sur lesquels intervenir
//      - dates de début et de fin des topics à traiter
//
// 3. Charger le script
// 4. Effacer le script du serveur distant après usage


// QUELQUES PISTES A EXPLORER  --------------------------------
// - un formulaire permettant de configurer le script
   // - saisie des dates
   // - checkboxes pour forums sources multiples
   // - liste déroulante pour le forum destination
// - surement quelques améliorations possibles au niveau des requêtes SQL
// - page intermédiaire de confirmation, affichant la liste des topics à déplacer et demandant confirmation avant traitement


define('IN_PHPBB', true);
$phpbb_root_path = 'phpBB2/';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
include($phpbb_root_path . 'includes/functions_admin.'.$phpEx);

   // Start session management
      $userdata = session_pagestart($user_ip, SITE);
      init_userprefs($userdata);
   // End session management

if ( $userdata['user_level']!= ADMIN )
{ header("Location:".$phpbb_root_path); }
    
else {

   // CONFIGURATION DU SCRIPT ----------------------
   
      // indiquer ici les id des forums sur lesquels intervenir
      
         $old_forum_id = "xx";    // indiquer l'ID du forum source
         $new_forum_id = "yy";   // indiquer l'ID du forum de destination
   
      
      // indiquer ici les dates constituant l'intervalle des topics à déplacer
      // mktime (entier heure, entier minute, entier seconde, entier mois, entier jour, entier annee)
         
         $date_DE = mktime(0,0,0,mm,dd,aa);      // date de départ de l'intervalle
         $date_JUSQUA = mktime(0,0,0,mm,dd,aa);   // date de fin de l'intervalle                              
   
   // -----------------------------------------------




   // LE SCRIPT
   
   $sql = "SELECT forum_name FROM " . FORUMS_TABLE . "
         WHERE forum_id = '$old_forum_id'";
   
   if ( !$result = $db->sql_query($sql) )
   { message_die(GENERAL_ERROR, 'Récupération infos du forum source impossible', '', __LINE__, __FILE__, $sql); }
   
   $data = mysql_fetch_assoc($result);
   $forum_source = $data['forum_name'];
   
   $sql = "SELECT forum_name FROM " . FORUMS_TABLE . "
         WHERE forum_id = '$new_forum_id'";
   
   if ( !$result = $db->sql_query($sql) )
   { message_die(GENERAL_ERROR, 'Récupération infos du forum destination impossible', '', __LINE__, __FILE__, $sql); }
   
   $data = mysql_fetch_assoc($result);
   $forum_destination = $data['forum_name'];




   $sql = "SELECT topic_id, topic_title, topic_time FROM " . TOPICS_TABLE . "
         WHERE forum_id = '$old_forum_id' AND topic_time > '$date_DE' AND topic_time < '$date_JUSQUA' ORDER BY topic_id ASC";
   
   if ( !$result = $db->sql_query($sql) )
   { message_die(GENERAL_ERROR, 'Récupération des topic_id impossible', '', __LINE__, __FILE__, $sql); }
   
   
      $data = mysql_fetch_assoc($result);
      $nb_topics = mysql_num_rows($result);
      
      
      // DECOMMENTER POUR TESTER ET VOIR LA LISTE DES TOPICS A DEPLACER
      /*
      echo "<h1>Topics à déplacer :</h1>";
      echo "<p>La recherche a été effectuée; les ".$nb_topics." topics suivants seront déplacés :";
      echo "<ul>";
      do {
         $date_topic = date('d.m.Y', $data['topic_time']);
         
         echo "<li><a href=\"".$phpbb_root_path."viewtopic.php?t=".$data['topic_id']."\">".$data['topic_title']."</a>";
         echo " <em>(".$date_topic.")</em></li>";
      } while ($data = mysql_fetch_assoc($result));
      echo "</ul>";
      
      exit();
      */
      // -----------------------------------------------------------------------------


   if ( $nb_topics > 0 )
   {
      do {
         
         $topic_id = $data['topic_id'];
      
         $sql = "UPDATE " . TOPICS_TABLE . " SET forum_id = $new_forum_id WHERE topic_id = $topic_id";
         if ( !$db->sql_query($sql) )
         { message_die(GENERAL_ERROR, 'Impossible de modifier le forum_id des topics', '', __LINE__, __FILE__, $sql); }
         
      
         $sql = "UPDATE " . POSTS_TABLE . " SET forum_id = $new_forum_id WHERE topic_id = $topic_id";
         if ( !$db->sql_query($sql) )
         { message_die(GENERAL_ERROR, 'Impossible de modifier le forum_id des posts', '', __LINE__, __FILE__, $sql); }
                  
      } while ($data = mysql_fetch_assoc($result));
      
      mysql_data_seek($result,0);
             
      // Sync the forum indexes
         sync('forum', $new_forum_id);
         sync('forum', $old_forum_id);
      
      
      
         echo "<h1>Opération effectuée.</h1>";
         echo "<p>Les ".$nb_topics." topics suivants  ont été déplacés du forum <a href=\"".$phpbb_root_path."viewforum.php?f=".$old_forum_id."\">".$forum_source."</a> vers le forum <a href=\"".$phpbb_root_path."viewforum.php?f=".$new_forum_id."\">".$forum_destination."</a> :";
         echo "<ul>";
         do {
         echo "<li><a href=\"".$phpbb_root_path."viewtopic.php?t=".$data['topic_id']."\">".$data['topic_title']."</a></li>";
         } while ($data = mysql_fetch_assoc($result));
         echo "</ul>";
   
   } else { echo "Aucun topic n'a été trouvé, correspondant à vos critères de recherche."; }
}
?>


Comme indiqué dans les commentaires, y'a des trucs à implémenter, comme un formulaire de paramètrage, et une page de prévisualisation. Je le ferai un peu plus tard, là je suis pressé.

hésitez pas à me faire part de vos suggestions, surtout au niveau du code : je suis pas un pro, loin de là, donc j'ai peut être fait des trucs unsafe ou redondants.

a +
FK.
Revenir en haut de page
gowap
phpBB SEO Team
phpBB SEO Team


Inscrit le: 07 Mai 2006
Messages: 1008

Archivage de massePosté le: Mar Mai 01, 2007 9:55 pm    Sujet du message: Re: Archivage de masse

2 remarques :
-pour tester si les id forum source et dest sont OK, je ne ferais qu'une seule requete (au lieu de 2). Tu demandes a avoir les enregistrements forum_id=l'ancien OU le nouveau. Si tu obtiens 2 resultats, c'est parfait, les infos sont OK. Au contraire : 0 resultats --> l'utilisateur est completement débile. Si 1 seul resultat, tu regardes le nombre que tu obtiens et tu le compares a forum_ancien. Si c'est le meme id, c'est qu'il manque forum_nouveau, sinon c'est une erreur sur forum_ancien.

Bon c'est un détail, ce qui me chagrine plus , c'est la suite du script.
- Si tu déplaces 10000 topics, tu va faires une boucle de 10000 requetes sql, alors qu'en 2 requetes (1 pour la table topic, 1 pour la table posts c'est torché). Pas la peine de faire x requetes avec topic_id= ou post_id=, il te suffit de reprendre les criteres de forum_ancien et de temps que tu as défini juste avant.

_________________
Gravure-News : la communauté francophone de la gravure de CD/DVD et son forum d'entraide.
Revenir en haut de page
Visiter le site web de l'utilisateur
FrenchKiss
PR1
PR1


Inscrit le: 22 Déc 2006
Messages: 101

Archivage de massePosté le: Mer Mai 02, 2007 12:52 pm    Sujet du message: Re: Archivage de masse

Hello, merci pour le feedback.
Citation:
-pour tester si les id forum source et dest sont OK, je ne ferais qu'une seule requete (au lieu de 2). Tu demandes a avoir les enregistrements forum_id=l'ancien OU le nouveau. Si tu obtiens 2 resultats, c'est parfait, les infos sont OK. Au contraire : 0 resultats --> l'utilisateur est completement débile. Si 1 seul resultat, tu regardes le nombre que tu obtiens et tu le compares a forum_ancien. Si c'est le meme id, c'est qu'il manque forum_nouveau, sinon c'est une erreur sur forum_ancien.


Je pense que tu parles de
Code:
$sql = "SELECT forum_name FROM " . FORUMS_TABLE . "
         WHERE forum_id = '$old_forum_id'";
   
   if ( !$result = $db->sql_query($sql) )
   { message_die(GENERAL_ERROR, 'Récupération infos du forum source impossible', '', __LINE__, __FILE__, $sql); }
   
   $data = mysql_fetch_assoc($result);
   $forum_source = $data['forum_name'];
   
   $sql = "SELECT forum_name FROM " . FORUMS_TABLE . "
         WHERE forum_id = '$new_forum_id'";
   
   if ( !$result = $db->sql_query($sql) )
   { message_die(GENERAL_ERROR, 'Récupération infos du forum destination impossible', '', __LINE__, __FILE__, $sql); }
   
   $data = mysql_fetch_assoc($result);
   $forum_destination = $data['forum_name'];
En fait, ce bout de code n'est pas tant pour vérifier les ID que pour récupérer les noms des forums.
Ca me fait chier de devoir faire deux requêtes, mais je ne vois pas comment faire autrement :/

Citation:
Bon c'est un détail, ce qui me chagrine plus , c'est la suite du script.
- Si tu déplaces 10000 topics, tu va faires une boucle de 10000 requetes sql, alors qu'en 2 requetes (1 pour la table topic, 1 pour la table posts c'est torché). Pas la peine de faire x requetes avec topic_id= ou post_id=, il te suffit de reprendre les criteres de forum_ancien et de temps que tu as défini juste avant.
Sur la forme, c'est parfaitement justifié.
Mais par contre, si je fais ce que tu me suggères, je ne sais pas comment identifier les POSTS de la table phpbb_posts à traiter.

Alors qu'en faisant dans une boucle, il me suffit de les identifier par leur topic_id.

Si tu as une idée à ce sujet, je suis preneur : il y'a sans doute effectivement moins lourd que les 1000 boucles de 2 requêtes Smile
Revenir en haut de page
gowap
phpBB SEO Team
phpBB SEO Team


Inscrit le: 07 Mai 2006
Messages: 1008

Archivage de massePosté le: Mer Mai 02, 2007 11:11 pm    Sujet du message: Re: Archivage de masse

FrenchKiss a écrit:
En fait, ce bout de code n'est pas tant pour vérifier les ID que pour récupérer les noms des forums.
Ca me fait chier de devoir faire deux requêtes, mais je ne vois pas comment faire autrement :/

Un simple :
Code:
SELECT forum_id, forum_name FROM `phpbb_forums` where forum_id IN (14,19)

fait l'affaire pour recuperer par ex forum 14 et 19 et tu as tes 2 noms.

Citation:
si je fais ce que tu me suggères, je ne sais pas comment identifier les POSTS de la table phpbb_posts à traiter

dans phpbb_posts, tu as ce qu'il te faut :
- un forum_id (que tu veux modifier)
- un post_time avec le timestamp qui doit se trouver dans l'intervalle que tu as défini. Suffit donc de reprendre les critères.

_________________
Gravure-News : la communauté francophone de la gravure de CD/DVD et son forum d'entraide.
Revenir en haut de page
Visiter le site web de l'utilisateur
FrenchKiss
PR1
PR1


Inscrit le: 22 Déc 2006
Messages: 101

Archivage de massePosté le: Dim Mai 27, 2007 2:30 pm    Sujet du message: Re: Archivage de masse

Aaaah, j'en ai enfin terminé avec mes exams, je vais pouvoir prendre en compte les suggestions de Gowap pour améliorer l'outil.

Je vous tiens informé des nouvelles "versions" du truc.

Merci pour les conseils et avis.

++
Revenir en haut de page
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    phpBB SEO » Forum Référencement  » Le Forum phpBB
Page 1 sur 1

Navigation Autres sujets de discussion

Sauter vers: