Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

объединение двух форумов в один

Проблемы с установкой или работой phpBB 2.0.x? Ищите ответы здесь!
Virtul
phpBB 1.0.0
Сообщения: 4
Стаж: 19 лет 5 месяцев

объединение двух форумов в один

Сообщение Virtul »

есть форум на 2.0.8 и на 2.0.11
хотца перенести всю информацию (пользователей, сообщения и т.п.) с них в новый на базе 2.0.11, подскажите плз, как это можно сделать?
пробовал вручню через phpmyadmin таблицы переносить - ругаеца, не принимает файл, может не туды жму? =)
(только пожалуйста поподробнее, а то че-то я совсем уже запутался)
Аватара пользователя
Егор Наклоняев
phpBB 2.0.4
Сообщения: 404
Стаж: 19 лет 6 месяцев
Откуда: оттуда

Сообщение Егор Наклоняев »

есть форум на 2.0.8 и на 2.0.11
хотца перенести всю информацию (пользователей, сообщения и т.п.) с них в новый на базе 2.0.11, подскажите плз, как это можно сделать?
Насколько я понял задачу - Вам надо слить две базы в одну?
"Ну Вы, барин, задачи ставите".(с)
В принципе, я решал у себя аналогичную проблему перенося в действующий форум архивы в другом формате, поэтому рассказываю.
Скорее всего задачу надо решать вручную и понимая, что делаешь. Необходимо:
- хорошее знание SQL
- понимать, что и как хранится в таблицах в БД
- хорошо представлять связь между таблицами

Полное пошаговое объяснение алгоритма займет достаточно долго, поэтому объясню кратко.

ИМХО, я бы делал так.
1) Занимался бы этим на локальном компе с копиями
2) Таблицы старого форума 2.0.11 перенес в новый 2.0.11.
Эта стадия достаточно простая.
3) Перенос пользователей. Тут посложнее
а) Находим максимум ID пользователя в первой таблице, допустим 500, во второй таблице ко всем ID добавляем 1000, чтобы они были уникальны
б) Во второй таблице находим все имена пользователей (SQL запрос), которые есть в первой таблице и к их имени прибавляем суффиксом, например, _1
в) сливаем таблицы
4) По аналогии поступаем с группами. Только надо учесть, что там есть ещё ID пользователя, которое мы уже увеличили
5) И так далее, и тому подобное. Работы много, весьма кропотливой, даже с учетом того, что всё делается SQL запросами. Примерно часа на полтора работы. Таблицы ключевых слов не трогаем, к ним вернёмся позже.
6) Разобраться вручную с повторяющимися пользователями. Если они есть, то убрать дубликаты.
7) Поставить и запустить мод, синхронизирующий количество сообщений пользователей. Запустить.
8) Поставить мод, обновляющий поисковые таблицы. Запустить. Переиндексировать базу поиска.
Sapienty Sat.

Добавлено спустя 8 минут 44 секунды:

Т.е.
1) phpbb_users (user_id+1000)
2) phpbb_groups (group_id+1000)
3) phpbb_user_group (user_id+1000, group_id+1000)
4) phpbb_categories
5) phpbb_forums
...
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 20 лет 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

А что конкретно требуется перенести? Единственное, с чем мне пока не удалось разобраться - так это с переносом групп, а все остальное точно подскажу.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
Vladson
Former team member
Сообщения: 816
Стаж: 20 лет
Откуда: Estonia, Tallinn

Сообщение Vladson »

А что конкретно требуется перенести?
А не на чисто установленный ли автору надо перенести ? :D
(всяко бывает, может просто правила не читал...)
Серый цвет - светлый (светлее чёрного), но он и тёмный (темнее белого), он же промежуточный (между чёрным и белым). Теорию относительности никто не отменял. Истина в целом - понятие виртуально-ситуативное.
Virtul
phpBB 1.0.0
Сообщения: 4
Стаж: 19 лет 5 месяцев

Сообщение Virtul »

2Егор огромное спасибо, буду разбираться помаленьку, если какие вопросы возникнут я их тут накарякаю =)
2Xpert вобщем-то только пользователей, их сообщения и структуру, но только аккуратно, чтоб без ошибок и т.п.
Kastaneda
Former team member
Сообщения: 702
Стаж: 19 лет 6 месяцев

