Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » MySQL » Ошибка при расчете количества комментариев

Ошибка при расчете количества комментариев


     14.09.2013    mysql    Все вопросы » MySQL    3696

вопрос
Привет! Большие сомнения, что мне поможет кто-нибудь, но все же.

Предыстория:
На днях получил слоновую дозу спама в комментариях. Их было так много, что я устал их удалять из админ панели и залез в phpmyadmin, где сделал нужную сортировку в таблице _comments и тупо удалил строки.

Но понял что я натворил только сейчас.
На почту стали приходить ошибки из google webmaster о большом количестве страниц с бесконечным 301 редиректом некоторых страниц на себя саму.

Путем тыка я нашел условие, при котором на определенных страницах вываливался 301. Это был comments.class.php .

Итак, что произошло:
Строки с комментариями я удалил, а вот записи в таблице _post в колонке comm_num (указывает количество комментариев для поста) я не изменил. Соответственно, в постах, где не было комментариев, по записи в comm_num их стало 1, но на деле такого комментария не существует.

Как можно решить данную ситуацию?

p.s.: Бэкап базы старый и его восстановление, как вариант, прошу не рассматривать.

Спасибо :).

Ответил: remont63


Как решить проблему с бесконечными редиректами и пернаправлениями.

Зайдите в админку скрипта, и на тех страницах где это возникает удалите все комментарии.

Сама проблема возникла у вас, при удалении коментов минуя сам скрипт.

Сами же записи во количестве комментарием находил в таблицах post и post_extras,
Одна из них выводит количество в короткой новости, вторая в полной.

4 комментария

kprod
Юзер

kprod - 14 сентября 2013 20:55 -

Так ты пользуйся не бэкапом свои, а бэкапом хостинга- если хостинг нормальный, то бэкап должен быть на каждый день за последние 30 дней. А вообще, если не жалко все новости где у тебя по 1 комментарию делай так:
UPDATE dle_post SET comm_num = REPLACE( comm_num, '(1)', '0' )

Nick
Юзер

Nick - 14 сентября 2013 21:28 -

Цитата: 24rgb
Так ты пользуйся не бэкапом свои, а бэкапом хостинга

Там выделенная машина в дата-центре.

Цитата: 24rgb
А вообще, если не жалко все новости где у тебя по 1 комментарию делай так:UPDATE dle_post SET comm_num = REPLACE( comm_num, '(1)', '0' )

А если у меня пост фактически содержит 100 комментариев, а в базе числятся 101?

Так как задача не терпела отлагательств, решал сам следующим образом (а вдруг пригодится кому):
1) На время раздумий закоментил условие, при котором вылетал 301 редирект.

2) Сделал простенький скрипт, который сравнивал значение в поле comm_num таблицы _post и количество записей в таблице _comments. Если значения разнились, записывались в поле количество записей из _comments.

<?php
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$dbname = "base";

@mysql_connect("$dbhost", "$dbuser", "$dbpass") or die("Ошибка MySQL");
@mysql_select_db("$dbname") or die("Ошибка MySQL");

$query = mysql_query("SELECT * FROM `dle_post` ORDER BY `id` ASC");
       if(@mysql_num_rows($query) > 0)
       {
          echo'кол-во записей — '. mysql_num_rows($query).'<br />';
          while($row = mysql_fetch_array($query))
          {
              $id_news = $row['id'];
                    $query_com = mysql_query("SELECT * FROM `dle_comments` WHERE post_id = '".$id_news."'");
                    $comm_count = mysql_num_rows($query_com);
                    echo $row['id'].' — '.$row['comm_num'].' ('.$comm_count.')<br />';
                    
                    if ($row['comm_num'] != $comm_count) {mysql_query("UPDATE dle_post SET comm_num = ".$comm_count." WHERE id = '".$id_news."'");}
          }
          }
?>

ПафНутиЙ
Админ

ПафНутиЙ - 15 сентября 2013 18:12 -

перестроение публикаций пробовали?

Каков вопрос - таков и ответ. Просто помните об этом.

Nick
Юзер

Nick - 15 сентября 2013 19:15 -

Цитата: ПафНутиЙ
перестроение публикаций пробовали?

Пробовал в мастере оптимизации использовать "пересчет статистики". Не помогло.

Перестроение публикаций делать не стал. Думаю, там просто новости прогоняются через parse.class, и внутренние теги, вывод которых был как-то изменен, записываются уже в новой форме.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх