sql-запрос для замены ссылок с определённым доменом

Тема в разделе "Базы данных", создана пользователем Lazy_bones, 24 ноя 2012.

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

    Lazy_bones

    Регистр.:
    11 дек 2008
    Сообщения:
    436
    Симпатии:
    106
    Подскажите пожалуйста возможно ли такое сделать. Нужно в базе изменить атрибут у внутренних ссылок. Адрес сайта site1.ru. Убрать rel="nofollow" у всех внутренних ссылок.
    К примеру:
    site1.ru/statia1.html rel="nofollow"
    site1.ru/statia2.html rel="nofollow"
    site1.ru/statia3.html rel="nofollow"
    site1.ru/statia4.html rel="nofollow"
    Должно получиться
    site1.ru/statia1.html
    site1.ru/statia2.html
    site1.ru/statia3.html
    site1.ru/statia4.html
    Но в новости есть также и ссылки на другие ресурсы, к примеру site2.ru site3.ru(ссылки на различные сторонние ресурсы, всегда различные), атрибут у этих ссылок должен остаться.

    Структура гиперссылки, вдруг нужно.
    Адрес сайта/Idновости-название в транслите.html
    Пример site1.ru/23525-novosti-mira.html

    Новостей в базе больше 140 тысяч
     
  2. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    можно сделать поиском и заменой по mysql
    нужны названия таблиц и полей где заменять

    Код:
    UPDATE `table` SET `fulltext`=REPLACE(`fulltext`,'html rel="nofollow"','html');
    только базу забекапь перед заменой
    а то мало ли что )))

    подозреваю что движёк DLE
    а в нём в инструментах есть удобная форма для поиска и замены, тогда особого смысла делать это через mysql нет
     
    Lazy_bones нравится это.
  3. t0wer

    t0wer BlackHerald

    Регистр.:
    24 июн 2008
    Сообщения:
    731
    Симпатии:
    421
    Может есть смысл сделать дамп базы, потом взять ее копию и редактором заменить все что нужно, а потом ее накатить на сайт.
    Если что-то сделаете не так, всегда можно дамп восстановить как есть. Когда мало опыта в скулях, лучше не экспериментировать и пойти по наименьшему сопротивлению.
    Да и проще будет.
     
    Lazy_bones нравится это.
  4. Leony

    Leony

    Регистр.:
    18 мар 2008
    Сообщения:
    153
    Симпатии:
    25
    В запросе o_nix не хватает WHERE имя_поля LIKE '%site1.ru/statia%'
     
    Lazy_bones нравится это.
  5. Lazy_bones

    Lazy_bones

    Регистр.:
    11 дек 2008
    Сообщения:
    436
    Симпатии:
    106
    o_nix, да Вы правы, это Dle. Вот названия таблицы и поля.
    таблица dle_post
    поле full_story
    но нужно, чтобы не затронуло ссылки на другие сайты, а только у одного поменять данный атрибут.

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

    Leony, да, нужен запрос именно касаемый одного сайта.

    Вот пример самой ссылки из базы <a href="http://site1.ru/291-hodyachie-mertvecy.html" rel="nofollow" >ходячие мертвецы</a>

    Помогите с конечным запросом. Бекап уже сделан
     
  6. Leony

    Leony

    Регистр.:
    18 мар 2008
    Сообщения:
    153
    Симпатии:
    25
    Код:
    UPDATE `dle_post` SET `full_story`=REPLACE(`full_story`,'html" rel="nofollow" ','html"') WHERE full_story LIKE "%site1.ru%"
     
    Lazy_bones нравится это.
  7. Lazy_bones

    Lazy_bones

    Регистр.:
    11 дек 2008
    Сообщения:
    436
    Симпатии:
    106
    Сделал бекап базы и залил на денвер. Попробовал выполнить данный запрос, он выполняется уже полтора часа (140 тысяч записей в таблице).
    В данной таблице есть также поле ID, которое имеет цифровое значаение, может можно как то ограничивать выполнение запроса этим параметром, к примеру брать для обработки часть базы с Id 1 до 10000 и так дальше по частям?

    Запрос выполнился, но выполнился он некорректно, т.е. он убрал атрибут rel="nofollow" у всех ссылок.
    В поле full_story хранится полный текст новости, каждая новость содержит несколько ссылок на различные сайты. Нужно чтобы убрала данный атрибут только у ссылок site1.ru у остальных ссылок в данном поле этот атрибут должен остаться. По данному же запросу он убрал атрибут полностью у всех ссылок, заканчивающихся на html
     
  8. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    так попробуй
    Код:
    UPDATE `dle_post` SET `full_story`=REPLACE(`full_story`,'html" rel="nofollow" ','html"') WHERE `full_story` LIKE (%site1.ru%)
    но проблему это не решит

    в каждой записи в котором будет содержаться site1.ru будут заменены все ссылки и site1.ru и site2.ru

    те поможет только если у тебя по 1 типу ссылок в каждом посте

    если не по одному то проще слить базу в файл и сделать замену по файлу регулярками (составив отдельную регулярку под каждый site1.ru), иначе никак
     
    Lazy_bones нравится это.
  9. Lazy_bones

    Lazy_bones

    Регистр.:
    11 дек 2008
    Сообщения:
    436
    Симпатии:
    106
    Эту проблему можно решить и через перестроение публикации, но проблема в том что оно будет длиться порядка 2 суток и нет возможности на такое время вырубить сайт, а если сайт оставить рабочим, то перестроение вылетает с ошибками рано или поздно. Если бы можно было осуществлять перестроение публикации не разом всех, а также указанный массив ID новостей и поэтапно это делать, но такого решения также не нашел.

    А в mysql нет возможности сделать что то подобного. Ищем <a href="http://site1.ru/*.*.html" rel="nofollow" > , где *.* постоянно меняющие значения и заменить на <a href="http://site1.ru/ *.* .html">. Там нет возможности применять регулярные выражения?
     
  10. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    в mysql regexp можно использовать только для select запросов

    ещё как вариант можно вообще не заморачиваться с заменой в базе

    можно на этапе вывода средствами php с помощью regexp подправлять нужные ссылки

    но мне вариант обработки дампа и его перезаливка кажется наиболее приемлимым