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

После восстановления базы...


Вопрос

Восстановил БД форума, все хорошо, кроме одного: не отображаются рисунки ( смайлы ), которые были вставленны в сообщения, которые были на старом варианте форума :D То есть ссылка на старый адресс директории со смайлами, на другом хосте, который не работает. Вот пример:

http://ipb.ovl.ru/forum/index.php?act=ST&f...22&st=0#entry52

Вопрос: Можно ли поправить ссылки автоматом, или хотя бы руками?

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

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

  • 0

Borland_delphi_6

Руками можно всё. :D Лезешь в базу и в каждом <!--emo заменяешь путь.

Можно, в принципе, скрипт написать, чтоб всю базу перекапывал и заменял в смайлах пути на правильные. Но, боюсь, моего знания регулярных выражений для этого не хватит.

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

  • 0
Опишите плз все шаг за шагом, если можно написать простой скрипт, напишите plz!!!
Ссылка на комментарий
Поделиться на других сайтах

  • 0
Млин, ну неужели нет способа??? :D Руками не охота копаться, хочется php скрипт! ;)
Ссылка на комментарий
Поделиться на других сайтах

  • 0

<?php

require "./conf_global.php";

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

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

$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'];

$DB->connect();

$query = $DB->query("SELECT pid, post FROM ibf_posts WHERE 1");
while ($row = $DB->fetch_row($query))
{
$row['post'] = str_replace("forum.ipb.ish.biz/html", "ipb.ovl.ru/forum/html", $row['post']); //ну или какие там у тебя пути...
$DB->query("UPDATE ibf_posts SET post = '".$row['post']."' WHERE pid = '".$row['pid']."'");
}

$query = $DB->query("SELECT msg_id, message FROM ibf_messages WHERE 1");
while ($row = $DB->fetch_row($query))
{
$row['message'] = str_replace("forum.ipb.ish.biz/html", "ipb.ovl.ru/forum/html", $row['message']);
$DB->query("UPDATE ibf_messages SET message = '".$row['message']."' WHERE msg_id = '".$row['msg_id']."'");
}

$DB->close_db();

?>

Что-то в этом роде. Создай пхп-файл и пихай туда код, потом запусти через браузер. Затронет таблицы ibf_messages и ibf_posts. Сделай бэкап!

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

  • 0

Вот блин! Не работает: запускаю, выдает:

mySQL query error: UPDATE ibf_posts SET post = ' Этот форум доступен только после попадания в определенную группу пользователей, о чем Вы можете узнать в соответствующей теме. А пока:<br> <!--emo&:D--><img src='http://forum.ipb.ish.biz/html/emoticons/biggrin.gif' border='0' style='vertical-align:middle' alt='biggrin.gif'><!--endemo--> <!--emo&;)--><img src='http://forum.ipb.ish.biz/html/emoticons/biggrin.gif' border='0' style='vertical-align:middle' alt='biggrin.gif'><!--endemo--> <!--emo&:)--><img src='http://forum.ipb.ish.biz/html/emoticons/biggrin.gif' border='0' style='vertical-align:middle' alt='biggrin.gif'><!--endemo--> ПОЗДРАВЛЯЕМ <!--emo&:)--><img src='http://forum.ipb.ish.biz/html/emoticons/biggrin.gif' border='0' style='vertical-align:middle' alt='biggrin.gif'><!--endemo--> <!--emo&:)--><img src='http://forum.ipb.ish.biz/html/emoticons/biggrin.gif' border='0' style='vertical-align:middle' alt='biggrin.gif'><!--endemo--> <!--emo&;)--><img src='http://forum.ipb.ish.biz/html/emoticons/biggrin.gif' border='0' style='vertical-align:middle' alt='biggrin.gif'><!--endemo--> ' WHERE pid = '6'

Тестил на локалхосте, все пути прописал, WinXP, Apache.

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

  • 0
Люди, ну помогите плиз! Руками 500 сообщений реактировать не большая радость!
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Скрипт-то работает, но у него есть потенциальные проблемы. Первая - из-за нее и у меня не работало - какие кавычки используются для отделения данных в запросе SQL. Дело в том, что приведенный здесь скрипт использует для этого ' (одинарную кавычку), в то время как в базе, в коде отвечающем за урл к картинке этот же символ используется в тэге. Это приводит к ошибке в запросе. И получаем другую потенциальную проблему - если в посте использовались " (двойные кавычки), то это так же приведет к ошибке, хотя у меня эта проблема возникла только один раз. А вообще я думаю надо использовать несколько другой алгоритм правки, так как этот может привести и к нежелательным исправлениям (например в самих постах).

 

Исправляем код вот так:

 

<?php

require "./conf_global.php";

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

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

$SURL="members.lycos.co.uk/rhh4room"; //старый хост
$DURL="4room.ru"; //новый хост

$URLSuffix="/html/emoticons"; //Суффикс пути, по умолчанию

$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'];

$DB->connect();

