объединение двух форумов в один
-
- phpBB 1.0.0
- Сообщения: 4
- Стаж: 20 лет 4 месяца
объединение двух форумов в один
есть форум на 2.0.8 и на 2.0.11
хотца перенести всю информацию (пользователей, сообщения и т.п.) с них в новый на базе 2.0.11, подскажите плз, как это можно сделать?
пробовал вручню через phpmyadmin таблицы переносить - ругаеца, не принимает файл, может не туды жму? =)
(только пожалуйста поподробнее, а то че-то я совсем уже запутался)
хотца перенести всю информацию (пользователей, сообщения и т.п.) с них в новый на базе 2.0.11, подскажите плз, как это можно сделать?
пробовал вручню через phpmyadmin таблицы переносить - ругаеца, не принимает файл, может не туды жму? =)
(только пожалуйста поподробнее, а то че-то я совсем уже запутался)
-
- phpBB 2.0.4
- Сообщения: 404
- Стаж: 20 лет 5 месяцев
- Откуда: оттуда
Насколько я понял задачу - Вам надо слить две базы в одну?есть форум на 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
...
-
- phpBB Guru
- Сообщения: 5484
- Стаж: 21 год
- Поблагодарили: 2 раза
А что конкретно требуется перенести? Единственное, с чем мне пока не удалось разобраться - так это с переносом групп, а все остальное точно подскажу.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
-
- Former team member
- Сообщения: 816
- Стаж: 20 лет 11 месяцев
- Откуда: Estonia, Tallinn
А не на чисто установленный ли автору надо перенести ?А что конкретно требуется перенести?

