1

Тема: Перенос с форума FireBird (Joomla) на форум vBulletin 3.8.7 через XML

Итоговый скрипт, точнее 2 скрипта, с помошью которых я переношу контент (все темы, сообщения и пользователей) с компонента FireBird от ЦМС Joomla 1.0.15  на форум vBulletin 3.8.7.

boris1-out.php -  выгружает FireBird в XML файл.
boris2-in.php - загружает XML файл на форум vBulletin.

Текст скриптов:

boris1-out.php

<?php
echo "<br>подключились к БД...Выгрузка старого форума в echo для xmlки Д.Кино<br><br>";
  
$file_ini = file("boris.ini");
$host="localhost";
$user=trim($file_ini[0]);
$pwd=trim($file_ini[1]);
$database_name=trim($file_ini[2]);
$db=mysql_connect($host,$user,$pwd);
echo "<br>   {$database_name} - {$user} - {$pwd} <br><br>";
mysql_select_db($database_name,$db); 
mysql_query ('SET NAMES cp1251');

// категории jos_fb_categories  Поля  id-0,parent-1,name-2,description - 20
$sql = mysql_query('SELECT id, parent,name, description  FROM jos_fb_categories');

echo "<?xml version='1.0' standalone='yes'?><root>";
echo  "<categories>";
while ($row = mysql_fetch_array($sql)) { 
$id = $row[0];
$parent = $row[1];
$name = $row[2];
$description = $row[3];
echo "<cat><id>".$id."</id><parent>".$parent."</parent><name>".$name."</name><description>".$description."</description></cat>";

 }
echo "</categories>";


$maxthread = mysql_fetch_array(mysql_query("SELECT MAX(thread) FROM jos_fb_messages"));
echo "<maxthread>" . $maxthread[0]  . "</maxthread>"; // сколько тем

