Чем обработать mySQL базу?

Тема в разделе "Базы данных", создана пользователем trainer_ussr, 15 окт 2011.

Модераторы: latteo
  1. trainer_ussr

    trainer_ussr Создатель

    Регистр.:
    5 фев 2010
    Сообщения:
    48
    Симпатии:
    0
    Один выдающийся человек так отвратно залил описания товаров в mySQL, что вытаскиваются оттуда они вместе с html-тэгами, и, при выгрузке в xls преобразовываются в таблицы, вместо того, чтобы просто сидеть в ячейках. Пол-беды, если бы тэги были одинаковыми - в DreamViewer поставил на автозамену и ок.
    Вопрос таков: какую Вы знаете мощную софтинку, обрезающую html при экспорте? Что порекомендуете?
     
  2. jami

    jami Постоялец

    Регистр.:
    10 авг 2011
    Сообщения:
    114
    Симпатии:
    39
    Софт готовый вряд ли есть. Проще всего слить SQL-дамп базы/таблицы, обработать регекспом, который вырежет html-теги, залить дамп обратно. Либо обрабатывать скриптом (php, perl etc) построчно, апдейтя пачками описания без тегов. Для большого числа записей - с дампом будет быстрее.
     
  3. Soul :)

    Soul :) Постоялец

    Регистр.:
    22 мар 2007
    Сообщения:
    86
    Симпатии:
    9
    PHP:
    strip_tags
    Мускуль теги вырезать не умеет. И хоть там и есть регулярки, я бы ими не пользовался. А т.к. операция разовая - воспользовался бы функцией выше и написал простенький скрипт...
     
  4. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    Нашёл тут функцию аналог strip tags для mysql
    http://www.artfulsoftware.com/infotree/queries.php#567

    Остаётся в базе создать функцию, запустить скрипт
    Код:
    DROP FUNCTION IF EXISTS fnStripTags;
    DELIMITER |
    CREATE FUNCTION fnStripTags( Dirty VARCHAR(4000) )
    RETURNS VARCHAR(4000)
    DETERMINISTIC 
    BEGIN
      DECLARE iStart, iEnd, iLength INT;
      WHILE LOCATE( '<', Dirty ) > 0 AND LOCATE( '>', Dirty, LOCATE( '<', Dirty )) > 0 DO
        BEGIN
          SET iStart = LOCATE( '<', Dirty ), iEnd = LOCATE( '>', Dirty, LOCATE('<', Dirty ));
          SET iLength = ( iEnd - iStart) + 1;
          IF iLength > 0 THEN
            BEGIN
              SET Dirty = INSERT( Dirty, iStart, iLength, '');
            END;
          END IF;
        END;
      END WHILE;
      RETURN Dirty;
    END;
    |
    DELIMITER ; 
    
    И дальше можно пользоваться, например вытащить данные без тегов
    Код:
    SELECT aaa, fnStripTags(aaa) FROM aaa_table;
    
    или обновить поля
    Код:
    UPDATE aaa_table SET aaa=fnStripTags(aaa);
    
    перед использованием лучше сделать копию таблицы.
     
  5. Soul :)

    Soul :) Постоялец

    Регистр.:
    22 мар 2007
    Сообщения:
    86
    Симпатии:
    9
    Это некорректная функция. Все что она делает - удаляет любой текст между последовательными вхождениями знаков < и >.

    А это далеко не всегда могут быть хтмл-теги.

    Хоть и для бОльшей части она отработает верно.
     
  6. thoth777

    thoth777

    Регистр.:
    28 ноя 2008
    Сообщения:
    314
    Симпатии:
    98
    PHP:
    $res=mysq_query("select * from table");
    while (
    $out=mysql_fetch_assoc($res)){
    $out['поле']=strip_tags($out['поле']);

    есличоможно добавить addslashes:
    $out['поле']=addslashes(strip_tags($out['поле']));

    и сохраняем:
    mysql_query("update table set поле=\"".$out['поле']."\" where тут_пишем ключ по поторому определяется поле");
    }
    вместо звездочки в "select * from table" можно указать нужные поля, в т.ч. ключевое
    profit.
     
    p1kka нравится это.