Сообщение Kastaneda »

Virtul, ты хочешь просто обновить версию форума, или же, как гласит название темы, использовать одну базу для двух форумов. Определись.
Jovani
phpBB 2.0.5
Сообщения: 477
Стаж: 20 лет

Сообщение Jovani »

Перенос пользователей. Тут посложнее
Есть у меня гдето скрипт для этого, если нужно пиши, поищу.
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 20 лет 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

Хорошо. Методика слива основана на следующем - к id сообщений, юзеров, тем и т.д форума, который предполагается долить прибавляется число, представляющее собой макс. id сообщений, юзеров, тем и т.д форума, к которому предполагается произвести доливку. Далее производим модификацию таблиц второго форума (при помощи скрипта). Затем определенные таблицы второго форума экспортируются из БД и вставляются в БД первого форума.

Итак. Скрипт, выдергивающий необходимые максимальные id:

Код: Выделить всё

<?php

// let's use our own settings - they will be not standart 

$dbms = 'mysql';
$dbhost = 'localhost';
$dbname = '3dfx';
$dbuser = 'root';
$dbpasswd = '';

$table_prefix = 'phpbb_';

// SQL codes - from constants.php
define('BEGIN_TRANSACTION', 1);
define('END_TRANSACTION', 2);

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

// converting data collection

$sql = "SELECT MAX(ban_id) AS max_ban_id FROM `" . $table_prefix . "banlist`";
if (!$result = $db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}
$row = $db->sql_fetchrow($result);
$max_ban_id = intval($row['max_ban_id']);

$sql = "SELECT MAX(cat_id) AS max_cat_id FROM `" . $table_prefix . "categories`";
if (!$result = $db->sql_query($sql))
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}
$row = $db->sql_fetchrow($result);
$max_cat_id = intval($row['max_cat_id']);

$sql = "SELECT MAX(forum_id) AS max_forum_id FROM `" . $table_prefix . "forums`";
if (!$result = $db->sql_query($sql))
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}
$row = $db->sql_fetchrow($result);
$max_forum_id = intval($row['max_forum_id']);

$sql = "SELECT MAX(group_id) AS max_group_id FROM `" . $table_prefix . "groups`";
if (!$result = $db->sql_query($sql))
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}
$row = $db->sql_fetchrow($result);
$max_group_id = intval($row['max_group_id']);
$max_group_id--; // first group id is anonymous

$sql = "SELECT MAX(post_id) AS max_post_id FROM `" . $table_prefix . "posts`";
if (!$result = $db->sql_query($sql))
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}
$row = $db->sql_fetchrow($result);
$max_post_id = intval($row['max_post_id']);

$sql = "SELECT MAX(topic_id) AS max_topic_id FROM `" . $table_prefix . "topics`";
if (!$result = $db->sql_query($sql))
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}
$row = $db->sql_fetchrow($result);
$max_topic_id = intval($row['max_topic_id']);


$sql = "SELECT MAX(user_id) AS max_user_id FROM `" . $table_prefix . "users`";
if (!$result = $db->sql_query($sql))
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}
$row = $db->sql_fetchrow($result);
$max_user_id = intval($row['max_user_id']);
$max_user_id--; // user ids start from 2, i don't want to lose one id

$sql = "SELECT MAX(disallow_id) AS max_disallow_id FROM `" . $table_prefix . "disallow`";
if (!$result = $db->sql_query($sql))
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}
$row = $db->sql_fetchrow($result);
$max_disallow_id = intval($row['max_disallow_id']);

$sql = "SELECT MAX(privmsgs_id) AS max_privmsgs_id FROM `" . $table_prefix . "privmsgs`";
if (!$result = $db->sql_query($sql))
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}
$row = $db->sql_fetchrow($result);
$max_privmsgs_id = intval($row['max_privmsgs_id']);

$sql = "SELECT MAX(rank_id) AS max_rank_id FROM `" . $table_prefix . "ranks`";
if (!$result = $db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}
$row = $db->sql_fetchrow($result);
$max_rank_id = intval($row['max_rank_id']);

