За последние 24 часа нас посетили 60124 программиста и 1744 робота. Сейчас ищут 1116 программистов ...

Счетчик комментариев

Тема в разделе "PHP для новичков", создана пользователем painless, 18 апр 2007.

  1. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Мде...

    1). Зачем отдельную таблицу?
    Есть таблица новостей, есть таблица коментов.
    [sql]
    CREATE TABLE news (
    nws_id int(11) unsigned NOT NULL auto_increment,
    nws_text text NOT NULL,
    nws_added datetime NOT NULL,
    nws_heading varchar(100) default NULL
    nws_comments int(11) default '0',
    PRIMARY KEY (nws_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    CREATE TABLE news_comments (
    nec_id int(11) unsigned NOT NULL auto_increment,
    nec_nws_id int(11) unsigned NOT NULL,
    nec_prf_id int(11) unsigned NOT NULL,
    nec_msg text NOT NULL,
    nec_creation_date datetime NOT NULL,
    PRIMARY KEY (nec_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    [/sql]
    При добавлении комента вам надо сделать такой запрос:
    PHP:
    1. <?php
    2. mysql_query('UPDATE news SET nws_comments = (SELECT COUNT(*) FROM news_comments WHERE nec_nws_id = '.(int)$news_id.') WHERE nws_id = '.(int)$news_id, $db);
    3. ?>
    В итоге при показе новости вам нужно делать выборку только из news, что бы показать кол-во коментариев к данной новости, а коменты как правило выводятся на отдельной странице обычно, поэтому это самый правильный и эффективный вариант. Накладываем нужные индексы на таблицы и вообще всё зашибись будет.
    И статистику тоже можно всякую вывести. В таблице комментов nec_prf_id есть id пользователя, запостившего коммент. Можно легко построить остальные запросы, типа сколько каждый из пользователей запостил комментов (как счётчик сообщений на форуме), можно по дням сделать статистику и.т.д. Просто, удобно, понятно и быстро.
     
  2. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Psih
    угу, так тоже нормально... только ты как и я в задачу не врубился =) о новостях с коментами тут речь не идёт, всё гараздо проще.
     
  3. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    xak2

    ну попробуй.
    типичный структура таблицы:
    id
    nick - примерно 10 символов
    text - римерно 150 символов
    time - 10 символов.

    число записей - миллион.

    и сравни..
    $r = mysql_query("select * from table");
    $c = mysql_num_rows($r);

    и
    $r = mysql_query("select count(*) from table");
    echo join('',mysql_fetch_row($r));

    и еще не забудь, что перельешь от mysql к php 170 000 000 символов.
    и тут очень немаленькая вероятность, что он тебя просто пошлет сославшись на memory_limit
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Hight
    Главное идея и хороший пример. А упростить его уже много проще.
    Между прочим речь идёт какраз о новостях. Просто тот шаблон, что он запостил - это коменты к новостям. Покрайней мере я так это понял.
     
  5. ZZZubec

    ZZZubec Активный пользователь

    С нами с:
    28 мар 2007
    Сообщения:
    140
    Симпатии:
    0
    гы, ничего себе куда вы уехали?
    а добавить столбец первым id и сказать что значения типа int и включить уникальность, а?

    бугага, я в шоке. Зачем так глубоко ковырять? Когда у человека созданная его же руками таблица, её структуру он может поменять в любое время.
     
  6. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    ZZZubec

    гы, и как ты из него количество комментов узнаешь?:)
     
  7. ZZZubec

    ZZZubec Активный пользователь

    С нами с:
    28 мар 2007
    Сообщения:
    140
    Симпатии:
    0
    ниха глюкануло, я почему то решил что нужен уникальный номер для каждой выведенной записи...

    тыды да, шаман прав.
     
  8. painless

    painless Активный пользователь

    С нами с:
    26 мар 2007
    Сообщения:
    39
    Симпатии:
    0

    действительно, все заработало. спасибо большое!

    но есть 2 нюанса, которые меня беспокоят:

    1. человек добавил коммент, и если после этого refresh'ит страницу, то выскакивает 'the page cannot be refreshed without sending the information...". после этого коммент добавляется по новой. этого можно как-то избежать?

    2. как проверить поле comment на наличие текста? на данный момент можно добавлять пустые комменты, только с именем.
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    1. после добавления через header('Location:xxx') обновить страницу
    2. наверное if(strlen($_POST['comment'])<50) { // ошибка! коммент не может содержать менее 50 символов.
    идеология понятна? рыщим по форуму - неоднократно встречалось
     
  10. newnoob

    newnoob Активный пользователь

    С нами с:
    8 авг 2006
    Сообщения:
    151
    Симпатии:
    0
    У меня для новостей так:

    Код (Text):
    1. list($comnum) = $db->sql_fetchrow($db->sql_query("SELECT Count(*) FROM ".$prefix."_comment WHERE cid = '$pid'"));
    P.S. Разумееться класс для работы с бд поэтому заменить если что на обычные mysql_query :)