Перейти к контенту

2.0.3 -> 1.3.1 Конвентирование


MANIX

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

Можно ли перенести вю базу с новой 2 версии в версию 1.3.1 ? :D[1113815486:1113933205]Неужели нету?
Ссылка на комментарий
Поделиться на других сайтах

  • 4 месяца спустя...
  • 3 года спустя...

Вчера сделал конвертер.

Даже больше чем конвертер - мигратор. Затягивает из 2.х.х в уже имеющийся 1.3:

  • // Тащим структуру категорий/форумов.
    • // Если есть форумы выше второго уровня, делаем для них новую категорию:

    [*]// Тащим топики и раскладываем по форумам.

    • // Какой-то м...к сделал топики прямо в категории - кидаю в треш

    [*]// Тащим посты

    • // Непарные и первые аттачи не-картинок делаем аттачами со счетчиками:
    • // ... и добавляем линк на скачивание вторичного аттача
    • // Приаттаченые картинки берем под спойлер и добавляем в конец поста; миниатюры делаем заголовком спойлера.

    [*]// Тащим юзеров

    • // аплоады аватарок конвертим
    • // аплоады фото конвертим

    [*]// Тащим пассы юзеров

    • // Если затянули несколько форумов и появились дубликаты логинов - механизм распознавания по паролю, и на каждый вход в форум ПМ-ка от админа (и ПМ-ка админу - опционально) о желательности слияния двух юзеров в одного или смене имен.

    [*]// Тащим личные сообщения

    [*]// Обновляем статистику

 

 

Если тянуть в пустой форум 1.х - получится простое конвертирование.

Если тянуть в непустой - получится слияние двух форумов.

Если в один пустой (или не пустой) затянуть несколько двушек - получится слияние нескольких двушек.

 

Работа мигратора требует внесения изменений в файлы принимающего форума.

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...
Думаю им должно быть ||. Другое дело, что ставиться это будет скорее всего на варезный 1.3 :D
Ссылка на комментарий
Поделиться на других сайтах

Сделано под мою БД, поэтому под типовую БД 1.х могут быть ошибки; в этом случае потребуется подправить мигратор: убрать заполнение тех полей таблиц, которых нет в вашей БД.

 

Итак, мигратор. Позволяет перенести БД (категории, форумы, сообщения, мемберов) в уже имеющийся форум 1.х.

Можно переносить, и таким образом "склеивать", несколько разных форумов.

 

 

Поехали:

 

Исходный форум 1.3 должен быть установлен ТОЛЬКО с префиксом таблиц ibf_

 

Таблицы форума 2.х должны быть установлены в ту же базу с префиксом ibf2_

 

Все директории из uploads скопировать в директорию uploads принимающего форума; все файлы из корня директории uploads скопировать в директорию archive_in принимающего форума.

 