$sql = "SELECT MAX(vote_id) AS max_vote_id FROM `" . $table_prefix . "vote_desc`";
if (!$result = $db->sql_query($sql))
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}
$row = $db->sql_fetchrow($result);
$max_vote_id = intval($row['max_vote_id']);

$sql = "SELECT MAX(word_id) AS max_word_id FROM `" . $table_prefix . "words`";  
if (!$result = $db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}
$row = $db->sql_fetchrow($result);
$max_word_id = intval($row['max_word_id']);

echo("\$max_ban_id = $max_ban_id;<br>");
echo("\$max_cat_id = $max_cat_id;<br>");
echo("\$max_forum_id = $max_forum_id;<br>");
echo("\$max_group_id = $max_group_id;<br>");
echo("\$max_post_id = $max_post_id;<br>");
echo("\$max_topic_id = $max_topic_id;<br>");
echo("\$max_user_id = $max_user_id;<br>");
echo("\$max_disallow_id = $max_disallow_id;<br>");
echo("\$max_privmsgs_id = $max_privmsgs_id;<br>");
echo("\$max_rank_id = $max_rank_id;<br>");
echo("\$max_vote_id = $max_vote_id;<br>");
echo("\$max_word_id = $max_word_id;<br>");

$db->sql_close();
?>
Данные, выданные им, вставляются во второй скрипт, который выглядит следующим образом:

Код: Выделить всё

<?php

// let's use our own settings - they will be not standart 

$dbms = 'mysql';
$dbhost = 'localhost';
$dbname = 'vd';
$dbuser = 'root';
$dbpasswd = '';

$table_prefix = 'phpbb_';

// SQL codes - from constants.php
define('BEGIN_TRANSACTION', 1);
define('END_TRANSACTION', 2);

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

// here we put variables generated by split1
$max_ban_id = 0;
$max_cat_id = 1;
$max_forum_id = 12;
$max_group_id = 1;
$max_post_id = 4371;
$max_topic_id = 669;
$max_user_id = 538;
$max_disallow_id = 0;
$max_privmsgs_id = 0;
$max_rank_id = 1;
$max_vote_id = 0;
$max_word_id = 0;

// some queries that we will do to delete unnecessary data
// that's anonymous info

$sql = "DELETE FROM `phpbb_users` WHERE `user_id` = '-1' LIMIT 1";

if (!$db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}


// категории

$sql = "UPDATE phpbb_categories SET " .
	"cat_id = cat_id + $max_cat_id";

if (!$db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}

// форумы

$sql = "UPDATE phpbb_forums SET " .
	"forum_id = forum_id + $max_forum_id," .
	"cat_id = cat_id + $max_cat_id";

if (!$db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}

// сообщения

$sql = "UPDATE phpbb_posts SET " .
	"post_id = post_id + $max_post_id," .
	"topic_id = topic_id + $max_topic_id," .
	"forum_id = forum_id + $max_forum_id," .
	"poster_id = poster_id + $max_user_id";

if (!$db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}

$sql = "UPDATE phpbb_posts_text SET " .
	"post_id = post_id + $max_post_id";

if (!$db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}

// темы

$sql = "UPDATE phpbb_topics SET " .
	"topic_id = topic_id + $max_topic_id," .
	"forum_id = forum_id + $max_forum_id," .
	"topic_poster = topic_poster + $max_user_id," .
	"topic_first_post_id = topic_first_post_id + $max_post_id," . 
	"topic_last_post_id = topic_last_post_id + $max_post_id";

if (!$db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}

$sql = "UPDATE phpbb_topics SET " .
	"topic_vote = topic_vote + $max_vote_id" .
	" WHERE topic_vote != 0";

if (!$db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}

$sql = "UPDATE phpbb_topics SET " .
	"topic_moved_id = topic_moved_id + $max_topic_id" .
	" WHERE topic_moved_id != 0";

if (!$db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}

// пользователи

$sql = "UPDATE phpbb_users SET " .
	"user_id = user_id + $max_user_id";

if (!$db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}

// опросы

