Grammy
Проверенные
- Сообщения
- 43
- Реакции
- 29
- Баллы
- 3,320
ИХМО, лишним не будет :-)
PHP:
<?php
$db_host = 'localhost';
$db_name = 'имя_базы';
$db_username = 'юзер';
$db_password = 'пароль';
$conn = new mysqli($db_host, $db_username, $db_password, $db_name);
if ($conn->connect_error) {
die("Ошибка: не удается подключиться: " . $conn->connect_error);
}
echo 'Подключение к базе данных.<br>';
$conn->set_charset("utf8");
//исходя из количества постов в базе
$id_now = 156000;
$results = $conn->query("SELECT post_id, message FROM xf_post_now WHERE post_id<'$id_now'");
// print '<table border="1">';
while($row = $results->fetch_assoc())
{
//print '<tr>';
// print '<td>'.$row["post_id"].'</td>';
// print '<td>'.$row["username"].'</td>';
$txt = $row["message"];
$txt_new = str_replace( "<strong>", "[B]", $txt );
$txt_new = str_replace( "</strong>", "[/B]", $txt_new );
$txt_new = str_replace( '<blockquote class="blockquote"><p><span class="titlequote">', "", $txt_new );
$txt_new = str_replace( '<div class="block_quote"><span class="block_titlequote">', "", $txt_new );
$txt_new = str_replace( '</span><span class="textquote">', "[QUOTE]", $txt_new );
$txt_new = str_replace( '</span><span class="block_textquote">', "[QUOTE]", $txt_new );
$txt_new = str_replace( '</span></p></blockquote><!--quote -->', "[/QUOTE]", $txt_new );
$txt_new = str_replace( '</span></div><!--quote --><br /><br />', "[/QUOTE]", $txt_new );
$txt_new = str_replace( '</span></div><!--quote -->', "[/QUOTE]", $txt_new );
$txt_new = str_replace( "<!--br--><br />", "\n", $txt_new );
$txt_new = str_replace( "<i>", "[I]", $txt_new );
$txt_new = str_replace( "</i>", "[/I]", $txt_new );
$txt_new = str_replace( "<s>", "[S]", $txt_new );
$txt_new = str_replace( "</s>", "[/S]", $txt_new );
$txt_new = str_replace( "<br />", "\n", $txt_new );
$txt_new = str_replace( '/undefined', "", $txt_new );
$txt_new = str_replace( '"', '"', $txt_new );
$re = '/<img id=\'smiles_img\' src=\'.TEMPLATE..bbcode.smiles.....gif\'..>/ui';
$txt_new = preg_replace($re, "", $txt_new);
$re = '/<img class=\'.+\' src=\'.+\/>/ui';
$txt_new = preg_replace($re, "", $txt_new);
$re = '/.color=................./ui';
$txt_new = preg_replace($re, "", $txt_new);
$re = '/..color:........./ui';
$txt_new = preg_replace($re, "", $txt_new);
$re = '/<object width="..." height="..."><param name="....." value="https:..youtube.com.v./ui';
$txt_new = preg_replace($re, "[MEDIA=youtube]", $txt_new);
$re = '/<embed.+<\/embed>/ui';
$txt_new = preg_replace($re, "", $txt_new);
$re = '/\?fs=1"><.+<\/object>/ui';
$txt_new = preg_replace($re, "[/MEDIA]", $txt_new);
$re = '/<iframe.+\/\/youtube.com\/embed\//ui';
$txt_new = preg_replace($re, "[MEDIA=youtube]", $txt_new);
$re = '/" frameborder=.+<\/iframe>/ui';
$txt_new = preg_replace($re, "[/MEDIA]", $txt_new);
$re = '/<a href=".+<\/a>/ui';
$txt_new = preg_replace($re, "", $txt_new);
$re = '/<div class="block_quote"><span class="block_titlequote" data-pid="[0-9]{4,7}">/ui';
$txt_new = preg_replace($re, "", $txt_new);
$re = '/\(<a href=".+<\/a>\)/ui';
$txt_new = preg_replace($re, "", $txt_new);
$re = '/<blockquote class="blockspoiler">.+;">/ui';
$txt_new = preg_replace($re, "", $txt_new);
$re = '/<\/a><\/span>.+class="textspoiler">/ui';
$txt_new = preg_replace($re, "\n", $txt_new);
$re = '/<blockquote class="blockspoiler"><span class="titlespoiler"><a.+return false;">/ui';
$txt_new = preg_replace($re, "", $txt_new);
$re = '/<\/a><\/span><div.+class="textspoiler">/ui';
$txt_new = preg_replace($re, "\n", $txt_new);
$re = '/\[attachment=[0-9]{2,6}\]/ui';
$txt_new = preg_replace($re, "\n", $txt_new);
$txt_new = str_replace( '</div></blockquote><!--spoiler -->', "", $txt_new );
$post_id = $row["post_id"];
//$update_query = $conn->query("UPDATE 'xf_post' SET 'message' = '$txt_new' WHERE 'post_id' = '$post_id'");
$statement = $conn->prepare("UPDATE xf_post_now SET message=? WHERE post_id=?");
//bind parameters for markers, where (s = string, i = integer, d = double, b = blob)
$statement->bind_param('si', $txt_new, $post_id);
$resultat = $statement->execute();
if($results){
print 'Success! record updated<br>';
}else{
print 'Error : ('. $mysqli->errno .') '. $mysqli->error;
}
//$update_query->close();
//print '<td>'.$txt_new.'</td>';
//print '<td>'.$row["message_state"].'</td>';
//print $row["post_id"].'<br>';
}
//print '</table>';
echo "Количество строк: $results->num_rows";
$results->close();
$conn->close();
?>
Мы раза три запускали, потому что оказались следы двух или трёх форумов и разных модификаций :)
Запускали скрипт на тестовом форуме, добавляли регулярки, пока не отладили, вроде не было больше проблем.
Затем уже на рабочем.
Продублирую из лички.
Для полноты картины, последовательности действий.
Поставил новый форум в папке /forum2, с новой базой.
До этого - уже подкидывал через SMF и затем штатным конвертером Xen те же таблицы, и видно было - что нужно для функционирования.
Сохранял в формате CSV. Именно чтобы вручную переносить. Было бы больше знаний -можно было и запросом к базе, но я не был уверен в себе :)
Сначала экспорт в этом формате, с заголовками, затем импорт в целевую таблицу. Я на всякий случай сначала дублировал целевую таблицу, чистую, без данных - если что пойдёт не так - чтобы можно было откатиться без проблем, и повторить.
При импорте - сопоставлял по названиям полей, многие как ни странно были даже на тех же местах.
Ну id и user_id , даты первого поста, редактирования, и так далее.
Очерёдность - сначала юзеров перенёс, обновил кеши, посмотрел их статистику - соответствует тому, что на старом.
Затем ноды и треды. Вроде сначала йоды, но не принципиально имхо - обновлял кеши после этого сдвоенного импорта.
Затем уже посты. Их просто много было, но собственно работа с полями заняла не больше времени.
Снова обновил кеши.
А, ещё момент!
У меня был глюк, с очерёдностью категорий-разделов!
Ранее , поскольку несколько раз переезжал и темы перекидывал туда-сюда, и создавал разные подразделы - была путаница в разделах, их было восемь с номерами от 1 до 26. Так не подхватились!
Создал в админке пустые разделы , 26 штук, а затем уже лишние убрал. Явно можно проще, но я не знал как :)
И ещё. НЕ сразу вспомнил - xf_user_authenticate - тоже пришлось вручную тащить. Первый раз, когда через SMF конвертировал - этого было не нужно почему-то. Вручную - по той же схеме перебросил, и юзеры появились в полном объёме.
Вроде ни одного поста не потерял.
На тестовом форуме сначала были потери в числе тем и сообщений, я решил, что лучше переделаю :)
Это основное в переносе.
Затем скриптом прошлись - убрали старые смайлики с PhpBBи так далее, BBкоды старые и прочее.
Смайлики - <img id=‘smiles_img’ src=‘{TEMPLATE}/bbcode/smiles/002.gif’ />
Сын делал из дома, я сам скрипт ещё не разбирал.
Но явно запросы делал скриптом, скрипт просто в директории сайта запускал. Пришлось увеличивать память и время исполнения в php.ini - тяжёлый скрипт, таблица постов 187мб, 127тыс строк.
Примерно так :)
Скрипт приложил выше, под спойлером.