Закачка текстового файла как сообщений

Идеи для расширения функциональности phpBB 2.0.x
Аватара пользователя
mixer
phpBB 1.4.0
Сообщения: 38
Стаж: 19 лет 9 месяцев
Откуда: Хабаровск

Закачка текстового файла как сообщений

Сообщение mixer »

Есть несколько здоровых файлов с письмами со старого форума которые хочется закачать на phpbb форум.

Структура файла примерно такая:

#|2|Тема второго треда
13-07-2005 08:54:23|-1|Сообщение 1\r\n\r\n(Добавление)\r\n\r\nЕще одна строка
13-07-2005 08:55:12|1|Сообщение 2
13-07-2005 09:25:10|-1|Сообщение 3
#|1|Тема первого треда
13-07-2005 08:54:14|1|Первый пост
13-07-2005 08:55:22|-1|Второй пост

Где строка с решеткой это разделитель тредов, номер темы и название темы.
Далее идут время сообщения, номер юзера в формате phpbb и текст сообщения. Ну и т.д. до новой темы.

Я так понимаю что вся работа сводится к перебору файла и добавлению записей в таблицы phpbb_topics,phpbb_posts и phpbb_posts_text

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

Заранее благодарю!
http://forum.clarionlife.net - форум разработчиков БД на Clarion
Изображение
quazi
phpBB 2.0.2
Сообщения: 306
Стаж: 20 лет 1 месяц

Сообщение quazi »

1. читать файл и парсить его
2. создаь sql-"скрипт" для передачи данных в БД
3. коннектиться к базе и сохранять топики и посты

привожу только первый пункт алгоритма

Код: Выделить всё

$lines = @file($filename);

$forum = array();
foreach ($lines as $line) {

    if (!$line) {
        continue;
    }

    $line = explode('|', $line, 3);
    if ($line[0] == '#') {
        $forum[] = array(
            'topic_id' => $line[1],
            'topic_title' => $line[2],
            'posts' => array(),
        );
        continue;
    }

    $forum[sizeof($forum) - 1]['posts'][] = array(
        'post_time' => $line[0],
        'poster_id' => $line[1],
        'post_text' => $line[2]
    );

}
на выходе получится ассоциативный массив. который легко обработать
Аватара пользователя
mixer
phpBB 1.4.0
Сообщения: 38
Стаж: 19 лет 9 месяцев
Откуда: Хабаровск

Сообщение mixer »

quazi
Я бы это все и сам написал. Нужен пример скрипта с корректным добавлением новых постов. Что бы там не было проблем с автонумерацией и т.д.
Для одного треда нужно создать одну запись в phpbb_topics и соответствующее количеству писем количество записей в phpbb_posts и phpbb_posts_text. А потом опять нужно в phpbb_topics лезть и менять как минимум topic_first_post_id и topic_last_post_id ...

Как это в скрипте описать?
Кто поможет?
SQL совсем немного знаю, но как такое написать не в курсе...
http://forum.clarionlife.net - форум разработчиков БД на Clarion
Изображение
quazi
phpBB 2.0.2
Сообщения: 306
Стаж: 20 лет 1 месяц

Сообщение quazi »

обалдеть.. вы попросили костяк
я написал самый сложный кусок кода
остальное - дело техники и получаса работы мозгом и руками
Аватара пользователя
mixer
phpBB 1.4.0
Сообщения: 38
Стаж: 19 лет 9 месяцев
Откуда: Хабаровск

Сообщение mixer »

костяк для правильного добавления одного письма в любой из форумов
Костяк добавления а не разбора строк ...
http://forum.clarionlife.net - форум разработчиков БД на Clarion
Изображение
Аватара пользователя
mixer
phpBB 1.4.0
Сообщения: 38
Стаж: 19 лет 9 месяцев
Откуда: Хабаровск

Сообщение mixer »

Все сделал и закачал... Почему то сбился счетчик forum_last_post_id (я так думаю)
На главной странице справа отображает не последнее письмо форума а какое то другое...
После добавления нового письма все Ok

А как нибудь пересчитать это поле можно?
http://forum.clarionlife.net - форум разработчиков БД на Clarion
Изображение
Аватара пользователя
Macks
phpBB 1.4.1
Сообщения: 41
Стаж: 19 лет 9 месяцев

Сообщение Macks »

Вот рабочий пример, так я вставляю сообщения о персанальном флуд контроле ( PFC ).

Код: Выделить всё

  

$sql = "SELECT * FROM " . USERS_TABLE . " WHERE user_id = $puser_id";

  if ( !($result = $db->sql_query($sql)) ) {
    message_die(GENERAL_ERROR, 'Could not obtain vote data for this topic', '', __LINE__, __FILE__, $sql);
  }

  if ( $row = $db->sql_fetchrow($result) ) {
  $puser_name = $row['username'];
  $sql  = "INSERT INTO " . TOPICS_TABLE . " (topic_title, topic_poster, topic_time, forum_id, topic_status, topic_type, topic_vote, topic_dis) VALUES ('PFC $pfc $puser_name', " . $userdata['user_id'] . ", ". time() .", 26, " . TOPIC_UNLOCKED . ", 0, 0, 0)";

  	if( !$db->sql_query($sql) )
	{
		$message =  mysql_errno() . " " . mysql_error() . "<br> ". $sql;
		message_die(GENERAL_MESSAGE, $message);
	}

  $topic_id = $db->sql_nextid();

  $sql = "INSERT INTO " . POSTS_TABLE . " (topic_id, forum_id, poster_id, post_username, post_time, poster_ip, enable_bbcode, enable_html, enable_smilies, enable_sig) VALUES ($topic_id, 26, " . $userdata['user_id'] . ", '', ". time() .", '$user_ip', 0, 0, 0, 0)";
	if (!$db->sql_query($sql))
	{
		message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
	}

  $post_id = $db->sql_nextid();

  $sql = "INSERT INTO " . POSTS_TEXT_TABLE . " (post_id, post_subject, bbcode_uid, post_text) VALUES ($post_id, 'PFC $pfc $puser_name', 0, 'Пользователю $puser_name назначен Персональный Флуд Контроль, в размере $pfc секунд.')";
	if (!$db->sql_query($sql))
	{
		message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
	}

  $sql = "UPDATE " . TOPICS_TABLE . " SET topic_last_post_id = $post_id,  topic_first_post_id = $post_id WHERE topic_id = $topic_id";
	if (!$db->sql_query($sql))
	{
		message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
	}

  $sql = "UPDATE " . FORUMS_TABLE . " SET 
		forum_last_post_id = $post_id,
                forum_posts = forum_posts + 1, 
                forum_topics = forum_topics + 1
		WHERE forum_id = 26";
	if (!$db->sql_query($sql))
	{
		message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
	}
http://forum.uo.net.ua
Наши пользователи оставили сообщений: 1363788
Всего зарегистрированных пользователей: 9344

Вернуться в «Запросы модов для phpBB 2.0.x»