Опубликовано: 8 августа 201312 г Мой хороший знакомый просит перенести с существующего форума целый раздел на новый форум. В нем тем 300, а постов я даже не подсчитаю сколько). Как перенести тему и посты я знаю, каждая тема, а потом привязка к ней постов-это все в ручную, но через чур долго. 1) Нужно перенести раздел и все темы его2) По возможности как-то переименовать авторов на другой ID, чтоб не было слово ГОСТЬ. Есть ли экспорт сторонний?.
Опубликовано: 8 августа 201312 г Не изучал структуру БД особо. ID тем и постов сами увеличиваются при вставке записей в таблицы? Тогда ничего сложного, экспорт в файл и в select вписать ID пользователя с его форума, под которым потом сообщения и темы появятся. У себя переделывал все темы и стартовые посты тем с одного пользователя на другого, чисто через sql. Там не только id пользователя нужны, ещё имена местами.
Опубликовано: 8 августа 201312 г Готовых скриптов таких нет, скорее всего. Но написать не сложно под конкретную задачу. P.S. sedito_conv.zip Можете вот это адаптировать для своих целей.
Опубликовано: 8 августа 201312 г Нет, это я переносил форум с движка Sedito. На самом деле, там еще куча правок в теле сообщений была, бб-кодов одних два десятка, смайлов не считано... P.S. Еще разницу в структуре таблиц разных версий учитывать нужно, переносил на 3.3.4 ещё.
Опубликовано: 8 августа 201312 г ТС, завтра в рабочее время по МСК смогу помочь. sql-запрос родим. Два. Один для тем, а второй для постов.
Опубликовано: 8 августа 201312 г Можно через конвертер ипс перенести раздел, но там тоже немало ебалы. Самый простой вариант который приходит мне в голову: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_postsUPDATE 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_postsALTER TABLE ibf_topics DROP COLUMN old_tid;ALTER TABLE ibf_posts DROP COLUMN old_post; Вообщем это самый простой и быстрый способ который мне пришел на ум. :)Вроде ничего не забыл...
Опубликовано: 9 августа 201312 г @siv1987, ИМХО, очень сложно. И не выполнена просьба автора по замене автора тем и сообщений. А без этого смысл какой в пересчёте?
Опубликовано: 9 августа 201312 г Автор Таскер спасибо, я в первом посту написал, что я знаю как тему - пост перенести и тд, но мне нужно глобально все перетащить. Мне за 1 раз нужно 300 тем и 30000 постов.
Опубликовано: 9 августа 201312 г Автор Сив спасибо, я случайно мин поставил. Кнопочки малые очень. Спасибо всем за советы. Дмитрий - Таскер спасибо Вам. Понравился метод Сива, буду пробовать.
Опубликовано: 9 августа 201312 г А помоему - скриптом проще. Вытаскиваете два массива из базы - топики принадлежащие нужному форуму и посты относящиеся к этим топикам. Останется только назначить им правильные иденты ( что нибудь типа "range([max tid в таблице ibf_topics + 1], [max tid в таблице ibf_topics + 1] + count($topics))" ), добавить в массивы свои данные пользователя и форума, и записать в базу...
Опубликовано: 9 августа 201312 г @Dmitriy427, а соответствие между массивами как? Ведь ID темы в массиве сообщений должен соответствовать ID темы в массиве тем.
Опубликовано: 9 августа 201312 г @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++; }
Опубликовано: 9 августа 201312 г @siv1987, ИМХО, очень сложно. И не выполнена просьба автора по замене автора тем и сообщений. А без этого смысл какой в пересчёте?На первый взгляд. На самом деле ничего сложного нет, только выполнять запросы. Экспортировать таблицы и также потом выполнить пару запросов. И замена авторов это тоже все легко делается запросами - удаляется author_id, и заменяются имена пользователей.Смысл в пересчете чтобы обновить статистику форумов. Преимущество перед скриптом в том что не надо ничего отлаживать, не нужно писать гору кода - хотя задача и выглядит просто, но по нормальному сначала нужно записать тему в бд, получить ее last_insert_id, присвоить его постам и записать их базу. Базы должны быть на одном акаунте, а вдруг там 100500 тем и столько же сообщений?Лично мне в данном случае проще было работать базой и запросами, тем более когда они на разных серверах.
Опубликовано: 9 августа 201312 г Преимущество перед скриптом в том...Ну, регулярки то там все равно понадобятся. Не встречал пока двух форумов, сколько нибудь поживших, с абсолютно одинаковыми наборами смайлов и бб-кодов, не говоря уже о внутренних ссылках (на сообщения внутри топика часто встречаются например). А значит скрипту альтернативы не будет. И в поставленной тут задаче регулярки нужно будет применять прямо в скрипте переноса, видимо. Что бы иметь возможность сопоставить иденты сообщений и топиков в исходном и результирующем массивах. Или создавать поля old_tid, old_pid, как в вашем варианте, да.
Опубликовано: 9 августа 201312 г Ббкоды скорее всего будут стандартные, раз это два аналогичных форума. Адреса тоже можно заменить без регулярных выражений, если нужно поменять только домен. В конце концов можно уже написать небольшой скрипт по обработке сообщений, либо установить на mysql сервере расширение preg_udf для поддержке замены по регекспам.
Мой хороший знакомый просит перенести с существующего форума целый раздел на новый форум.
В нем тем 300, а постов я даже не подсчитаю сколько).
Как перенести тему и посты я знаю, каждая тема, а потом привязка к ней постов-это все в ручную, но через чур долго.
1) Нужно перенести раздел и все темы его
2) По возможности как-то переименовать авторов на другой ID, чтоб не было слово ГОСТЬ.
Есть ли экспорт сторонний?.