CREATE TABLE `ibf_members_incoming` (
 `incoming_id` int(10) NOT NULL auto_increment,
 `incoming_pass_hash` varchar(32) NOT NULL default '',
 `incoming_pass_salt` varchar(5) NOT NULL default '',
 `incoming_name` varchar(255) NOT NULL default '',
 PRIMARY KEY  (`incoming_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=16212 ;

 

 

В принимающем форуме Login.php

Найти:

        //-------------------------------------------------
       // Attempt to get the user details
       //-------------------------------------------------

       $DB->query("SELECT id, name, mgroup, password, ip_address FROM ibf_members WHERE LOWER(name)='$username'");

       if ( $DB->get_num_rows() )
       {
           $member = $DB->fetch_row();

           if ( empty($member['id']) or ($member['id'] == "") )
           {
               $this->log_in_form( 'wrong_name' );
           }

           if ($member['password'] != $password)
           {
               $this->log_in_form( 'wrong_pass' );
           }

           //------------------------------

           if ($ibforums->input['CookieDate'])
           {
               $std->my_setcookie("member_id"   , $member['id'], 1);
               $std->my_setcookie("pass_hash"   , $password, 1);
           }

           //------------------------------
           // Update profile if IP addr missing
           //------------------------------

           if ( $member['ip_address'] == "" OR $member['ip_address'] == '127.0.0.1' )
           {
               $DB->query("UPDATE ibf_members SET ip_address='{$ibforums->input['IP_ADDRESS']}' WHERE id={$member['id']}");
           }

           //------------------------------
           // Create / Update session
           //------------------------------

           $poss_session_id = "";

           if ( $cookie_id = $std->my_getcookie('session_id') )
           {
               $poss_session_id = $std->my_getcookie('session_id');
           }
           else if ( $ibforums->input['s'] )
           {
               $poss_session_id = $ibforums->input['s'];
           }

           if ($poss_session_id)
           {
               $session_id = $poss_session_id;

               // Delete any old sessions with this users IP addy that doesn't match our
               // session ID.

               $DB->query("DELETE FROM ibf_sessions WHERE ip_address='".$ibforums->input['IP_ADDRESS']."' AND id <> '$session_id'");

               $db_string = $DB->compile_db_update_string( array (
                                                                    'member_name'  => $member['name'],
                                                                    'member_id'    => $member['id'],
                                                                    'running_time' => time(),
                                                                    'member_group' => $member['mgroup'],
                                                                    'login_type'   => $ibforums->input['Privacy'] ? 1 : 0
                                                         )       );

               $db_query = "UPDATE ibf_sessions SET $db_string WHERE id='".$session_id."'";
           }
           else
           {
               $session_id = md5( uniqid(microtime()) );

               // Delete any old sessions with this users IP addy.

               $DB->query("DELETE FROM ibf_sessions WHERE ip_address='".$ibforums->input['IP_ADDRESS']."'");

               $db_string = $DB->compile_db_insert_string( array (
                                                                    'id'           => $session_id,
                                                                    'member_name'  => $member['name'],
                                                                    'member_id'    => $member['id'],
                                                                    'running_time' => time(),
                                                                    'member_group' => $member['mgroup'],
                                                                    'ip_address'   => substr($ibforums->input['IP_ADDRESS'], 0, 50),
                                                                    'browser'      => substr($std->clean_value($HTTP_USER_AGENT), 0, 50),
                                                                    'login_type'   => $ibforums->input['Privacy'] ? 1 : 0
                                                         )       );

               $db_query = "INSERT INTO ibf_sessions (" .$db_string['FIELD_NAMES']. ") VALUES (". $db_string['FIELD_VALUES'] .")";
           }

           $DB->query( $db_query );

           $ibforums->member           = $member;
           $ibforums->session_id       = $session_id;

           if ($ibforums->input['referer'] && ($ibforums->input['act'] != 'Reg'))
           {
               $url = $ibforums->input['referer'];
               $url = str_replace( "{$ibforums->vars['board_url']}/index.{$ibforums->vars['php_ext']}", "", $url );
               $url = preg_replace( "!^\?!"       , ""   , $url );
               $url = preg_replace( "!s=(\w){32}!", ""   , $url );
               $url = preg_replace( "!act=(login|reg|lostpass)!i", "", $url );
           }

           //-----------------------------------
           // set our privacy cookie
           //-----------------------------------

           if ($ibforums->input['Privacy'] == 1)
           {
               $std->my_setcookie( "anonlogin", 1 );
           }

           //-----------------------------------
           // Clear out any passy change stuff
           //-----------------------------------

           $DB->query("DELETE FROM ibf_validating WHERE member_id={$ibforums->member['id']} AND lost_pass=1");

           //-----------------------------------
           // Redirect them to either the board
           // index, or where they came from
           //-----------------------------------

           $std->my_setcookie("session_id", $ibforums->session_id, -1);

           $this->logged_in = 1;

           if ( USE_MODULES == 1 )
           {
               $this->modules->register_class(&$this);
               $this->modules->on_login($member);
           }

           if ( $ibforums->input['return'] != "" )
           {
               $return = urldecode($ibforums->input['return']);

               if ( preg_match( "#^http://#", $return ) )
               {
                   $std->boink_it($return);
               }
           }

           $print->redirect_screen( "{$ibforums->lang[thanks_for_login]} {$ibforums->member['name']}", $url );


       }
       else
       {
           $this->logged_in = 0;

           if ( USE_MODULES == 1 )
           {
               $this->modules->register_class(&$this);
               $this->modules->on_login($member);
           }

           $this->log_in_form( 'wrong_name' );
       }

   }

 

Заменить на:

        //-------------------------------------------------
       // Attempt to get the user details
       //-------------------------------------------------
// +FatCat С учетом миграции
       $users_in_name = $DB->query("SELECT m.id, m.name, m.mgroup, m.password, m.ip_address, i.incoming_id, i.incoming_pass_hash, i.incoming_pass_salt FROM ibf_members m LEFT JOIN ibf_members_incoming i ON (m.id=i.incoming_id) WHERE LOWER(name)='$username' ORDER BY id ASC");

	// Счетчики удачных совпадений логинов/паролей если логины совпали:
	$logining_yes_migrant = 0;
	$logining_no_migrant = 0;
	$logining_yes_member = 0;
	$logining_no_member = 0;
	while ( $member = $DB->fetch_row($users_in_name) )
	{
		if($member['password'] == "password")	// Мигрант
		{
			$migrate_cool = $this->test_migrate($member['id'], $ibforums->input['PassWord'], $member['incoming_pass_hash'], $member['incoming_pass_salt']);
			if($migrate_cool)
			{
				$logining_yes_migrant++;
				$migrant = array();	// Сохраняем инфу о мигранте
				$migrant['id'] = $member['id'];
				$migrant['name'] = $member['name'];
				$migrant['mgroup'] = $member['mgroup'];
				$migrant['ip_address'] = $member['ip_address'];
			}
			else {$logining_no_migrant++;}
		}
		else	// Мембер
		{
			if($member['password'] == $password)
			{
				$logining_yes_member++;
				$member_safe = array();	// Сохраняем инфу о мембере
				$member_safe['id'] = $member['id'];
				$member_safe['name'] = $member['name'];
				$member_safe['mgroup'] = $member['mgroup'];
				$member_safe['ip_address'] = $member['ip_address'];
			}
			else {$logining_no_member++;}
		}
	}
	if($logining_yes_migrant > 0 and $logining_yes_member == 0)	// Принимаем мигранта
	{
		$member = array();
		$member['id'] = $migrant['id'];
		$member['name'] = $migrant['name'];
		$member['mgroup'] = $migrant['mgroup'];
		$member['ip_address'] = $migrant['ip_address'];
		$member['password'] = $password;

		// Даем полновесную прописку мигранту в форум:
		$DB->query("UPDATE ibf_members SET password = '".$password."' WHERE id = ".$member['id']);
		$DB->query("DELETE FROM ibf_members_incoming WHERE incoming_id = ".$member['id']);
	}
	elseif($logining_yes_member > 0)	// Логиним мембера
	{
		$member = array();
		$member['id'] = $member_safe['id'];
		$member['name'] = $member_safe['name'];
		$member['mgroup'] = $member_safe['mgroup'];
		$member['ip_address'] = $member_safe['ip_address'];
		$member['password'] = $password;
	}

	if( ($logining_yes_migrant+$logining_no_migrant+$logining_yes_member+$logining_no_member) > 0 )
	{
		if ( empty($member['id']) or ($member['id'] == "") )
           {
               $this->log_in_form( 'wrong_pass' );
           }

           if ($member['password'] != $password)
           {
               $this->log_in_form( 'wrong_pass' );
           }

           //------------------------------

           if ($ibforums->input['CookieDate'])
           {
               $std->my_setcookie("member_id"   , $member['id'], 1);
               $std->my_setcookie("pass_hash"   , $password, 1);
           }

           //------------------------------
           // Update profile if IP addr missing
           //------------------------------

           if ( $member['ip_address'] == "" OR $member['ip_address'] == '127.0.0.1' )
           {
               $DB->query("UPDATE ibf_members SET ip_address='{$ibforums->input['IP_ADDRESS']}' WHERE id={$member['id']}");
           }

           //------------------------------
           // Create / Update session
           //------------------------------

           $poss_session_id = "";

           if ( $cookie_id = $std->my_getcookie('session_id') )
           {
               $poss_session_id = $std->my_getcookie('session_id');
           }
           else if ( $ibforums->input['s'] )
           {
               $poss_session_id = $ibforums->input['s'];
           }

           if ($poss_session_id)
           {
               $session_id = $poss_session_id;

               // Delete any old sessions with this users IP addy that doesn't match our
               // session ID.

               $DB->query("DELETE FROM ibf_sessions WHERE ip_address='".$ibforums->input['IP_ADDRESS']."' AND id <> '$session_id'");

               $db_string = $DB->compile_db_update_string( array (
                                                                    'member_name'  => $member['name'],
                                                                    'member_id'    => $member['id'],
                                                                    'running_time' => time(),
                                                                    'member_group' => $member['mgroup'],
                                                                    'login_type'   => $ibforums->input['Privacy'] ? 1 : 0
                                                         )       );

               $db_query = "UPDATE ibf_sessions SET $db_string WHERE id='".$session_id."'";
           }
           else
           {
               $session_id = md5( uniqid(microtime()) );

               // Delete any old sessions with this users IP addy.

               $DB->query("DELETE FROM ibf_sessions WHERE ip_address='".$ibforums->input['IP_ADDRESS']."'");

               $db_string = $DB->compile_db_insert_string( array (
                                                                    'id'           => $session_id,
                                                                    'member_name'  => $member['name'],
                                                                    'member_id'    => $member['id'],
                                                                    'running_time' => time(),
                                                                    'member_group' => $member['mgroup'],
                                                                    'ip_address'   => substr($ibforums->input['IP_ADDRESS'], 0, 50),
                                                                    'browser'      => substr($std->clean_value($HTTP_USER_AGENT), 0, 50),
                                                                    'login_type'   => $ibforums->input['Privacy'] ? 1 : 0
                                                         )       );

               $db_query = "INSERT INTO ibf_sessions (" .$db_string['FIELD_NAMES']. ") VALUES (". $db_string['FIELD_VALUES'] .")";
           }

           $DB->query( $db_query );

           $ibforums->member           = $member;
           $ibforums->session_id       = $session_id;

           if ($ibforums->input['referer'] && ($ibforums->input['act'] != 'Reg'))
           {
               $url = $ibforums->input['referer'];
               $url = str_replace( "{$ibforums->vars['board_url']}/index.{$ibforums->vars['php_ext']}", "", $url );
               $url = preg_replace( "!^\?!"       , ""   , $url );
               $url = preg_replace( "!s=(\w){32}!", ""   , $url );
               $url = preg_replace( "!act=(login|reg|lostpass)!i", "", $url );
           }

           //-----------------------------------
           // set our privacy cookie
           //-----------------------------------

           if ($ibforums->input['Privacy'] == 1)
           {
               $std->my_setcookie( "anonlogin", 1 );
           }

           //-----------------------------------
           // Clear out any passy change stuff
           //-----------------------------------

           $DB->query("DELETE FROM ibf_validating WHERE member_id={$ibforums->member['id']} AND lost_pass=1");

           //-----------------------------------
           // Redirect them to either the board
           // index, or where they came from
           //-----------------------------------

           $std->my_setcookie("session_id", $ibforums->session_id, -1);

           $this->logged_in = 1;

           if ( USE_MODULES == 1 )
           {
               $this->modules->register_class(&$this);
               $this->modules->on_login($member);
           }

           if ( $ibforums->input['return'] != "" )
           {
               $return = urldecode($ibforums->input['return']);

               if ( preg_match( "#^http://#", $return ) )
               {
                   $std->boink_it($return);
               }
           }
// ПМ о неуникальности ника:

		if( ($logining_yes_migrant+$logining_no_migrant+$logining_yes_member+$logining_no_member) > 1 )
		{
			$raw = array( 
			  'member_id'      => $member['id'],
			  'msg_date'       => time(),
			  'read_state'     => 0,
			  'title'          => "Административное сообщение: дублирование имен",
			  'message'        => "Доброго времени суток, <b>".$member['name']."!</b>!<br>В результате слияния форумов Ваше имя <i>".$member['name']."</i> стало неуникальным на объединенном форуме.<br>Возможно, что второе имя - Ваш профиль на другом форуме; или же это иной человек.<br>Есть вероятность, что другой человек станет писать от Вашего имени сообщения в форуме и в личной переписке.<br><br>Просим Вас незамедлительно сообщить администратору форума об этой ошибке, просто ответив на это письмо.<br><br><br>Это письмо создано автоматической системой распознавания дублей, и будет автоматически повторяться при каждой авторизации на форуме, пока ошибка дублирования имен не будет исправлена.",
			  'from_id'        => "1",
			  'vid'            => 'in',
			  'recipient_id'   => $member['id'],
			  'cc_users'       => ""
			);

			$db_string = $DB->compile_db_insert_string($raw);

			$DB->query("INSERT INTO ibf_messages (" .$db_string['FIELD_NAMES']. ") VALUES (". $db_string['FIELD_VALUES'] .")");
			$DB->query("UPDATE ibf_members SET show_popup=1, new_msg = (new_msg+1) WHERE id=".$member['id']);
		}

		$print->redirect_screen( "{$ibforums->lang[thanks_for_login]} {$ibforums->member['name']}", $url );


       }
	else
	{
           $this->logged_in = 0;

           if ( USE_MODULES == 1 )
           {
               $this->modules->register_class(&$this);
               $this->modules->on_login($member);
           }

           $this->log_in_form( 'wrong_name' );
       }
   }


function test_migrate($id, $pass1, $hash, $salt)
{
	global $std, $ibforums;
	if(md5( md5( $salt ) . md5( $pass1 ) ) ==  $hash)return TRUE;
	else return FALSE;
}

 

 

 

В принимающем форуме создать директорию migrate, и в нее положить index.php следующего содержания:

<?php

define( 'DO_MODE', 0 );	// 0 - Отладка (вывод на экран sql-запросов); 2 - отладка с большими базами; 1 - выполнение миграции.
define( 'UPLOADS_URL', 'http://coda.su/forum' );	// Домен папки аплоадсов (без слеши на конце)

/*
Скрипт переноса и добавления данных 
из IP.Board 2.3.6 (с другими версиями не тестировался)
в IPB 1.3 final / FatCat edition

NB:
Если есть форумы более второго уровня вложенности - под них создается новая категория, и туда они сваливаются навалом.
Если хватило у ма в двушке создать топики прямо в корне категории - после миграции они найдутся в треше.
Права доступа - только администраторы. Скины не присваиваются, ибо не совместимы в принципе.
Голосования не импортируются.

КАК ПОЛЬЗОВАТЬСЯ:

1. Установить таблицы вторичного форума в ту же БД с префиксом ibf2_
  Утилита BigDump и текстовые редакторы автозамены в руки.
2. Директории из uploads скопировать в директорию uploads реципиента.
  Загруженные аватарки из корня uploads донора поместить в archive_in реципиента.

*/


//-----------------------------------------------
// USER CONFIGURABLE ELEMENTS
//-----------------------------------------------

// Root path

$root_path = "../";
define('TIME_LIMIT', 0);
$is_safe_mode = ini_get('safe_mode') == '1' ? 1 : 0;
if (!$is_safe_mode && function_exists('set_time_limit')) set_time_limit(TIME_LIMIT);
error_reporting  (E_ERROR | E_WARNING | E_PARSE);
set_magic_quotes_runtime(0);

class info {

var $input      = array();
var $base_url   = "";
var $vars       = "";
function info() {
	global $sess, $std, $DB, $root_path, $INFO;

	$this->vars = &$INFO;

}
}

//--------------------------------
// Import $INFO, now!
//--------------------------------

require $root_path."conf_global.php";

//--------------------------------
// Require our global functions
//--------------------------------

require $root_path."sources/functions.php";

$std   = new FUNC;

//--------------------------------
// Load the DB driver and such
//--------------------------------

$INFO['sql_driver'] = !$INFO['sql_driver'] ? 'mySQL' : $INFO['sql_driver'];

$to_require = $root_path."sources/Drivers/".$INFO['sql_driver'].".php";
require ($to_require);

$DB = new db_driver;

$DB->obj['sql_database']     = $INFO['sql_database'];
$DB->obj['sql_user']         = $INFO['sql_user'];
$DB->obj['sql_pass']         = $INFO['sql_pass'];
$DB->obj['sql_host']         = $INFO['sql_host'];
$DB->obj['sql_tbl_prefix']   = $INFO['sql_tbl_prefix'];

// Get a DB connection

$DB->connect();

//--------------------------------
// Wrap it all up in a nice easy to
// transport super class
//--------------------------------

$ibforums             = new info();

//--------------------------------
//  Set up our vars
//--------------------------------

$ibforums->input      = $std->parse_incoming();
$ibforums->base_url   = $ibforums->vars['board_url'].'/index.'.$ibforums->vars['php_ext'];

//--------------------------------
// Что делаем?
//--------------------------------

echo("Делаем миграцию форума 2.3.6 => 1.3<hr>");

get_info();

$cat_struct=do_cats(); //  Тащим структуру категорий/форумов.
if($cat_struct)echo(" выполнено!<hr>");

$top_struct=do_tops(); //  Тащим топики и раскладываем по форумам.
if($top_struct)echo(" выполнено!<hr>");

$post_struct=do_posts(); //  Тащим посты
if($post_struct)echo(" выполнено!<hr>");

echo("Ищем хвосты некорректно удаленных топиков");
$recovery_bad_topics=recovery_bad_topics(); //  Ищем посты без топиков и создаем им топики в треше
if($recovery_bad_topics == 0)echo("БД в порядке, восстановления не потребовалось!<hr>");
else echo("Восстановлено и помещено в треш ".$recovery_bad_topics." топиков");

$attach_struct=do_attach(); //  Тащим аттачи
if($attach_struct)echo(" выполнено!<hr>");

$users_struct=do_users(); //  Тащим юзеров
if($users_struct)echo(" выполнено!<hr>");

$users_pass_struct=do_users_pass(); //  Тащим пассы юзеров
if($users_pass_struct)echo(" выполнено!<hr>");

$users_pm=do_pm(); //  Тащим личные сообщения
if($users_pm)echo(" выполнено!<hr>");

$stats=do_stats(); //  Тащим личные сообщения
if($$stats)echo("<br><br>Миграция произошла, смотрите отчет об ошибках выше.<hr>");

//-------------------------------------------------
//  Тянем инфу реципиента.
//-------------------------------------------------

function get_info() {
global $DB, $ibforums, $root_path, $std, $INFO;
// Тянем структуру категорий реципиента
$DB->query( "SELECT max( id ) AS mid, max( position ) AS pos FROM ibf_categories" );
$out = $DB->fetch_row();
define('MAX_CAT_ID',  $out['mid']);		// Последний айдишник категории реципиента 
define('MAX_CAT_POS',  $out['pos']);	// Последняя позиция категории реципиента

// Тянем структуру форумов реципиента
$DB->query( "SELECT max( id ) AS mid, max( position ) AS pos FROM ibf_forums" );
$out = $DB->fetch_row();
define('MAX_FORUM_ID',  $out['mid']);	// Последний айдишник форума реципиента
define('MAX_FORUM_POS',  $out['pos']);	// Последняя позиция форума реципиента

// Тянем настройки мемберов реципиента
$DB->query( "SELECT max( id ) AS mid FROM ibf_members" );
$out = $DB->fetch_row();
define('MAX_MEMBER_ID',  $out['mid']);	// Последний айдишник мембера реципиента

// Тянем настройки топиков реципиента
$DB->query( "SELECT max( tid ) AS mid FROM ibf_topics" );
$out = $DB->fetch_row();
define('MAX_TOPICS_ID',  $out['mid']);	// Последний айдишник топиков реципиента

// Тянем настройки постов реципиента
$DB->query( "SELECT max( pid ) AS pid FROM ibf_posts" );
$out = $DB->fetch_row();
define('MAX_POSTS_ID',  $out['pid']);	// Последний айдишник постов реципиента

// Тянем настройки ПМ реципиента
$DB->query( "SELECT max(msg_id) as mid FROM ibf_messages" );
$out = $DB->fetch_row();
if($out['mid'] == "")$out['mid'] = 0;
define('MAX_PM_ID',  $out['mid']);	// Последний айдишник ПМ реципиента
}


//-------------------------------------------------
//  Тащим структуру категорий/форумов.
//-------------------------------------------------

function do_cats() {
global $DB, $ibforums, $root_path, $std, $INFO;

// Счетчики:
$cats = "|";
$forums_migrate_ids = "|";
$forum_in_cats = "|";
$cat_count = intval(MAX_CAT_ID);
$pos_count = intval(MAX_CAT_POS);
$for_count = intval(MAX_FORUM_ID);

// Готовим код миграции категорий и форумов
$cat_struc = "";
$DB->query( "SELECT * FROM ibf2_forums ORDER BY parent_id ASC" );	// Не менять ORDER!!! Иначе полетит структура категорий донора.
while( $out = $DB->fetch_row() )
{
	// Создаем sql-запросы создания новых категорий:
	if($out['parent_id'] == "-1")
	{
		$cat_count++;
		$pos_count++;
		$cat_id_curent = intval(MAX_CAT_ID)+intval($out['id']);
		$cats .= $out['id']."|";
		// Миграция категорий:
		$cat_struc .= "INSERT INTO `ibf_categories` VALUES (".$cat_id_curent.", ".$pos_count.", '1', '".$out['name']."', '".$out['description']."', '', '');<br>";
	}
	// Создаем sql-запросы создания новых форумов:
	else
	{
		// Пересчитываем...
		$for_count++;
		$out['last_poster_id'] = intval($out['last_poster_id']) + intval(MAX_MEMBER_ID);
		$out['position'] = intval($out['position']) + intval(MAX_FORUM_POS);
		if($out['newest_id']>0) $out['newest_id'] = intval($out['newest_id']) + intval(MAX_TOPICS_ID);
		if( stristr($cats, "|".$out['parent_id']."|") )	// Форум первого уровня
		{
			// Создаем список форумов первого уровня с категориями:
			$forum_in_cats .= $out['id'].">".$out['parent_id']."|".$for_count."|";
			// Миграция форумов первого уровня в категории:
			$categories = MAX_CAT_ID + intval($out['parent_id']);
			$cat_struc .= "INSERT INTO ibf_forums VALUES (".$for_count.", ".$out['topics'].", ".$out['posts'].", ".$out['last_post'].", ".$out['last_poster_id'].", '".$out['last_poster_name']."', '".$out['name']."', '".$out['description']."', ".$out['position'].", ".$out['use_ibc'].", ".$out['use_html'].", '".$out['status']."', '4', '4', '4', '', ".$categories.", '".$out['newest_title']."', ".$out['newest_id'].", 'last_post', 'Z-A', 100, 0, '4', 0, 1, 0, 1, 0, -1, 0, 1, 1, '".$out['redirect_url']."', ".$out['redirect_on'].", 0, '', '', '', 0, '', '');<br>";
			$forums_migrate_ids .= $out['id'].">".$for_count."|";
		}
	}
}

// Второй прогон для выявления форумов второго и выше уровней вложенности:
// Перезапускаем счетчики:
$cat_count = intval(MAX_CAT_ID);
$pos_count = intval(MAX_CAT_POS);
$for_count = intval(MAX_FORUM_ID);
// Готовимся запомнить форумы выше второго уровня:
$third_forums = "";
// Пытаем БД донора:
$DB->query( "SELECT * FROM ibf2_forums ORDER BY parent_id ASC" );	// Не менять ORDER!!! Иначе полетит структура категорий донора.
while( $out = $DB->fetch_row() )
{
	if($out['parent_id'] != "-1") // Отсекаем категории
	{
		$for_count++;
		$out['last_poster_id'] = intval($out['last_poster_id']) + intval(MAX_MEMBER_ID);
		$out['position'] = intval($out['position']) + intval(MAX_FORUM_POS);
		if($out['newest_id']>0) $out['newest_id'] = intval($out['newest_id']) + intval(MAX_TOPICS_ID);
		if( !stristr($cats, "|".$out['parent_id']."|") ) // Отсекаем форумы первого уровня
		{
			if( stristr($forum_in_cats, "|".$out['parent_id'].">") )	// Ловим форумы второго уровня
			{
				$find_cat_id = explode("|".$out['parent_id'].">", $forum_in_cats);
				$find_cat_id = $find_cat_id[1];
				$find_cat_id = explode("|", $find_cat_id);
				$parent_forum = $find_cat_id[1];
				$find_cat_id = $find_cat_id[0];
				$find_cat_id = intval($find_cat_id) + intval(MAX_CAT_ID);
				// Миграция форумов второго уровня
				$cat_struc .= "INSERT INTO ibf_forums VALUES (".$for_count.", ".$out['topics'].", ".$out['posts'].", ".$out['last_post'].", ".$out['last_poster_id'].", '".$out['last_poster_name']."', '".$out['name']."', '".$out['description']."', ".$out['position'].", ".$out['use_ibc'].", ".$out['use_html'].", '".$out['status']."', '4', '4', '4', '', ".$find_cat_id.", '".$out['newest_title']."', ".$out['newest_id'].", 'last_post', 'Z-A', 100, 0, '4', 0, 1, 0, 1, 0, ".$parent_forum.", 0, 1, 1, '".$out['redirect_url']."', ".$out['redirect_on'].", 0, '', '', '', 0, '', '');<br>";
				// Делаем отображение дочернего форума в родительском:
				$cat_struc .= "UPDATE ibf_forums SET subwrap = '1' WHERE id = ".$parent_forum.";<br>";
				$forums_migrate_ids .= $out['id'].">".$for_count."|";
			}
			else	// Ловим форумы выше второго уровня
			{
				$third_forums .= "INSERT INTO ibf_forums VALUES (".$for_count.", ".$out['topics'].", ".$out['posts'].", ".$out['last_post'].", ".$out['last_poster_id'].", '".$out['last_poster_name']."', '".$out['name']."', '".$out['description']."', ".$out['position'].", ".$out['use_ibc'].", ".$out['use_html'].", '".$out['status']."', '4', '4', '4', '', will_be_new_cat_id, '".$out['newest_title']."', ".$out['newest_id'].", 'last_post', 'Z-A', 100, 0, '4', 0, 1, 0, 1, 0, -1, 0, 1, 1, '".$out['redirect_url']."', ".$out['redirect_on'].", 0, '', '', '', 0, '', '');<br>";
				$forums_migrate_ids .= $out['id'].">".$for_count."|";
			}
		}
	}
}
// Если есть форумы выше второго уровня, делаем для них новую категорию:

if($third_forums != "")
{
	$swalka_id = $cat_id_curent +1;
	$cat_struc .= "INSERT INTO ibf_categories VALUES (".$swalka_id.", ".(intval($pos_count) + 1).", '1', 'Временная категоря', 'Сюда мигрировали форумы глубокого вложения, недопустимые в текущей версии ситемы', '', '');<br>";
	$third_forums = str_replace("will_be_new_cat_id", $swalka_id, $third_forums);
	$cat_struc .= $third_forums;
}
define(FORUMS_MIGRATE_IDS, $forums_migrate_ids);	// сохранили инфо о смене айдишников форумов
echo("Миграция структуры категорий и форумов: ");

foreach( explode( ";<br>", $cat_struc ) as $query )
{
	if( $query != "" )
	{
		if(DO_MODE == 1){$DB->query($query);			echo(". ");}
		else{echo($query.";<br><br>");}
	}
}

return true;
}

function do_tops() {
global $DB, $ibforums, $root_path, $std, $INFO;
echo("Миграция топиков:<br>");
$topics_realy = "|";
$topicks_query = $DB->query("SELECT * FROM ibf2_topics");	// Запрос топиков донора
while ( $r = $DB->fetch_row($topicks_query) )
{
	// Формируем запрос
	if($r['moved_to'] == NULL)$r['moved_to'] = "''";	// Шняга
	if($r['author_mode'] == NULL)$r['author_mode'] = "''";
	$new_forum_id = explode("|".$r['forum_id'].">", FORUMS_MIGRATE_IDS);	// Добываем новые айдишники форумов
	$new_forum_id = $new_forum_id[1];
	$new_forum_id = explode("|", $new_forum_id);
	$new_forum_id = $new_forum_id[0];
	$r['title'] = safesql($r['title']);
	$r['description'] = safesql($r['description']);
	$r['starter_name'] = safesql($r['starter_name']);
	$r['last_poster_name'] = safesql($r['last_poster_name']);
	if( !stristr(FORUMS_MIGRATE_IDS,"|".$r['forum_id'].">") ) // Какой-то мудак сделал топики прямо в категории - кидаю в треш
	{
		$new_forum_id = "2";
	}
	$new_topic_tid = intval($r['tid']) + intval(MAX_TOPICS_ID);
	$query = "INSERT INTO ibf_topics VALUES (".$new_topic_tid.", '".$r['title']."', '".$r['description']."', '".$r['state']."', ".$r['posts'].", ".( intval($r['starter_id']) + intval(MAX_MEMBER_ID) ).", ".$r['start_date'].", ".( intval($r['last_poster_id']) + intval(MAX_MEMBER_ID) ).", ".$r['last_post'].", 0, '".$r['starter_name']."', '".$r['last_poster_name']."', '0', 0, ".$r['views'].", ".$new_forum_id.", ".$r['approved'].", ".$r['author_mode'].", ".$r['pinned'].", ".$r['moved_to'].", '', 0, 0, '', '')";
	// Миграция топиков без постов
	if(DO_MODE == 1){$DB->query($query);			echo(". ");}
	elseif(DO_MODE == 2){echo($new_topic_tid.", ");}
	else{echo($query.";<br><br>");}
	$topics_realy .= (intval($r['tid']) + intval(MAX_TOPICS_ID) )."|";
}
define('TOPICS_REALY', $topics_realy);	// Массив реально существующих топиков.
return true;
}


function do_posts() {
global $DB, $ibforums, $root_path, $std, $INFO;
echo("Миграция сообщений в топиках:<br>");

$bad_topics = FALSE;
$posts_query = $DB->query("SELECT p.*, t.tid, t.forum_id FROM ibf2_posts p LEFT JOIN ibf2_topics t ON (p.topic_id=t.tid) ORDER BY p.pid");	// Запрос топиков донора
while ( $r = $DB->fetch_row($posts_query) )
{
	// Выясняем новый forum_id
	$new_forum_id = explode("|".$r['forum_id'].">", FORUMS_MIGRATE_IDS);	// Добываем новые айдишники форумов
	$new_forum_id = $new_forum_id[1];
	$new_forum_id = explode("|", $new_forum_id);
	$new_forum_id = $new_forum_id[0];

	// Формируем запрос
	$r['post'] = safesql($r['post']);
	$r['post'] .= " ";
	$r['author_name'] = safesql($r['author_name']);
	if( !stristr(FORUMS_MIGRATE_IDS,"|".$r['forum_id'].">") ) // Какой-то мудак сделал топики прямо в категории - кидаю в треш
	{
		$new_forum_id = "2";
	}
	$new_post_pid = intval($r['pid']) + intval(MAX_POSTS_ID);
	$new_topic_id = intval($r['topic_id']) + intval(MAX_TOPICS_ID);
	if($r['author_id'] == 0)$new_author_id = 0;
	else $new_author_id = intval($r['author_id']) + intval(MAX_MEMBER_ID);
	if( !stristr(TOPICS_REALY, "|".$new_topic_id."|") )
	{
		$bad_topics = TRUE;
		echo("<br>Пост № ".$new_post_pid."=>".$new_topic_id." не имеет родительского топика<br>");
	}
	$query = "INSERT INTO ibf_posts VALUES (".$new_post_pid.", 0, '', ".$new_author_id.", '".$r['author_name']."', ".$r['use_sig'].", ".$r['use_emo'].", '".$r['ip_address']."', ".$r['post_date'].", 0, '".$r['post']."', ".$r['queued'].", ".$new_topic_id.", ".$new_forum_id.", '', 0, '', '', '', '".$r['new_topic']."', '', 0, 0)";

	// Миграция постов
	if(DO_MODE == 1){$DB->query($query);			echo(". ");}
	elseif(DO_MODE == 2){echo($new_post_pid.", ");}
	else{echo(str_replace("<","<",$query)."<br><br>");}
}
if($bad_topics == TRUE)echo("<hr>Бэд Топики!!<hr>!");

return true;
}

function recovery_bad_topics() {
global $DB, $ibforums, $root_path, $std, $INFO;
$DB->query( "SELECT max(tid) as mtid FROM ibf_topics" );
$out = $DB->fetch_row();
$query = "";
$querys = "";
$previous_tid = 0;
$replies = 0;
$DB->query( "SELECT * FROM ibf_posts where topic_id > ".$out['mtid']." ORDER BY topic_id ASC, pid ASC" );
if ( $DB->get_num_rows() )
{
	echo("Восстанавливаем поврежденные топики:<br>");
	while ( $r = $DB->fetch_row() )
	{
		$replies++;
		if($previous_tid != intval($r['topic_id']))
		{
			$replies = $replies - 1;
			$query = str_replace("число_ответов",$replies,$query);$replies = 0;

			if($replies == 0)$query = str_replace("ID_последнего_постера",$next_author_id,$query);
			else $query = str_replace("ID_последнего_постера",$r['author_id'],$query);

			if($replies == 0)$query = str_replace("дата_последнего_поста",$next_post_date,$query);
			else $query = str_replace("дата_последнего_поста",$r['post_date'],$query);

			if($replies == 0)$query = str_replace("имя_последнего",$next_author_name,$query);
			else $query = str_replace("имя_последнего",$r['author_name'],$query);

			$querys .= $query;
			$author_id = $r['author_id'];
			$post_date = $r['post_date'];
			$author_name = $r['author_name'];

			$query = "INSERT INTO `ibf_topics` VALUES ('".$r['topic_id']."', '".$std->get_date( $r['post_date'], 'LONG' )."', '', 'open', число_ответов, '".$r['author_id']."', '".$r['post_date']."', ID_последнего_постера, дата_последнего_поста, 0, '".$r['author_name']."', 'имя_последнего', '0', 0, 0, 2, 1, 1, 0, '', '', 0, 0, '', '')<br><br>";
		}
		$query_end = "INSERT INTO `ibf_topics` VALUES ('".$r['topic_id']."', '".$std->get_date( $r['post_date'], 'LONG' )."', '', 'open', число_ответов, ID_первого_постера, 		дата_старта, 		ID_последнего_постера, дата_последнего_поста, 0, 'имя_первого', 		  'имя_последнего', '0', 0, 0, 2, 1, 1, 0, '', '', 0, 0, '', '')";

		$previous_tid = intval($r['topic_id']);
		$next_author_id = $r['author_id'];
		$next_post_date = $r['post_date'];
		$next_author_name = $r['author_name'];
	}
	$query_end = str_replace("число_ответов",$replies,$query_end);
	$query_end = str_replace("ID_первого_постера",$author_id,$query_end);
	$query_end = str_replace("дата_старта",$post_date,$query_end);
	$query_end = str_replace("ID_последнего_постера",$next_author_id,$query_end);
	$query_end = str_replace("дата_последнего_поста",$next_post_date,$query_end);
	$query_end = str_replace("имя_первого",$author_name,$query_end);
	$query_end = str_replace("имя_последнего",$next_author_name,$query_end);

	$querys .= $query_end;

	$querys = explode("<br><br>", $querys);
	$counter = 0;
	foreach($querys AS $query)
	{
		$counter++;
		if(DO_MODE == 1){$DB->query($query);			echo(". ");}
		else{echo($query.";<br><br>");}
	}
	return $counter;
}
else
{
	return 0;
}
}


function do_attach() {
global $DB, $ibforums, $root_path, $std, $INFO;
echo("Миграция аттачей:<br>");

// Собираем инфу об аттаче не-картинок
$attach_query = $DB->query("SELECT a.* , p.pid, p.post FROM ibf2_attachments a LEFT JOIN ibf2_posts p ON ( a.attach_post_key = p.post_key ) WHERE attach_is_image = '0' ORDER BY p.pid");	// Запрос аттачей не-картинок
$attach_key = "";
while ( $r = $DB->fetch_row($attach_query) )
{
	if($attach_key != $r['pid'])
	{
		// Непарные и первые аттачи не-картинок делаем аттачами со счетчиками:
		$query = "UPDATE ibf_posts SET attach_id = '".$r['attach_location']."', attach_hits = '".$r['attach_hits']."', attach_type = 'application/".$r['attach_ext']."', attach_file = '".$r['attach_file']."' WHERE pid = ".( intval($r['pid']) + intval(MAX_POSTS_ID) );
	}
	else
	{
		//---------------------------------------------------------
		//	Заменяем парный аттач файлом для скачивания по линку...
		//---------------------------------------------------------
		$file_path = $r['attach_location'];
		$file_path = explode("/", $file_path);
		$file_path = $file_path[0]."/";
		$old_file = "../uploads/".$r['attach_location'];
		$new_file = "../uploads/".$file_path.$r['attach_file'];
		if(file_exists($old_file))
		{
			if(file_exists($new_file) and DO_MODE == 1)unlink($new_file);
			//	... и добавляем линк на скачивание вторичного аттача
			$new_post_entry = $r['post']."<br><br><strong><span class='edit'>Присоединенный файл:</span></strong><br><a href='".UPLOADS_URL."/uploads/".$file_path.$r['attach_file']."' title='Скачать файл' target='_blank'><img src='html/mime_types/zip.gif' width=16 height=16 border=0> ".$r['attach_file']."</a>";
			$new_post_entry = safesql($new_post_entry);
			if(DO_MODE == 1)
			{
				copy($old_file, $new_file);
				unlink($old_file);
			}
			else
			{
				$new_post_entry = str_replace("<","<",$new_post_entry);
				echo("Файл <b>".$old_file."</b> перемещен в <b>".$new_file."</b><br><br>");
			}
			$query = "UPDATE ibf_posts SET post = '".$new_post_entry."' WHERE pid = ".( intval($r['pid']) + intval(MAX_POSTS_ID) );
		}
		else
		{
			$query = "Не найден файл, прикрепленный к сообщению № ".$r['pid']." (<a href=\"../index.php?showtopic=0&view=findpost&p=".( intval($r['pid']) + intval(MAX_POSTS_ID) )."\" target=\"_blank\">посмотреть сообщение</a>)";
		}
	}
	$attach_key = $r['pid'];	// Ловим аттач нескольких не-картинок в один пост
	if(DO_MODE == 1){
		if( stristr($query, "Не найден файл, прикрепленный к сообщению № ") )
		{
			echo("<br>".$query."<br>");
		}
		else
		{
			$DB->query($query);
			echo(". ");
		}
	}
	else{echo($query.";<br><br>");}
}


// Собираем инфу об аттаче картинок
echo("<br>Аттачим картинки:<br><br>");
$attach_query = $DB->query("SELECT a.* , p.pid, p.post FROM ibf2_attachments a LEFT JOIN ibf2_posts p ON ( a.attach_post_key = p.post_key ) WHERE attach_is_image = '1' ORDER BY p.pid");	// Запрос аттачей не-картинок
$attach_key = "";
while ( $r = $DB->fetch_row($attach_query) )
{
	$new_post_entry = $r['post']."<br><br><strong><span class=''edit''>Присоединенное изображение:</span></strong><br><br><!--spoilerstart--><div class=''sp-wrap''><div class=''sp-head-wrap''><div class=''sp-head folded clickable''><b><u><img src=''".UPLOADS_URL."/uploads/".$r['attach_thumb_location']."'' alt=''Щелкните, чтобы развернуть полное изображение'' border=0></u></b></div></div><div class=''sp-body''><div class=''sp-content''><img src=''".UPLOADS_URL."/uploads/".$r['attach_location']."'' alt=''Полное изображение, размещенное пользователем'' border=0></div></div></div><!--spoilerstend-->";
	$new_post_entry = safesql($new_post_entry);
	if(DO_MODE != 1)$new_post_entry = str_replace("<","<",$new_post_entry);
	$query = "UPDATE ibf_posts SET post = '".$new_post_entry."' WHERE pid = ".( intval($r['pid']) + intval(MAX_POSTS_ID) );
	if(DO_MODE == 1){$DB->query($query);			echo(". ");}
	else{echo($query.";<br><br>");}
}

return true;
}


function do_users() {
global $DB, $ibforums, $root_path, $std, $INFO;
echo("Миграция пользователей:<br>");
$users_query = $DB->query("SELECT m.id as mid, m.name, m.mgroup, m.email, m.joined, m.ip_address, m.posts, m.allow_admin_mails, m.time_offset, m.hide_email, m.email_pm, m.email_full, m.warn_level, m.warn_lastwarn, m.language	last_post, m.restrict_post, m.view_sigs, m.view_img, m.view_avs, m.view_pop, m.bday_day, m.bday_month, m.bday_year, m.new_msg, m.msg_total, m.show_popup, m.misc, m.last_visit, m.last_activity, m.dst_in_use, m.view_prefs, m.coppa_user, m.mod_posts, m.auto_track, m.temp_ban, m.sub_end, m.login_anonymous, m.ignored_users, m.mgroup_others, m.org_perm_id, e.id as eid, e.notes, e.links, e.bio, e.ta_size, e.photo_type, e.photo_location, e.photo_dimensions, e.aim_name, e.icq_number, e.website, e.yahoo, e.interests, e.msnname, e.vdirs, e.location, e.signature, e.avatar_location, e.avatar_size, e.avatar_type, p.pp_main_photo, p.pp_main_width, p.pp_main_height, p.pp_thumb_photo FROM ibf2_members m LEFT JOIN ibf2_member_extra e ON ( m.id = e.id ) LEFT JOIN ibf2_profile_portal p ON ( m.id = p.pp_member_id )");	// Запрос инфы мемберов
while ( $r = $DB->fetch_row($users_query) )
{
	$r['name'] = safesql($r['name']);
	// Потянули аватары:
	if( stristr($r['avatar_location'], "av-".$r['mid']) and !preg_match( "/^http:\/\//", $r['avatar_location'] ) )	// Локальная аватарка
	{
		$old_file = "../archive_in/".$r['avatar_location'];
		$new_id = intval(MAX_MEMBER_ID) + intval($r['mid']);
		$new_file = "../uploads/".str_replace($r['mid'],$new_id,$r['avatar_location']);
		if(file_exists($old_file))
		{
			if(DO_MODE == 1)
			{
				copy($old_file, $new_file);
				unlink($old_file);
			}
		}
		else
		{
			echo("<br>Не найден файл аватарки пользователя <b>".$r['name']."</b><br>");
		}
	$r['avatar_location'] = str_replace($r['mid'], $new_id, $r['avatar_location']);
	}

	$r['notes'] = safesql($r['notes']);
	$r['links'] = safesql($r['links']);
	$r['bio'] = safesql($r['bio']);
	$r['signature'] = safesql($r['signature']);
	$r['website'] = safesql($r['website']);
	// Если личные фото в аплоадсах/профиле:
	if( stristr($r['pp_main_photo'], "profile/photo-".$r['mid']) and !preg_match( "/^http:\/\//", $r['pp_main_photo'] ) )
	{
		$photo_type = "upload";
		$photo_location = $r['pp_main_photo'];
		$photo_dimensions = $r['pp_main_width']."x".$r['pp_main_height'];
		if(file_exists( "../uploads/profile/photo-thumb-".$r['mid'].".jpg" ) and DO_MODE == 1)unlink("../uploads/profile/photo-thumb-".$r['mid'].".jpg");
	}
	else
	{
		$photo_type = "";
		$photo_location = "";
		$photo_dimensions = "";
	}

	// Если личные фото были в корне аплоадсов и попали в archive_in:
	$test_uploads_photo = "beginstring".$r['pp_main_photo'];
	if( stristr($test_uploads_photo, "beginstringphoto-".$r['mid']) and !stristr($r['pp_main_photo'], "http://") )
	{
		$old_file = "../archive_in/".$r['pp_main_photo'];
		$old_file_t = "../archive_in/".$r['pp_thumb_photo'];
		$new_id = intval(MAX_MEMBER_ID) + intval($r['mid']);
		$new_file = "../uploads/".str_replace($r['mid'],$new_id,$r['pp_main_photo']);
		copy($old_file, $new_file);
		unlink($old_file);
		unlink($old_file_t);
	}
	if($r['temp_ban'] == "0" or $r['temp_ban'] == 0)$r['temp_ban'] = "";
	$new_member_id = intval(MAX_MEMBER_ID) + intval($r['mid']);
	$query_m = "INSERT INTO ibf_members VALUES (".$new_member_id.", '".$r['name']."', 3, 'password', '".$r['email']."', ".$r['joined'].", '".$r['ip_address']."', '".$r['avatar_location']."', '".$r['avatar_size']."', '".$r['posts']."', '".$r['aim_name']."', '".$r['icq_number']."', '".$r['location']."', '".$r['signature']."', '".$r['website']."', '".$r['yahoo']."', '".$r['title']."', '".$r['allow_admin_mails']."', '".$r['time_offset']."', '".$r['interests']."', '".$r['hide_email']."', '".$r['email_pm']."', '".$r['email_full']."', 1, '".$r['warn_level']."', '".$r['warn_lastwarn']."', '2', '".$r['msnname']."', '".$r['last_post']."', '".$r['restrict_post']."', '".$r['view_sigs']."', '".$r['view_img']."', '".$r['view_avs']."', '".$r['view_pop']."', '".$r['bday_day']."', '".$r['bday_month']."', '".$r['bday_year']."', '".$r['new_msg']."', '', '', '".$r['msg_total']."', '".$r['vdirs']."', '".$r['show_popup']."', '".$r['misc']."', '".$r['last_visit']."', '".$r['last_activity']."', '".$r['dst_in_use']."', '".$r['view_prefs']."', '".$r['coppa_user']."', '".$r['mod_posts']."', '".$r['auto_track']."', '', 0, '', '".$r['temp_ban']."', '".$r['sub_end']."', 0, 0, 1, 0, 0, 0, '0', '', '', 0, 1, 1, 'black', 60, 1, 100, 1, 1, 1, '', '0', 0, 0)";
	$query_e = "INSERT INTO ibf_member_extra VALUES (".$new_member_id.", '".$r['notes']."', '".$r['links']."', '".$r['bio']."', '".$r['ta_size']."', '".$photo_type."', '".$photo_location."', '".$photo_dimensions."', '', '', '', '-1&-1', 0, 0, 0, '', 1, 1, 1, 0, 0, 0, 1, 1, 500, 500, 0, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, '', '', 1)";

	if(DO_MODE == 1){$DB->query($query_m);			echo(". ");}
	elseif(DO_MODE == 2){echo($new_member_id.", ");}
	else{echo(str_replace("<","<",$query_m)."<br><br>");}
	if(DO_MODE == 1){$DB->query($query_e);			echo(". ");}
	elseif(DO_MODE == 2){;}
	else{echo(str_replace("<","<",$query_e)."<br><br><br>");}
}
return true;
}

function do_users_pass() {
global $DB, $ibforums, $root_path, $std, $INFO;
echo("Миграция паролей пользователей:<br>");
$pass_query = $DB->query("SELECT c.converge_id, c.converge_id, c.converge_pass_hash, c.converge_pass_salt, m.id, m.name FROM ibf2_members_converge c LEFT JOIN ibf2_members m ON (c.converge_id=m.id)");	// Запрос паролей мемберов
while ( $r = $DB->fetch_row($pass_query) )
{
	$r['converge_pass_hash'] = safesql($r['converge_pass_hash']);
	$r['converge_pass_salt'] = safesql($r['converge_pass_salt']);
	$new_member_id = intval($r['converge_id']) + intval(MAX_MEMBER_ID);
	$query = "INSERT INTO ibf_members_incoming VALUES (".$new_member_id.", '".$r['converge_pass_hash']."', '".$r['converge_pass_salt']."', '".$r['name']."')";
	if(DO_MODE == 1){$DB->query($query);			echo(". ");}
	elseif(DO_MODE == 2){echo($new_member_id.", ");}
	else{echo($query.";<br><br>");}
}
return true;
}

function do_pm() {
global $DB, $ibforums, $root_path, $std, $INFO;
echo("Миграция личных сообщений пользователей:<br>");
$pm_query = $DB->query("SELECT m.*, t.* FROM ibf2_message_topics m LEFT JOIN ibf2_message_text t ON (m.mt_msg_id=t.msg_id)");
while ( $r = $DB->fetch_row($pm_query) )
{
	$r['msg_post'] = safesql($r['msg_post']);
	$r['mt_title'] = safesql($r['mt_title']);
	$messafe_id = intval($r['mt_id']) + intval(MAX_PM_ID);
	$query = "INSERT INTO ibf_messages VALUES (".$messafe_id.", '".$r['mt_date']."', '".$r['mt_read']."', '".$r['mt_title']."', '".$r['msg_post']."', '".( intval($r['mt_from_id']) + intval(MAX_MEMBER_ID) )."', '".$r['mt_vid_folder']."', '".( intval($r['mt_owner_id']) + intval(MAX_MEMBER_ID) )."', '".( intval($r['mt_to_id']) + intval(MAX_MEMBER_ID) )."', '', '', '', '".$r['mt_tracking']."', '".$r['mt_user_read']."');";
	if(DO_MODE == 1){$DB->query($query);			echo(". ");}
	elseif(DO_MODE == 2){echo($messafe_id.", ");}
	else{echo(str_replace("<","<",$query)."<br><br>");}
}

return true;
}


function do_stats() {
global $DB, $ibforums, $root_path, $std, $INFO;
echo("Обновляем статистику реципиента:<br>");
$DB->query( "SELECT count( tid ) AS mid FROM ibf_topics" );
$out = $DB->fetch_row();
define('TOTAL_TOPICS',  $out['pid']);	// Чисто топиков

$DB->query( "SELECT count(pid ) AS pid FROM ibf_posts" );
$out = $DB->fetch_row();
define('TOTAL_REPLIES',  intval($out['pid']) - intval(TOTAL_TOPICS) );	// Чисто ответов

$DB->query( "SELECT id, name FROM ibf_members ORDER BY id DESC LIMIT 0,1" );
$out = $DB->fetch_row();
define('LAST_MEM_NAME',  $out['name']);	// Имя последней регистрации
define('LAST_MEM_ID',  $out['id']);	// ID последней регистрации

$DB->query( "SELECT count(id) AS mid FROM ibf_members" );
$out = $DB->fetch_row();
define('MEM_COUNT',  $out['mid']);	// Чисто топиков

$query = "UPDATE ibf_stats SET TOTAL_REPLIES = '".TOTAL_REPLIES."', TOTAL_TOPICS = '".TOTAL_TOPICS."', LAST_MEM_NAME = '".LAST_MEM_NAME."', LAST_MEM_ID = '".LAST_MEM_ID."', MOST_DATE = '".time()."', MOST_COUNT = '0', MEM_COUNT = '".MEM_COUNT."' LIMIT 1";
if(DO_MODE == 1){$DB->query($query);			echo("<br>Обновили.");}
else{echo(str_replace("<","<",$query)."<br><br>");}
return true;
}

function safesql($txt){
$txt = str_replace("\'", "\ '", $txt);
$txt = str_replace("'", "''", $txt);
$txt .= " ";
return $txt;
}

?>

 

 

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

Ссылка на комментарий
Поделиться на других сайтах

  • 5 месяцев спустя...

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.