Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

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

 

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

 

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

 

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

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

 

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

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

Опубликовано:

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

 

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

Опубликовано:

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

 

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

Опубликовано:
  • Автор

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

Опубликовано:

Нет, это я переносил форум с движка 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;

 

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

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

Опубликовано:

@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, как в вашем варианте, да.

Опубликовано:

Ббкоды скорее всего будут стандартные, раз это два аналогичных форума. Адреса тоже можно заменить без регулярных выражений, если нужно поменять только домен. В конце концов можно уже написать небольшой скрипт по обработке сообщений, либо установить на mysql сервере расширение preg_udf для поддержке замены по регекспам.

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

Сейчас на странице 0

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.