Помощь Проблема с тегами

Тема в разделе "DLE", создана пользователем Tadasi, 24 окт 2009.

Информация :
Актуальная версия DataLife Engine 11.2
( Final Release v.11.2 | Скачать DataLife Engine | Скачать 11.2 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 11.1 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Статус темы:
Закрыта.
Модераторы: killoff
  1. Tadasi

    Tadasi Постоялец

    Регистр.:
    6 май 2008
    Сообщения:
    145
    Симпатии:
    6
    Случайно в phpMyAdmin удалил все данные из таблицы "dle_tags" и теперь в новостях не работают теги. Как можно пересобрать информацию о тегах новостей назат в таблицу "dle_tags"?

    У меня есть скрипт, который обнавляет alt_name, keywords и description, вот:

    <?php


    set_time_limit( 0 );
    @ini_set ('memory_limit', "512M");
    define ( "DATALIFEENGINE", true );
    define ( "ROOT_DIR", dirname ( __FILE__ ));
    define ( "ENGINE_DIR", ROOT_DIR . "/engine/" );

    require_once ROOT_DIR . '/engine/classes/mysql.php';
    require_once ROOT_DIR . '/engine/data/config.php';
    require_once ROOT_DIR . '/engine/data/dbconfig.php';
    require_once ROOT_DIR . '/engine/inc/functions.inc.php';

    $sql_result = $db->query ( "SELECT * FROM " . PREFIX . "_post ORDER BY date DESC LIMIT 100000" );

    $num = '0';
    while ( $row = $db->get_row ( $sql_result ))
    {
    $alt_name = totranslit( $row['title'], true, false );
    $metatags = create_metatags( $row['short_story'] . $row['full_story'] );

    $db->query ( "UPDATE " . PREFIX . "_post SET alt_name = '{$alt_name}', keywords='{$metatags['keywords']}', descr='{$metatags['description']}' WHERE id = '{$row['id']}'" );
    $num = $num + '1' . "||";
    echo $num;
    }
    die ('done');
    $db->free();

    ?>

    Думаю его можно как-то переделать для обновления информации по тегам... ?
     
  2. uNknownMark

    uNknownMark

    Регистр.:
    22 сен 2007
    Сообщения:
    393
    Симпатии:
    169
    На вскидку как то так, писалось на коленке возможно есть ошибки, но общая идея думаю понятна:
    PHP:
    <?php
    set_time_limit
    );
    @
    ini_set ('memory_limit'"512M");
    define "DATALIFEENGINE"true );
    define "ROOT_DIR"dirname __FILE__ ));
    define "ENGINE_DIR"ROOT_DIR "/engine/" );
    require_once 
    ROOT_DIR '/engine/classes/mysql.php';
    require_once 
    ROOT_DIR '/engine/data/config.php';
    require_once 
    ROOT_DIR '/engine/data/dbconfig.php';
    require_once 
    ROOT_DIR '/engine/inc/functions.inc.php';
    $sql_result $db->query "SELECT * FROM " PREFIX "_post ORDER BY date DESC LIMIT 100000" );
    $num '0';
    while ( 
    $row $db->get_row $sql_result )) {
    $tags $row['tags'];
    $tags explode(',',$tags);
    $id $row['id'];
    $iQn count($tags)-1;
    foreach (
    $tags as $iKey=>$tag) {
        
    $sSqlAdd .= "('', $id$tag)";
        if (
    $iKey<=$iQn$sSqlAdd.=', ';
        else 
    $sSqlAdd.=' ';
    }
    $db->query "INSERT INTO " PREFIX "_tags ( `id` , `news_id` , `tag` ) VALUES ".$sSqlAdd );
    $num $num '1' "||";
    echo 
    $num;
    }
    die (
    'done');
    $db->free();
    ?> 
     
  3. Tadasi

    Tadasi Постоялец

    Регистр.:
    6 май 2008
    Сообщения:
    145
    Симпатии:
    6
    Немного не работает, но дамаю мы на верном пути. Вот я немного его доделал:

    PHP:
    <?php 
    set_time_limit
    ); 
    @
    ini_set ('memory_limit'"512M"); 
    define "DATALIFEENGINE"true ); 
    define "ROOT_DIR"dirname __FILE__ )); 
    define "ENGINE_DIR"ROOT_DIR "/engine/" ); 
    require_once 
    ROOT_DIR '/engine/classes/mysql.php'
    require_once 
    ROOT_DIR '/engine/data/config.php'
    require_once 
    ROOT_DIR '/engine/data/dbconfig.php'
    require_once 
    ROOT_DIR '/engine/inc/functions.inc.php'
    $sql_result $db->query "SELECT * FROM " PREFIX "_post ORDER BY date DESC LIMIT 100000" ); 
    $num '0'
    $numi '1'
    while ( 
    $row $db->get_row $sql_result )) { 
    $tags $row['tags']; 
    $tags explode(',',$tags); 
    $id $row['id']; 
    $iQn count($tags)-1
    foreach (
    $tags as $iKey=>$tag) { 
    $sSqlAdd "('".$numi."', '".$id."', '".$tag."')";
        if (
    $iKey<=$iQn$sSqlAdd.=', '
        else 
    $sSqlAdd.=' '

    $db->query "INSERT INTO " PREFIX "_tags ( `id` , `news_id` , `tag` ) VALUES ".$sSqlAdd); 
    $num $num '1' "||"
    $numi $num '1' "||"
    echo 
    $num

    die (
    'done'); 
    $db->free(); 
    ?>

    В таком коде скрипт работает и выдает правильные команды в мускул, вот:

    PHP:
    INSERT INTO dle_tags ( `id` , `news_id` , `tag` ) VALUES ('1''65665'' софт'), 
    Но из-за того, что в конце стоит запятая, а не точка с запятой, скрипт выдает ошибку:

    MySQL Error!
    ------------------------
    Что не так?

    И ещё не знаю почему, но в команде к базе
    почему-то перед самим тегом стоит пробел!?

    Добавлено через 10 минут
    Так, с пробелом в теге вроде разобрался:
    заменил строку
    на
     
  4. Tadasi

    Tadasi Постоялец

    Регистр.:
    6 май 2008
    Сообщения:
    145
    Симпатии:
    6
    После долгих эксперементов (я просто далековат ещё от знания пхп), пришёл к следующему коду:

    PHP:
    <?php 
    set_time_limit
    ); 
    @
    ini_set ('memory_limit'"512M"); 
    define "DATALIFEENGINE"true ); 
    define "ROOT_DIR"dirname __FILE__ )); 
    define "ENGINE_DIR"ROOT_DIR "/engine/" ); 
    require_once 
    ROOT_DIR '/engine/classes/mysql.php'
    require_once 
    ROOT_DIR '/engine/data/config.php'
    require_once 
    ROOT_DIR '/engine/data/dbconfig.php'
    require_once 
    ROOT_DIR '/engine/inc/functions.inc.php'
    $sql_result $db->query "SELECT * FROM " PREFIX "_post ORDER BY date" ); 
    $num '0'
    $numi '0'
    while ( 
    $row $db->get_row $sql_result )) { 
    $tags = array ();
    $tags $row['tags']; 
    $tags explode", "$tags );
    $id $row['id']; 
    $iQn count($tags)-1
    foreach (
    $tags as $iKey=>$tag) { 
    $sSqlAdd "('".$numi."', '".$id."', '".$tag."')";
        if (
    $iKey<=$iQn$sSqlAdd.=' ; '
        else 
    $sSqlAdd.=' '


    $db->query "INSERT INTO " PREFIX "_tags ( `id` , `news_id` , `tag` ) VALUES ".$sSqlAdd); 
    $numi $numi '1';
    $num $num '1' "||";  
    echo 
    $num

    die (
    'done'); 
    $db->free(); 
    ?>
    Скрипт работает, но не совсем: он записывает данные только об одном теге на каждую новость, т.е. если в новости более чем один тег - то скрипт неполноценен. Думаю там чтот со счётчиком количества тегов на новость, и похоже проблема кроется в этом месте кода:

    PHP:
    $iQn count($tags)-1
    foreach (
    $tags as $iKey=>$tag) { 
    $sSqlAdd "('".$numi."', '".$id."', '".$tag."')";
        if (
    $iKey<=$iQn$sSqlAdd.=' ; '
        else 
    $sSqlAdd.=' '
    Подскажите, что я не так делаю?
     
  5. Christmasnet

    Christmasnet

    Регистр.:
    20 окт 2008
    Сообщения:
    151
    Симпатии:
    54
    Восстанови из бэкапа таблицу dle_tags в phpmyadmin

    CREATE TABLE `dle_tags` (
    `id` int(11) NOT NULL auto_increment,
    `news_id` int(11) NOT NULL default '0',
    `tag` varchar(100) NOT NULL default '',
    PRIMARY KEY (`id`),
    KEY `news_id` (`news_id`),
    KEY `tag` (`tag`)
    ) ENGINE=MyISAM AUTO_INCREMENT=72578 /*!40101 DEFAULT CHARSET=cp1251 */;

    потом

    данные туда загони

    INSERT INTO `dle_tags` VALUES
    (18, 6, 'Posters'),
    (32, 5, 'photoshop'),
    (33, 5, 'template'),
    (31, 5, 'hitman'),
    (7, 4, 'old'),
    (8, 4, 'photo'),
    (9, 4, 'photoshop'),
    (10, 4, 'psd'),
    (11, 4, 'шаблоны'),
    (12, 4, 'графика');
     
  6. Tadasi

    Tadasi Постоялец

    Регистр.:
    6 май 2008
    Сообщения:
    145
    Симпатии:
    6
    Не, ну это понятно. если б была такая возможность - давно б уже сделал! А тут нет у меня бекапа...(

    так что вопрос остается открытым. Скрипт нужен полюбому!
     
Статус темы:
Закрыта.