Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
Атаман

Перенос раздела с одного форума на другой.

Рекомендованные сообщения

Мой хороший знакомый просит перенести с существующего форума целый раздел на новый форум.

 

В нем тем 300, а постов я даже не подсчитаю сколько).

 

Как перенести тему и посты я знаю, каждая тема, а потом привязка к ней постов-это все в ручную, но через чур долго.

 

1) Нужно перенести раздел и все темы его

2) По возможности как-то переименовать авторов на другой ID, чтоб не было слово ГОСТЬ.

 

Есть ли экспорт сторонний?.

Поделиться сообщением


Ссылка на сообщение

Не изучал структуру БД особо. ID тем и постов сами увеличиваются при вставке записей в таблицы? Тогда ничего сложного, экспорт в файл и в select вписать ID пользователя с его форума, под которым потом сообщения и темы появятся.

 

У себя переделывал все темы и стартовые посты тем с одного пользователя на другого, чисто через sql. Там не только id пользователя нужны, ещё имена местами.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

Готовых скриптов таких нет, скорее всего. Но написать не сложно под конкретную задачу.

 

P.S. sedito_conv.zip Можете вот это адаптировать для своих целей.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

Спасибо. Это ты только-что создал скрипты?

Поделиться сообщением


Ссылка на сообщение

Нет, это я переносил форум с движка Sedito. На самом деле, там еще куча правок в теле сообщений была, бб-кодов одних два десятка, смайлов не считано...

 

P.S. Еще разницу в структуре таблиц разных версий учитывать нужно, переносил на 3.3.4 ещё.

Поделиться сообщением


Ссылка на сообщение

ТС, завтра в рабочее время по МСК смогу помочь. sql-запрос родим. Два. Один для тем, а второй для постов.

Поделиться сообщением


Ссылка на сообщение

Можно через конвертер ипс перенести раздел, но там тоже немало ебалы.

 

Самый простой вариант который приходит мне в голову:

1. Создаем две пустые таблицы топиков и постов. Форумов я думаю не нужно, если в разделе нет других форумов.

CREATE TABLE new_topics LIKE "ibf_topics";

CREATE TABLE new_posts LIKE "ibf_topics";

 

2. Копируем туда темы и сообщения из нужного нам раздела

INSERT INTO new_topics SELECT * FROM ibf_topics WHERE forum_id IN (ид_форума);

INSERT INTO new_posts SELECT p.* FROM ibf_posts p INNER JOIN ibf_topics t ON t.tid=p.topic_id WHERE t.forum_id IN (ид_форума);

 

3. Создаем новое поле в экспортируемой таблице топиков - old_tid. Дублируем туда ид топиков

ALTER TABLE new_topics ADD COLUMN old_tid int(10) NOT NULL DEFAULT '0';

UPDATE new_topics SET old_tid=tid;

 

ALTER TABLE new_posts ADD COLUMN old_post tinyint(1) NOT NULL DEFAULT '0';

UPDATE new_posts SET old_post=1;

 

В базе куда будем переносить раздел нужно выполнить следующие запросы:

ALTER TABLE ibf_topics ADD COLUMN old_tid int(10) NOT NULL DEFAULT '0';

ALTER TABLE ibf_posts ADD COLUMN old_post tinyint(1) NOT NULL DEFAULT '0';

 

4. Удаляем первичные ключи из таблиц new_topics и new_posts, и удаляем айдишники (в новой базе они будут новые).

ALTER TABLE new_topics DROP PRIMARY KEY;

ALTER TABLE new_posts DROP PRIMARY KEY;

 

ALTER TABLE new_topics CHANGE COLUMN `tid` `tid` int(10) DEFAULT null;

ALTER TABLE new_posts CHANGE COLUMN `pid` `pid` int(10) DEFAULT null;

 

UPDATE new_topics SET tid=NULL;

UPDATE new_posts SET pid=NULL;

 

5. Экспортируем таблицы new_topics и new_posts.

 

6. Импортируем таблицы в новом форуме. Копируем данные из них в рабочие таблицы форума.

INSERT INTO ibf_topics SELECT * FROM new_topics;

INSERT INTO ibf_posts SELECT * FROM new_posts;

 

7. Обновляем данные ид тем в таблице ibf_posts