echo "<contents>";
 for ($i = 0; $i <= $maxthread[0]; $i++) { // проходимся по всем топикам
 
 $sql = mysql_query( 'SELECT * FROM jos_fb_messages INNER JOIN jos_fb_messages_text ON jos_fb_messages.id=jos_fb_messages_text.mesid 
 WHERE thread='.$i.' ORDER BY thread DESC LIMIT 10' );// выборка всех постов топика

 //jos_fb_messages_text - посты.  Поля mesid = 1908  номер поста, message - текст поста
 //jos_fb_messages. id = mesid, parent - пред пост    , thread - тема, catid - категория, name - имя, subject - назв темы. 

 $num_rows = mysql_num_rows( $sql);//сколько постов в одной теме
  if ($num_rows >0){
  echo "<threads num-post='{$num_rows}'>";

    while ($row = mysql_fetch_array($sql)) { // в каждом $row (посте) по строчке из массива $sql
    //print_r($row);
    $id = $row[0];
    $parent = $row[1];
    $thread = $row[2];
    $catid = $row[3];
    $name = $row[4];
    $userid = $row[5];
    $email = $row[6];
    $subject = $row[7];
    $message = $row[20];
    echo "<id>".$id."</id><parent>".$parent."</parent><thread>".$thread."</thread><catid>".$catid."</catid><name>".$name."</name>
    <userid>".$userid."</userid><email>".$email."</email><subject>".$subject."</subject><message>".$message."</message>";
    //вывели один пост
     }
  echo "</threads>";}
 }
echo "</contents></root>";

mysql_close($db);        
echo "<br>закрыли БД";
                ?>

boris2-in.php

 <html>
<head>
<title>Конвертер</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>


<?php
echo "<br>подкл к БД2... из файла ex.xml старого форума кино - заливка на форум ВБ<br><br>";

$file_ini = file("boris2.ini");
$host="localhost";
$user=trim($file_ini[0]);
$pwd=trim($file_ini[1]);
$database_name=trim($file_ini[2]);
$db=mysql_connect($host,$user,$pwd);
echo "<br>   {$database_name} - {$user} - {$pwd} <br>";
mysql_select_db($database_name,$db); 

// зачистка
echo "Зачистка для теста<br>";
$result = mysql_query("DELETE FROM `post` WHERE `postid`>5") or die("Invalid query: " . mysql_error()); 
$result = mysql_query("DELETE  FROM `thread` WHERE `threadid`>2") or die("Invalid query: " . mysql_error());
$result = mysql_query("DELETE  FROM  `forum` WHERE `forumid` >2") or die("Invalid query: " . mysql_error());
$result = mysql_query("DELETE FROM `user` WHERE `userid` > 3") or die("Invalid query: " . mysql_error());


//  настройки
$usergroupid=2;  // группа для новых юзеров в ВБ (лучше создать отдельную)
$parentid=1; // родительский ид

$xml= simplexml_load_file('ex.xml');
 

$i=1;

foreach ($xml->categories->cat as $value){ // 1.Разделы форума
$id = $value->id;
$title =  $value->name;
$description = $value->description;
echo $id.".".$title. " // ".$description."<br>";

// записываем разделы в базу
$result = mysql_query("INSERT INTO forum 
(title, title_clean, description, description_clean, options, displayorder, daysprune, parentid, parentlist, childlist, cyb_frules)  
VALUES   
('$title', '$title','$description','$description', '16391', '1', '-1', '$parentid', '10,1,-1', '10,-1', '1')")
or die("Invalid query: " . mysql_error()); 


$maxrazd = mysql_fetch_array(mysql_query("SELECT MAX(forumid) FROM forum"));
echo "последний раздел:".$maxrazd[0]."<br>";

//сопоставили $id и forumid ($maxrazd).
$masf[$i][0]=$id;
$masf[$i][1]=$maxrazd[0];
$i=$i+1;
}

echo "<br>проверка двумерного массива id  и  forumid<br>";
for($q=1; $q <$i; $q++){  
echo  "<br>0:".$masf[$q][0].", 1:".$masf[$q][1];     
}  

//  БЛОК ТЕМ И ПОСТОВ!

// найти последнюю тему
$maxthread = mysql_fetch_array(mysql_query("SELECT MAX(threadid) FROM thread"));
$threadid=$maxthread[0];
echo "<br>последняя тема:" . $threadid  . "<br>"; 

//найти последний пост
$maxpost = mysql_fetch_array(mysql_query("SELECT MAX(postid) FROM post"));
$idpost=$maxpost[0];
echo "<br>последний пост:" . $idpost  . "<br>"; 
$idpost = $idpost +1;

$mytime = date( "U" ) - 3000000; // месяц назад


foreach ($xml->contents->threads as $value){ // создаем темы
echo $value->id; //валовый номер темы
 
$forumid= $masf[(int)$value->catid][1]; // созданный раздел на ВБ вставим в тему
//echo "<br>id=" .$value->catid.", forumid=". $forumid;

$threadid = $threadid+1;

// ВСТАВИМ ПОСТЫ!
$name=$value->name; // авторы постов
$message = $value->message; // тексты постов
$i=0; // номер в массиве автора поста

foreach ($message as $maspost) // все посты в теме
{
$nm = $name[$i];

// ищем в базе, зареген ли юзер
$sql = mysql_query("SELECT * FROM `user` WHERE `username` = '$nm'");
$num_rows = mysql_num_rows($sql);
echo $nm ." - ". $num_rows;

if ($num_rows <>1){ //  не зарегеный
$today = date("Y-m-d");
$result = mysql_query("INSERT INTO user (usergroupid,username,password,passworddate,email,usertitle,salt) 
VALUES  ('$usergroupid','$nm','tsl1@mytest.ru','$today','tsl1@mytest.ru','$nm','s1a2l3t')")
or die("Invalid query: " . mysql_error());
echo " - Новый юзер<br>"; 
}

$myuser = mysql_fetch_array(mysql_query("SELECT `userid` FROM `user` WHERE `username` = '$nm'"));
$userid = $myuser[0];

echo "<br>Вставка поста: "; 
$title = "RE: ".$value->subject; //  в заголовке поста назв. темы 
$result = mysql_query("INSERT INTO post  
(postid, threadid, parentid, username, userid, title, dateline, pagetext, visible) 
VALUES 
('$idpost', '$threadid', '$parentid', '$nm','$userid', '$title', '$mytime', '$maspost', '1')")
or die("Invalid query: " . mysql_error());

echo "idpost:". $idpost. " threadid:". $threadid. " ник:". $nm ." userid:". $userid ." ". $title ." ".  $maspost ."<br>";

$idpost = $idpost +1;
$i=$i+1;
$mytime = $mytime  + rand(300, 700);
}

// ВСТАВИМ ТЕМУ!
$threadtitle = $value->subject; // название темы
echo $threadtitle."<br>";

$result = mysql_query("INSERT INTO thread
(threadid, title, firstpostid, forumid, open, dateline, visible) 
VALUES
('$threadid', '$threadtitle', '$idpost-1', '$forumid', '1', '$mytime', '1')")
or die("Invalid query: " . mysql_error()); 


}



/*  МУСОР!

// СТруктура разделолв:
// <?xml version='1.0' standalone='yes'?>
//<root> 
//<categories>
//<cat><id>1</id><parent>2</parent><name>3</name><description>4</description></cat>
//</categories>


ТЕМЫ!!!
 //jos_fb_messages_text - посты.  Поля mesid = 1908  номер поста, message - текст поста
 //jos_fb_messages. id = mesid, parent - пред пост    , thread - тема, catid - категория, name - имя, subject - назв темы. 

<contents>
<threads num-post=2>
//один пост
<id>1</id><parent>2</parent><thread>3</thread><catid>4</catid><name>5</name>
<userid>6</userid><email>7</email><subject>8</subject><message>9</message>
</threads>
</contents>
</root>

// options - ***91 - раздел открыт, ***89 - раздел закрыт , ***87 - категория  открыта, ***85 - категория  закрыта 

// таблица thread - threadid, title, firstpostid, lastpostid, forumid
// таблица post - threadid, parentid, username, userid, dateline, pagetext, visible
// время, unix time stamp транслятор, onlineconversion.com/unix_time.htm
// если указать корректный userid, то username не используется
// посты в теме сортируются только по времени, а не по цепочке parentid постов.

// вставить тему (пример для теста вставки)
//$result = mysql_query("INSERT INTO thread
//(threadid, title, firstpostid, forumid, open, dateline, visible) 
//VALUES
//('563', 'НАЗВ ТЕМЫ', '1890', '566', '1', '1390054277', '1')")
//or die("Invalid query: " . mysql_error()); 

// вставить пост  (пример для теста вставки)
//$result = mysql_query("INSERT INTO post
//(postid, threadid, parentid, username, userid, title, dateline, pagetext, visible) 
//VALUES 
//('1890', '563', '0', 'Федя', '1', 'title', '1390039200', 'ТЕКСТ ТЕМЫ', '1')")
//or die("Invalid query: " . mysql_error()); 
*/
?>




</body>
</html>

Поделиться