$query = $DB->query("SELECT pid, post FROM ibf_posts WHERE 1");
while ($row = $DB->fetch_row($query))
{
$row['post'] = str_replace($SURL.$URLSuffix, $DURL.$URLSuffix, $row['post']);
if (strstr($row['post'], "'")) {
  $DB->query('UPDATE ibf_posts SET post = "'.$row['post'].'" WHERE pid = '.$row['pid']);
} else {
  $DB->query("UPDATE ibf_posts SET post = '".$row['post']."' WHERE pid = ".$row['pid']);
}
}
$query = $DB->query("SELECT msg_id, message FROM ibf_messages WHERE 1");
while ($row = $DB->fetch_row($query))
{
$row['message'] = str_replace($SURL.$URLSuffix, $DURL.$URLSuffix, $row['message']);
if (strstr($row['message'], "'")) {
  $DB->query('UPDATE ibf_messages SET message = "'.$row['message'].'" WHERE msg_id = '.$row['msg_id']);
} else {
  $DB->query("UPDATE ibf_messages SET message = '".$row['message']."' WHERE msg_id = ".$row['msg_id']);
}
}

$DB->close_db();

echo "Base updated"

?>

 

Теперь вроде работает даже нормально, но все же такой код может привести к нежелательным исправленям (прямо в посте) и возможно некоторые посты будут проигнорированы. Надо бы доработать. Если будет время и желание - займусь.

 

P.S. Спасибо автору за первоначальный код.

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

  • 0

Я чутка доделал - теперь никакие урлы писать не надо, все делается автоматом. Только по прежнему остался тупой способ определения кавычек (смотри в коде) - просто я только начинаю изучать PHP и не в курсе как это сделать. Есди знаете как - подскажите.

<?php

require "./conf_global.php";

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

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

$URL=$INFO['html_url']."/emoticons"; //путь к каталогу со смайлами

$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'];

$DB->connect();

class smile_fix {
var $emoticons      = "";

function convert_emoticon($code="", $image="") {
       global $URL;

       if (!$code or !$image) return;

    // Remove slashes added by preg_quote
    $code = stripslashes($code);

    return "<!--emo&$code--><img src='$URL/$image' border='0' style='vertical-align:middle' alt='$image'><!--endemo-->";
}

function smilie_length_sort($a, $b)
{
    if ( strlen($a['typed']) == strlen($b['typed']) )
    {
        return 0;
    }
    return ( strlen($a['typed']) > strlen($b['typed']) ) ? -1 : 1;
}

   function fix ($txt)
   {
       global $DB;
       $txt = preg_replace( "#<!--emo&(.+?)-->.+?<!--endemo-->#", "\\1" , $txt);
    $DB->query("SELECT typed, image from ibf_emoticons");
    $this->emoticons = array();
    if ( $DB->get_num_rows() )
    {
        while ( $r = $DB->fetch_row() )
        {
            $this->emoticons[] = array( 'typed'     => stripslashes($r['typed']),
                                        'image'     => stripslashes($r['image']),
                                        //'clickable' => $r['clickable'],
                                      );
        }
    }
    usort($this->emoticons, array( 'smile_fix', 'smilie_length_sort' ) );
    if ( count($this->emoticons) > 0 )
    {

        foreach($this->emoticons as $a_id => $row)
        {

            $code  = $row['typed'];
            $image = $row['image'];
            $code = preg_quote($code, "/");
            $txt = preg_replace( "!(?<=[^\w&;])$code(?=.\W|\W.|\W$)!ei", "\$this->convert_emoticon('$code', '$image')", $txt );
        }
  	 }
  	 return $txt;
   }
}

$fix = new smile_fix;

$query = $DB->query("SELECT pid, post FROM ibf_posts WHERE 1");
while ($row = $DB->fetch_row($query))
{
   $row['post'] = $fix->fix($row['post']);
//тупой способ определения кавычек
   if (strstr($row['post'], "'")) {
 $DB->query('UPDATE ibf_posts SET post = "'.$row['post'].'" WHERE pid = '.$row['pid']);
} else {
 $DB->query("UPDATE ibf_posts SET post = '".$row['post']."' WHERE pid = ".$row['pid']);
}
}
$query = $DB->query("SELECT msg_id, message FROM ibf_messages WHERE 1");
while ($row = $DB->fetch_row($query))
{
$row['message'] = $fix->fix($row['message']);
if (strstr($row['message'], "'")) {
 $DB->query('UPDATE ibf_messages SET message = "'.$row['message'].'" WHERE msg_id = '.$row['msg_id']);
} else {
 $DB->query("UPDATE ibf_messages SET message = '".$row['message']."' WHERE msg_id = ".$row['msg_id']);
}
}

$DB->close_db();

echo "Base updated"

?>

 

Да, бэкап делать ОБЯЗАТЕЛЬНО! Если база рухнет - я тут не при чем... :D

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

  • 0
d1pro, твой код тоько для маленьких баз :D Если же база большая и на рнр стоит ограничитель по времени исполнения, то скрипт прерывается ;)
Ссылка на комментарий
Поделиться на других сайтах

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

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

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

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

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

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

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

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

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