Атаман Posted August 8, 2013 Share Posted August 8, 2013 Мой хороший знакомый просит перенести с существующего форума целый раздел на новый форум. В нем тем 300, а постов я даже не подсчитаю сколько). Как перенести тему и посты я знаю, каждая тема, а потом привязка к ней постов-это все в ручную, но через чур долго. 1) Нужно перенести раздел и все темы его2) По возможности как-то переименовать авторов на другой ID, чтоб не было слово ГОСТЬ. Есть ли экспорт сторонний?. Link to comment Share on other sites More sharing options...
tasker Posted August 8, 2013 Share Posted August 8, 2013 Не изучал структуру БД особо. ID тем и постов сами увеличиваются при вставке записей в таблицы? Тогда ничего сложного, экспорт в файл и в select вписать ID пользователя с его форума, под которым потом сообщения и темы появятся. У себя переделывал все темы и стартовые посты тем с одного пользователя на другого, чисто через sql. Там не только id пользователя нужны, ещё имена местами. 1 Link to comment Share on other sites More sharing options...
Dmitriy427 Posted August 8, 2013 Share Posted August 8, 2013 Готовых скриптов таких нет, скорее всего. Но написать не сложно под конкретную задачу. P.S. sedito_conv.zip Можете вот это адаптировать для своих целей. 1 Link to comment Share on other sites More sharing options...
Атаман Posted August 8, 2013 Author Share Posted August 8, 2013 Спасибо. Это ты только-что создал скрипты? Link to comment Share on other sites More sharing options...
Dmitriy427 Posted August 8, 2013 Share Posted August 8, 2013 Нет, это я переносил форум с движка Sedito. На самом деле, там еще куча правок в теле сообщений была, бб-кодов одних два десятка, смайлов не считано... P.S. Еще разницу в структуре таблиц разных версий учитывать нужно, переносил на 3.3.4 ещё. Link to comment Share on other sites More sharing options...
tasker Posted August 8, 2013 Share Posted August 8, 2013 ТС, завтра в рабочее время по МСК смогу помочь. sql-запрос родим. Два. Один для тем, а второй для постов. Link to comment Share on other sites More sharing options...
siv1987 Posted August 8, 2013 Share Posted August 8, 2013 Можно через конвертер ипс перенести раздел, но там тоже немало ебалы. Самый простой вариант который приходит мне в голову: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; Вообщем это самый простой и быстрый способ который мне пришел на ум. :)Вроде ничего не забыл... 1 1 Link to comment Share on other sites More sharing options...
tasker Posted August 9, 2013 Share Posted August 9, 2013 @siv1987, ИМХО, очень сложно. И не выполнена просьба автора по замене автора тем и сообщений. А без этого смысл какой в пересчёте? Link to comment Share on other sites More sharing options...
Атаман Posted August 9, 2013 Author Share Posted August 9, 2013 Таскер спасибо, я в первом посту написал, что я знаю как тему - пост перенести и тд, но мне нужно глобально все перетащить. Мне за 1 раз нужно 300 тем и 30000 постов. Link to comment Share on other sites More sharing options...
Атаман Posted August 9, 2013 Author Share Posted August 9, 2013 Сив спасибо, я случайно мин поставил. Кнопочки малые очень. Спасибо всем за советы. Дмитрий - Таскер спасибо Вам. Понравился метод Сива, буду пробовать. Link to comment Share on other sites More sharing options...
Dmitriy427 Posted August 9, 2013 Share Posted August 9, 2013 А помоему - скриптом проще. Вытаскиваете два массива из базы - топики принадлежащие нужному форуму и посты относящиеся к этим топикам. Останется только назначить им правильные иденты ( что нибудь типа "range([max tid в таблице ibf_topics + 1], [max tid в таблице ibf_topics + 1] + count($topics))" ), добавить в массивы свои данные пользователя и форума, и записать в базу... Link to comment Share on other sites More sharing options...
tasker Posted August 9, 2013 Share Posted August 9, 2013 @Dmitriy427, а соответствие между массивами как? Ведь ID темы в массиве сообщений должен соответствовать ID темы в массиве тем. Link to comment Share on other sites More sharing options...
Dmitriy427 Posted August 9, 2013 Share Posted August 9, 2013 @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++; } Link to comment Share on other sites More sharing options...
siv1987 Posted August 9, 2013 Share Posted August 9, 2013 @siv1987, ИМХО, очень сложно. И не выполнена просьба автора по замене автора тем и сообщений. А без этого смысл какой в пересчёте?На первый взгляд. На самом деле ничего сложного нет, только выполнять запросы. Экспортировать таблицы и также потом выполнить пару запросов. И замена авторов это тоже все легко делается запросами - удаляется author_id, и заменяются имена пользователей.Смысл в пересчете чтобы обновить статистику форумов. Преимущество перед скриптом в том что не надо ничего отлаживать, не нужно писать гору кода - хотя задача и выглядит просто, но по нормальному сначала нужно записать тему в бд, получить ее last_insert_id, присвоить его постам и записать их базу. Базы должны быть на одном акаунте, а вдруг там 100500 тем и столько же сообщений?Лично мне в данном случае проще было работать базой и запросами, тем более когда они на разных серверах. Link to comment Share on other sites More sharing options...
Dmitriy427 Posted August 9, 2013 Share Posted August 9, 2013 Преимущество перед скриптом в том...Ну, регулярки то там все равно понадобятся. Не встречал пока двух форумов, сколько нибудь поживших, с абсолютно одинаковыми наборами смайлов и бб-кодов, не говоря уже о внутренних ссылках (на сообщения внутри топика часто встречаются например). А значит скрипту альтернативы не будет. И в поставленной тут задаче регулярки нужно будет применять прямо в скрипте переноса, видимо. Что бы иметь возможность сопоставить иденты сообщений и топиков в исходном и результирующем массивах. Или создавать поля old_tid, old_pid, как в вашем варианте, да. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now