$sql = "UPDATE phpbb_vote_desc SET " .
	"vote_id = vote_id + $max_vote_id," . 
	"topic_id = topic_id + $max_topic_id";

if (!$db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}

$sql = "UPDATE phpbb_vote_results SET " .
	"vote_id = vote_id + $max_vote_id";

if (!$db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}

$sql = "UPDATE phpbb_vote_voters SET " .
	"vote_id = vote_id + $max_vote_id," .
	"vote_user_id = vote_user_id + $max_user_id";

if (!$db->sql_query($sql)) 
{ 
	$res = $db->sql_error(); 
	die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql"); 
}

$db->sql_close();
?>
Первый скрипт запускается над базой первого форума, второй - над базой второго. Оба они кладутся в корневую директорию phpBB. После запуска второго мы делаем backup таких таблиц второй бд: phpbb_categories, phpbb_forums, phpbb_posts, phpbb_posts_text, phpbb_topics, phpbb_users, phpbb_vote_desc, phpbb_vote_results, phpbb_vote_voters. В настройках backup (делать его лучше через phpMyAdmin) снять флажки "Добавить значение auto increment" и "Добавить удаление таблицы". наилучшим вариантом будет установка флажка "Полная вставка данных" - если при модификации форума в бд добавлялись поля, это поможет избежать ошибок выполнения SQL-запросов.

Перед началом запуска второго скрипта необходимо выполнить над второй БД следующие запросы:

Код: Выделить всё

ALTER TABLE `phpbb_banlist` CHANGE `ban_id` `ban_id` MEDIUMINT( 8 ) UNSIGNED NOT NULL;
ALTER TABLE `phpbb_banlist` DROP PRIMARY KEY;

ALTER TABLE `phpbb_categories` CHANGE `cat_id` `cat_id` MEDIUMINT( 8 ) UNSIGNED NOT NULL;  
ALTER TABLE `phpbb_categories` DROP PRIMARY KEY;

ALTER TABLE `phpbb_disallow` CHANGE `disallow_id` `disallow_id` MEDIUMINT( 8 ) UNSIGNED NOT NULL;
ALTER TABLE `phpbb_disallow` DROP PRIMARY KEY;

ALTER TABLE `phpbb_forum_prune` CHANGE `prune_id` `prune_id` MEDIUMINT( 8 ) UNSIGNED NOT NULL;
ALTER TABLE `phpbb_forum_prune` DROP PRIMARY KEY;

ALTER TABLE `phpbb_forums` DROP PRIMARY KEY;

ALTER TABLE `phpbb_groups` CHANGE `group_id` `group_id` MEDIUMINT( 8 ) NOT NULL; 
ALTER TABLE `phpbb_groups` DROP PRIMARY KEY; 

ALTER TABLE `phpbb_posts` CHANGE `post_id` `post_id` MEDIUMINT( 8 ) UNSIGNED NOT NULL;
ALTER TABLE `phpbb_posts` DROP PRIMARY KEY; 

ALTER TABLE `phpbb_posts_text` DROP PRIMARY KEY;

ALTER TABLE `phpbb_privmsgs` CHANGE `privmsgs_id` `privmsgs_id` MEDIUMINT( 8 ) UNSIGNED NOT NULL;
ALTER TABLE `phpbb_privmsgs` DROP PRIMARY KEY;

ALTER TABLE `phpbb_privmsgs_text` DROP PRIMARY KEY;

ALTER TABLE `phpbb_ranks` CHANGE `rank_id` `rank_id` SMALLINT( 5 ) UNSIGNED NOT NULL;
ALTER TABLE `phpbb_ranks` DROP PRIMARY KEY;

ALTER TABLE `phpbb_topics` CHANGE `topic_id` `topic_id` MEDIUMINT( 8 ) UNSIGNED NOT NULL;
ALTER TABLE `phpbb_topics` DROP PRIMARY KEY;

ALTER TABLE `phpbb_users` DROP PRIMARY KEY;

ALTER TABLE `phpbb_vote_desc` CHANGE `vote_id` `vote_id` MEDIUMINT( 8 ) UNSIGNED NOT NULL;
ALTER TABLE `phpbb_vote_desc` DROP PRIMARY KEY;