(всяко бывает, может просто правила не читал...)
Серый цвет - светлый (светлее чёрного), но он и тёмный (темнее белого), он же промежуточный (между чёрным и белым). Теорию относительности никто не отменял. Истина в целом - понятие виртуально-ситуативное.
-
- phpBB 1.0.0
- Сообщения: 4
- Стаж: 20 лет 4 месяца
-
- Former team member
- Сообщения: 702
- Стаж: 20 лет 5 месяцев
-
- phpBB Guru
- Сообщения: 5484
- Стаж: 21 год
- Поблагодарили: 2 раза
Хорошо. Методика слива основана на следующем - к id сообщений, юзеров, тем и т.д форума, который предполагается долить прибавляется число, представляющее собой макс. id сообщений, юзеров, тем и т.д форума, к которому предполагается произвести доливку. Далее производим модификацию таблиц второго форума (при помощи скрипта). Затем определенные таблицы второго форума экспортируются из БД и вставляются в БД первого форума.
Итак. Скрипт, выдергивающий необходимые максимальные id:
Данные, выданные им, вставляются во второй скрипт, который выглядит следующим образом:
Первый скрипт запускается над базой первого форума, второй - над базой второго. Оба они кладутся в корневую директорию 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-запросов.
Перед началом запуска второго скрипта необходимо выполнить над второй БД следующие запросы:
Потом выливаем экспортированные данные в первую таблицу.
Далее необходимо очистить таблицы phpbb_groups, phpbb_user_group, phpbb_auth_access, таблицы сессий, таблицы поиска. После этого начинаем сливать профили одинаковых пользователей. Делается это таким скриптом:
Кладется тоже в корень. Old user - это тот юзер, который после слития как бы исчезнет, new - соответственно останется. Указываются 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();
?>
Перед началом запуска второго скрипта необходимо выполнить над второй БД следующие запросы:
Код: Выделить всё
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>
Потом запускаем скрипт, создающий группы для пользователей:
Код: Выделить всё
<?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 раз.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
-
- phpBB 1.0.0
- Сообщения: 4
- Стаж: 20 лет 4 месяца
пригигантское спасибо! =) все, вроде, работает
жаль только перенос приватных мессаг не дописан, а то самому в лом =) ну да фих с ними
пара вопросов, вот зачем во viewforum.php менять сортировку? и еще пробовал на локалхосте потестить, чет вышло что все праймери ключи потерлись =(... и ребилд сеарч, вероятно, из-за этого не пашет, это у меня руки кривые или где-то скрипты напортачили? (сорри нету времени заново все проверять - сесссия все таки)
а так всем советую, нуна, наверное, даже в раздел документации эту полезную весчь кинуть
жаль только перенос приватных мессаг не дописан, а то самому в лом =) ну да фих с ними
пара вопросов, вот зачем во viewforum.php менять сортировку? и еще пробовал на локалхосте потестить, чет вышло что все праймери ключи потерлись =(... и ребилд сеарч, вероятно, из-за этого не пашет, это у меня руки кривые или где-то скрипты напортачили? (сорри нету времени заново все проверять - сесссия все таки)
а так всем советую, нуна, наверное, даже в раздел документации эту полезную весчь кинуть
-
- phpBB Guru
- Сообщения: 5484
- Стаж: 21 год
- Поблагодарили: 2 раза
Скрипты правильные, просто ключи трутся во второй базе, откду данные потом копируются, вы видимо потерли в первой. Восстановить можно так:
Сортировку приходится менять, если два форума какое-то время существовали параллельно, а не сначала один, а потом другой.
Код: Выделить всё
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;
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
-
- phpBB 1.4.4
- Сообщения: 114
- Стаж: 19 лет 11 месяцев
Спасибо за скрипты и объяснения, один вопрос:
у меня небольшая проблемма, т.к. админы форумов которых я объединял разные, да еще под разными никами (root и admin) (одно хорошо - писали в разное время), получается что у меня 2 админа, пробовал ковырятся, но получалось только сделать одного просто пользователем а второго админом. Как объединить этих 2-х админов в одного (чтобы те посты, которые писал допустим root были от admin (поменять пользователя писавшего эти посты))?
Вроде понятно объяснил - если что-то не так, поясню.
у меня небольшая проблемма, т.к. админы форумов которых я объединял разные, да еще под разными никами (root и admin) (одно хорошо - писали в разное время), получается что у меня 2 админа, пробовал ковырятся, но получалось только сделать одного просто пользователем а второго админом. Как объединить этих 2-х админов в одного (чтобы те посты, которые писал допустим root были от admin (поменять пользователя писавшего эти посты))?
Вроде понятно объяснил - если что-то не так, поясню.
-
- phpBB Guru
- Сообщения: 5484
- Стаж: 21 год
- Поблагодарили: 2 раза
Так есть же в моем сообщении.
После этого начинаем сливать профили одинаковых пользователей. Делается это таким скриптом...
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
-
- phpBB 1.4.4
- Сообщения: 114
- Стаж: 19 лет 11 месяцев
Спасибо - разобрался. Вот только появился какой-то косяк: пытаюсь авторизоваться под root - говорится, что неверный (пароль\логин...), пробую восстановить пароль через "забыли пароль", приходит письмо ссылкой подтверждения учетной записи и новым паролем, пробую - то же самое (неверный пароль-логин, попробуйте еще раз), в чем ошибка?
Попробовал под другими юзерами - все получается
Можно как-то через phpmyadmin, пароль менять, смотрел в таблице user, но там пароль кодированный.
Попробовал под другими юзерами - все получается
Можно как-то через phpmyadmin, пароль менять, смотрел в таблице user, но там пароль кодированный.
-
- phpBB 1.4.4
- Сообщения: 114
- Стаж: 19 лет 11 месяцев
проблему решил по другому: через phpmyadmin поставил права админа новому юзеру, через админку форума сделал root администратором, создал ему новый пароль - все заработало.
Теперь другая проблема: кликая на "профайл", "личное сообщение" или говорится что такого пользователя не существует, либо ссылка с этих кнопок пустая и кому пишу - не понятно:
либо вообще на странице топиков viewtopic.php
у всех ссылки одинаковые
и так у каждого пользователя.
Заметил что на главной странице в графе "Последнее сообщение" стоят сообщения вообще с других подфорумов (т.е. кликая на них попадаешь не на последнее сообщение этого подфорума а в другой подфорум).
сначала думал, что побились таблицы при объединении, но пробовал несколько раз - вс делать точно по описанию - результат тот же

Добавлено спустя 3 минуты 10 секунд:
еще какой-то косяк, в профайле пользователя отображается его аватара, возраст, а в форуме нет (данный глюк касаем только старых пользователей)
Добавлено спустя 16 минут 51 секунду:
Выкладываю свой viewtopic.php (пробовал вставить сюда, но постоянно бьется):
http://venta-vlg.ru/viewtopic.txt[/url]
Теперь другая проблема: кликая на "профайл", "личное сообщение" или говорится что такого пользователя не существует, либо ссылка с этих кнопок пустая и кому пишу - не понятно:
Код: Выделить всё
http://mysite.ru/profile.php?mode=viewprofile&u=
http://mysite.ru/privmsg.php?mode=post&u=
у всех ссылки одинаковые
Код: Выделить всё
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]
-
- phpBB 2.0.5
- Сообщения: 477
- Стаж: 20 лет 11 месяцев
Вот нашел у себя скрипт к теме.
Копирует пользователей из одной базы в другую.
Где взял не помню, поэтому выкладываю тут временную ссылку:
http://monitor.net.ru/temp/copy_users.rar
Копирует пользователей из одной базы в другую.
Где взял не помню, поэтому выкладываю тут временную ссылку:
http://monitor.net.ru/temp/copy_users.rar