UPDATE ibf_posts p INNER JOIN ibf_topics t ON (t.old_tid=p.topic_id AND p.old_post=1) SET p.topic_id=t.tid;

 

Дальше идет обыкновенный пересчет статистики. Что запросами, что стандартными функциями пересчета. Отсюда уже будет гораздо проще.

По полному завершению переноса, в конце можно удалить две ненужные поля из ibf_topics И ibf_posts

ALTER TABLE ibf_topics DROP COLUMN old_tid;

ALTER TABLE ibf_posts DROP COLUMN old_post;

 

Вообщем это самый простой и быстрый способ который мне пришел на ум. :)

Вроде ничего не забыл...

  • Upvote 1
  • Downvote 1

Поделиться сообщением


Ссылка на сообщение

@siv1987, ИМХО, очень сложно. И не выполнена просьба автора по замене автора тем и сообщений. А без этого смысл какой в пересчёте?

Поделиться сообщением


Ссылка на сообщение

Таскер спасибо, я в первом посту написал, что я знаю как тему - пост перенести и тд, но мне нужно глобально все перетащить. Мне за 1 раз нужно 300 тем и 30000 постов.

Поделиться сообщением


Ссылка на сообщение

Сив спасибо, я случайно мин поставил. Кнопочки малые очень.

 

Спасибо всем за советы. Дмитрий - Таскер спасибо Вам.

 

Понравился метод Сива, буду пробовать.

Поделиться сообщением


Ссылка на сообщение

А помоему - скриптом проще. Вытаскиваете два массива из базы - топики принадлежащие нужному форуму и посты относящиеся к этим топикам. Останется только назначить им правильные иденты ( что нибудь типа "range([max tid в таблице ibf_topics + 1], [max tid в таблице ibf_topics + 1] + count($topics))" ), добавить в массивы свои данные пользователя и форума, и записать в базу...

Поделиться сообщением


Ссылка на сообщение

@Dmitriy427, а соответствие между массивами как? Ведь ID темы в массиве сообщений должен соответствовать ID темы в массиве тем.

Поделиться сообщением


Ссылка на сообщение

@Dmitriy427, а соответствие между массивами как? Ведь ID темы в массиве сообщений должен соответствовать ID темы в массиве тем.

Условиями во вложенном цикле все делается. То есть, массив сообщений обрабатывается в цикле размещенном внутри цикла обрабатывающего темы. Оно не так сложно выглядит в коде, как тут в описании, на самом деле. :).

 

P.S. Ну, вот например:

$tid = n1; // max tid + 1
$pid = n2; // max pid + 1
foreach ($topics as $key => $topic) {
$t_array[$key] = $topic;
$t_array['tid'][$key] = $tid;
foreach ($posts as $k => $post) {
	if ($post['topic_id'] == $topics['tid'][$key]) {
		$p_array[$k] = $post;
		$p_array['pid'][$k] = $pid;
		$p_array['topic_id'][$k] = $tid;
		$pid++;
	}
}
$tid++;
}

Поделиться сообщением


Ссылка на сообщение

@siv1987, ИМХО, очень сложно. И не выполнена просьба автора по замене автора тем и сообщений. А без этого смысл какой в пересчёте?

На первый взгляд. На самом деле ничего сложного нет, только выполнять запросы. Экспортировать таблицы и также потом выполнить пару запросов. И замена авторов это тоже все легко делается запросами - удаляется author_id, и заменяются имена пользователей.

Смысл в пересчете чтобы обновить статистику форумов.

 

Преимущество перед скриптом в том что не надо ничего отлаживать, не нужно писать гору кода - хотя задача и выглядит просто, но по нормальному сначала нужно записать тему в бд, получить ее last_insert_id, присвоить его постам и записать их базу. Базы должны быть на одном акаунте, а вдруг там 100500 тем и столько же сообщений?

Лично мне в данном случае проще было работать базой и запросами, тем более когда они на разных серверах.

Поделиться сообщением


Ссылка на сообщение

Преимущество перед скриптом в том...

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

 

И в поставленной тут задаче регулярки нужно будет применять прямо в скрипте переноса, видимо. Что бы иметь возможность сопоставить иденты сообщений и топиков в исходном и результирующем массивах. Или создавать поля old_tid, old_pid, как в вашем варианте, да.

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...