| |
|
| :: |
| Auteur |
Message |
FrenchKiss PR1

Inscrit le: 22 Déc 2006 Messages: 101
|
Posté 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

Inscrit le: 28 Avr 2006 Messages: 15131
|
Posté 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 |
|
 |
FrenchKiss PR1

Inscrit le: 22 Déc 2006 Messages: 101
|
Posté 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

Inscrit le: 28 Avr 2006 Messages: 15131
|
Posté 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
++ |
_________________ 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 |
|
 |
FrenchKiss PR1

Inscrit le: 22 Déc 2006 Messages: 101
|
Posté 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


Inscrit le: 07 Mai 2006 Messages: 1008
|
Posté 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 |
|
 |
FrenchKiss PR1

Inscrit le: 22 Déc 2006 Messages: 101
|
Posté 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  |
|
|
| Revenir en haut de page |
|
 |
gowap phpBB SEO Team


Inscrit le: 07 Mai 2006 Messages: 1008
|
Posté 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 |
|
 |
FrenchKiss PR1

Inscrit le: 22 Déc 2006 Messages: 101
|
Posté 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 |
|
 |
|
|
| Navigation |
Autres sujets de discussion |
|
|
|
|
|
|
|