ALTER TABLE `phpbb_words` CHANGE `word_id` `word_id` MEDIUMINT( 8 ) UNSIGNED NOT NULL;
ALTER TABLE `phpbb_words` DROP PRIMARY KEY;
Потом выливаем экспортированные данные в первую таблицу.

Далее необходимо очистить таблицы phpbb_groups, phpbb_user_group, phpbb_auth_access, таблицы сессий, таблицы поиска. После этого начинаем сливать профили одинаковых пользователей. Делается это таким скриптом:

Код: Выделить всё

<html>
<head>
<title>phpBB Users Splitter (by Xpert@www.phpbbguru.net)</title>
<style type="text/css">
<!--
body {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 8pt;}
h1 {font-size: 10pt;}
input,textarea {color : #000000; font: normal 11px Verdana, Arial, Helvetica,
sans-serif; border-color : #cccccc; border-width:1px;}
-->
</style>
</head>

</head>

<body>
<h1 align=center>phpBB Users Splitter (by Xpert@www.phpbbguru.net)</h1>

<?php
if (isset($_POST['submit']))
// let's do the job
{
   $src_user = intval($_POST['src_user']);
   $targ_user = intval($_POST['targ_user']);

// let's use our own settings - they will be not standart

include('config.php');

// SQL codes - from constants.php
define('BEGIN_TRANSACTION', 1);
define('END_TRANSACTION', 2);

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

//
// updating tables
//

$sql = "UPDATE phpbb_posts SET " .
        "poster_id = $targ_user" .
        " WHERE poster_id = $src_user";

if (!$db->sql_query($sql))
{
        $res = $db->sql_error();
        die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql");
}

echo "posts info update complete...<br>";

$sql = "UPDATE phpbb_privmsgs SET " .
        "privmsgs_from_userid = $targ_user" .
        " WHERE privmsgs_from_userid = $src_user";

if (!$db->sql_query($sql))
{
        $res = $db->sql_error();
        die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql");
}

$sql = "UPDATE phpbb_privmsgs SET " .
        "privmsgs_to_userid = $targ_user" .
        " WHERE privmsgs_to_userid = $src_user";

if (!$db->sql_query($sql))
{
        $res = $db->sql_error();
        die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql");
}

echo "privmsgs info update complete...<br>";

$sql = "UPDATE phpbb_topics SET " .
        "topic_poster = $targ_user" .
        " WHERE topic_poster = $src_user";

if (!$db->sql_query($sql))
{
        $res = $db->sql_error();
        die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql");
}

echo "topics info update complete...<br>";

$sql = "UPDATE phpbb_topics_watch SET " .
        "user_id = $targ_user" .
        " WHERE user_id = $src_user";

if (!$db->sql_query($sql))
{
        $res = $db->sql_error();
        die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql");
}

echo "topics watch info update complete...<br>";

$sql = "UPDATE phpbb_vote_voters SET " .
        "vote_user_id = $targ_user" .
        " WHERE vote_user_id = $src_user";

if (!$db->sql_query($sql))
{
        $res = $db->sql_error();
        die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql");
}

echo "vote voters info update complete...<br>";


// now we are deleting all unnecessary info
// about src & target users from the db

$sql = "DELETE from phpbb_users " .
        " WHERE user_id = $src_user";

if (!$db->sql_query($sql))
{
        $res = $db->sql_error();
        die("<b>Failed:</b> $res[message]<br><b>SQL:</b> $sql");
}

echo "users voters info update complete...<br>";

$db->sql_close();

echo "<br>Completed succesfully! Click <a href='$SCRIPT_NAME'>here</a> to split one more account.";
exit;
}
?>

<form action=<?=$SCRIPT_NAME?> method=post>
Old <input type=text name='src_user'><br>
New <input type=text name='targ_user'><br><br>
<input type=submit name=submit value='Go!'>

</body>
</html>
Кладется тоже в корень. Old user - это тот юзер, который после слития как бы исчезнет, new - соответственно останется. Указываются id пользователей! Советую оставлять того, у кого дата регистрации раньше.

Потом запускаем скрипт, создающий группы для пользователей:

Код: Выделить всё

<?php
//*****  check users and user groups ****//

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

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

$sql = "SELECT user_id, username
    FROM " . USERS_TABLE ."
    WHERE user_id > 0";
if ( !($result = $db->sql_query($sql)) )
{
    message_die(GENERAL_ERROR, 'Could not obtain user list', '', __LINE__, __FILE__, $sql);
}

$liste ='';
while ( $row = $db->sql_fetchrow($result) )
{
   $username = $row['username'];
   $user_id = $row['user_id'];
   $usergroup = '';

   $sql1 = "SELECT ug.group_id
          FROM " . USER_GROUP_TABLE ." ug, ". GROUPS_TABLE. " g
          WHERE ug.user_id = $user_id
            AND ug.group_id = g.group_id
            AND g.group_single_user  = 1
            ";

   if ( ($result1 = $db->sql_query($sql1)) )
   {
       $row1 = $db->sql_fetchrow($result1);
          $usergroup =( ( $row1['group_id'] != '' ) ? $row1['group_id'] : 'User has no user group'.$row1 );

   }

          if (!($row1['group_id'] != ''))
          {

         $sql2 = "SELECT MAX(group_id) AS total
            FROM " . GROUPS_TABLE;
         if ( !($result2 = $db->sql_query($sql2)) )
         {
            message_die(GENERAL_ERROR, 'Could not obtain next group_id information', '', __LINE__, __FILE__, $sq2l);
         }

         if ( !($row2 = $db->sql_fetchrow($result2)) )
         {
            message_die(GENERAL_ERROR, 'Could not obtain next group_id information', '', __LINE__, __FILE__, $sql2);
         }
         $group_id = $row2['total'] + 1;


         $sql3 = "INSERT INTO " . GROUPS_TABLE . " (group_id, group_name, group_description, group_single_user, group_moderator)
            VALUES ($group_id, '', 'Personal User', 1, 0)";
         if ( !($result3 = $db->sql_query($sql3, BEGIN_TRANSACTION)) )
         {
            message_die(GENERAL_ERROR, 'Could not insert data into groups table', '', __LINE__, __FILE__, $sql3);
         }

         $sql4 = "INSERT INTO " . USER_GROUP_TABLE . " (user_id, group_id, user_pending)
            VALUES ($user_id, $group_id, 0)";
         if( !($result4 = $db->sql_query($sql4, END_TRANSACTION)) )
         {
            message_die(GENERAL_ERROR, 'Could not insert data into user_group table', '', __LINE__, __FILE__, $sql4);
         }


             $usergroup = $usergroup.', adding user group '.$group_id;
          }


   $liste .= ( ( $liste != '' ) ? '<br> ' : '' ) . $username.' <b>'.$usergroup.'</b>';
}

message_die(GENERAL_MESSAGE,'Users:<br>'.$liste);

?>
Все. Осталось только проверить конфигурацию, пересоздать поисковую базу, пересоздать какие-то особые группы, если таковые были и переназначить модераторов... А, нет... забыл одну вещь...

Код: Выделить всё

[open]
viewforum.php

[find]
//
// Grab all the basic data (all topics except announcements)
// for this forum
//
$sql = "SELECT t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_username, p2.post_username AS post_username2, p2.post_time 
	FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TABLE . " p2, " . USERS_TABLE . " u2
	WHERE t.forum_id = $forum_id
		AND t.topic_poster = u.user_id
		AND p.post_id = t.topic_first_post_id
		AND p2.post_id = t.topic_last_post_id
		AND u2.user_id = p2.poster_id 
		AND t.topic_type <> " . POST_ANNOUNCE . " 
		$limit_topics_time
	ORDER BY t.topic_type DESC, t.topic_last_post_id DESC 
	LIMIT $start, ".$board_config['topics_per_page'];
if ( !($result = $db->sql_query($sql)) )
{
   message_die(GENERAL_ERROR, 'Could not obtain topic information', '', __LINE__, __FILE__, $sql);
}

[replace with]

//
// Grab all the basic data (all topics except announcements)
// for this forum
//
$sql = "SELECT t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_username, p2.post_username AS post_username2, p2.post_time 
	FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TABLE . " p2, " . USERS_TABLE . " u2
	WHERE t.forum_id = $forum_id
		AND t.topic_poster = u.user_id
		AND p.post_id = t.topic_first_post_id
		AND p2.post_id = t.topic_last_post_id
		AND u2.user_id = p2.poster_id 
		AND t.topic_type <> " . POST_ANNOUNCE . " 
		$limit_topics_time
	ORDER BY t.topic_type DESC, p2.post_time DESC 
	LIMIT $start, ".$board_config['topics_per_page'];
if ( !($result = $db->sql_query($sql)) )
{
   message_die(GENERAL_ERROR, 'Could not obtain topic information', '', __LINE__, __FILE__, $sql);
}
Вот теперь вроде все.
Последний раз редактировалось Xpert 07.01.2005 14:12, всего редактировалось 1 раз.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Virtul
phpBB 1.0.0
Сообщения: 4
Стаж: 19 лет 5 месяцев

Сообщение Virtul »

пригигантское спасибо! =) все, вроде, работает
жаль только перенос приватных мессаг не дописан, а то самому в лом =) ну да фих с ними
пара вопросов, вот зачем во viewforum.php менять сортировку? и еще пробовал на локалхосте потестить, чет вышло что все праймери ключи потерлись =(... и ребилд сеарч, вероятно, из-за этого не пашет, это у меня руки кривые или где-то скрипты напортачили? (сорри нету времени заново все проверять - сесссия все таки)
а так всем советую, нуна, наверное, даже в раздел документации эту полезную весчь кинуть
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 20 лет 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

Скрипты правильные, просто ключи трутся во второй базе, откду данные потом копируются, вы видимо потерли в первой. Восстановить можно так:

Код: Выделить всё

ALTER TABLE `phpbb_banlist` ADD PRIMARY KEY ( `ban_id` );
ALTER TABLE `phpbb_banlist` CHANGE `ban_id` `ban_id` MEDIUMINT( 8 ) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT;  

ALTER TABLE `phpbb_categories` ADD PRIMARY KEY ( `cat_id` );
ALTER TABLE `phpbb_categories` CHANGE `cat_id` `cat_id` MEDIUMINT( 8 ) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT;

ALTER TABLE `phpbb_disallow` ADD PRIMARY KEY ( `disallow_id` );
ALTER TABLE `phpbb_disallow` CHANGE `disallow_id` `disallow_id` MEDIUMINT( 8 ) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT;

ALTER TABLE `phpbb_forum_prune` ADD PRIMARY KEY ( `prune_id` );
ALTER TABLE `phpbb_forum_prune` CHANGE `prune_id` `prune_id` MEDIUMINT( 8 ) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT;

ALTER TABLE `phpbb_forums` ADD PRIMARY KEY ( `forum_id` );

ALTER TABLE `phpbb_groups` ADD PRIMARY KEY ( `group_id` ); 
ALTER TABLE `phpbb_groups` CHANGE `group_id` `group_id` MEDIUMINT( 8 ) DEFAULT '0' NOT NULL AUTO_INCREMENT; 

ALTER TABLE `phpbb_posts` ADD PRIMARY KEY ( `post_id` ); 
ALTER TABLE `phpbb_posts` CHANGE `post_id` `post_id` MEDIUMINT( 8 ) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT;

ALTER TABLE `phpbb_posts_text` ADD PRIMARY KEY ( `post_id` );  

ALTER TABLE `phpbb_privmsgs` ADD PRIMARY KEY ( `privmsgs_id` );
ALTER TABLE `phpbb_privmsgs` CHANGE `privmsgs_id` `privmsgs_id` MEDIUMINT( 8 ) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT;

ALTER TABLE `phpbb_privmsgs_text` ADD PRIMARY KEY ( `privmsgs_text_id` );

ALTER TABLE `phpbb_ranks` ADD PRIMARY KEY ( `rank_id` );
ALTER TABLE `phpbb_ranks` CHANGE `rank_id` `rank_id` SMALLINT( 5 ) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT;

ALTER TABLE `phpbb_topics` ADD PRIMARY KEY ( `topic_id` );
ALTER TABLE `phpbb_topics` CHANGE `topic_id` `topic_id` MEDIUMINT( 8 ) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT;

ALTER TABLE `phpbb_users` ADD PRIMARY KEY ( `user_id` );

ALTER TABLE `phpbb_vote_desc` ADD PRIMARY KEY ( `vote_id` );
ALTER TABLE `phpbb_vote_desc` CHANGE `vote_id` `vote_id` MEDIUMINT( 8 ) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT;

ALTER TABLE `phpbb_words` ADD PRIMARY KEY ( `word_id` );
ALTER TABLE `phpbb_words` CHANGE `word_id` `word_id` MEDIUMINT( 8 ) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT;
Сортировку приходится менять, если два форума какое-то время существовали параллельно, а не сначала один, а потом другой.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
blazch
phpBB 1.4.4
Сообщения: 114
Стаж: 19 лет

Сообщение blazch »

Спасибо за скрипты и объяснения, один вопрос:
у меня небольшая проблемма, т.к. админы форумов которых я объединял разные, да еще под разными никами (root и admin) (одно хорошо - писали в разное время), получается что у меня 2 админа, пробовал ковырятся, но получалось только сделать одного просто пользователем а второго админом. Как объединить этих 2-х админов в одного (чтобы те посты, которые писал допустим root были от admin (поменять пользователя писавшего эти посты))?
Вроде понятно объяснил - если что-то не так, поясню.
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 20 лет 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

Так есть же в моем сообщении.
После этого начинаем сливать профили одинаковых пользователей. Делается это таким скриптом...
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
blazch
phpBB 1.4.4
Сообщения: 114
Стаж: 19 лет

Сообщение blazch »

Спасибо - разобрался. Вот только появился какой-то косяк: пытаюсь авторизоваться под root - говорится, что неверный (пароль\логин...), пробую восстановить пароль через "забыли пароль", приходит письмо ссылкой подтверждения учетной записи и новым паролем, пробую - то же самое (неверный пароль-логин, попробуйте еще раз), в чем ошибка?
Попробовал под другими юзерами - все получается
Можно как-то через phpmyadmin, пароль менять, смотрел в таблице user, но там пароль кодированный.
Аватара пользователя
blazch
phpBB 1.4.4
Сообщения: 114
Стаж: 19 лет

Сообщение blazch »

проблему решил по другому: через phpmyadmin поставил права админа новому юзеру, через админку форума сделал root администратором, создал ему новый пароль - все заработало.
Теперь другая проблема: кликая на "профайл", "личное сообщение" или говорится что такого пользователя не существует, либо ссылка с этих кнопок пустая и кому пишу - не понятно:

Код: Выделить всё

http://mysite.ru/profile.php?mode=viewprofile&u=
http://mysite.ru/privmsg.php?mode=post&u=
либо вообще на странице топиков viewtopic.php
у всех ссылки одинаковые

Код: Выделить всё

http://mysite.ru/profile.php?mode=viewprofile&u=815
http://mysite.ru/privmsg.php?mode=post&u=815
и так у каждого пользователя.
Заметил что на главной странице в графе "Последнее сообщение" стоят сообщения вообще с других подфорумов (т.е. кликая на них попадаешь не на последнее сообщение этого подфорума а в другой подфорум).

сначала думал, что побились таблицы при объединении, но пробовал несколько раз - вс делать точно по описанию - результат тот же :( :( :(

Добавлено спустя 3 минуты 10 секунд:

еще какой-то косяк, в профайле пользователя отображается его аватара, возраст, а в форуме нет (данный глюк касаем только старых пользователей)

Добавлено спустя 16 минут 51 секунду:

Выкладываю свой viewtopic.php (пробовал вставить сюда, но постоянно бьется):
http://venta-vlg.ru/viewtopic.txt[/url]
Jovani
phpBB 2.0.5
Сообщения: 477
Стаж: 20 лет

Сообщение Jovani »

Вот нашел у себя скрипт к теме.
Копирует пользователей из одной базы в другую.
Где взял не помню, поэтому выкладываю тут временную ссылку:
http://monitor.net.ru/temp/copy_users.rar

Вернуться в «Поддержка phpBB 2.0.x»