Ново/Старо [forum]

Styl3rbg

Registered
В момента довършвам стар авторски форум и не съм направил едно от най-важните неща и то е ново или старо в форумите тоест както е тук
Ново -
folder_new_big.gif

Старо -
folder_big.gif

Таблици:
forum_read - id account_id topic_id time(time();) read(unread/read)
Въпроса ми е как да отимизирам самата заявка да не изпраща записи към forum_read за всеки един потребител при нова тема, а нещо по-просто

Чакам идейте Ви!
 
Правиш си една таблица например forums_track .Полетата са user_id, forum_id, topic_id, mark_time.

В topics таблицата слагаш mark_time също и когато се добави нов отговор, трие мнение, редактира и т.н. ъпдейтваш времето с time().Така за всеки потребител ъпдейтваш времето от forums_track - mark_time, когато посети темата.Когато се показва темата във форума, проверяваш дали mark_time от topics е по-голямо от mark_time на forums_track.Ако е по-голямо, значи има ново мнение, редакция и т.н.

Ето ти пример с phpbb http://ftp.phpbb-fr.com/public/cdd/phpbb3/3.0.9/nav.html?includes/functions.php.source.html#l1694

Гледай му кода, ще видиш много интересни неща. :)

Ето ти примерно API:

Код:
function is_unread_post($topic_id)
{
    global $user;
    
    $topic_id = (int) $topic_id;
    $sql = "SELECT mark_time FROM topics_track WHERE user_id = '{$user->data['user_id']}' AND topic_id = '$topic_id'";
    $result = $db->sql_query($sql);
    
    if(!$result)
    {
        trigger_error('NO_TOPIC');
    }
    $mark_time = (int) $db->sql_fetchfield('mark_time');

    $sql = "SELECT mark_time FROM topics WHERE mark_time > '$mark_time' AND topic_id = '$topic_id'";
    
    /*
    Ако времето е по-голямо от $mark_time ще намери резултат и ще върне true, защото ще върне масив с mark_time => true.
    */
    return (bool) $db->sql_query($sql); 
}

echo is_unread_post(30); // topic #30
Естествено, по-добре е да ползваш join, особено кода от phpbb. :)
 

Back
Горе