直接从数据库计算phpbb中未读帖子的php代码

直接从数据库计算phpbb中未读帖子的php代码,php,mysql,phpbb,ezsql,Php,Mysql,Phpbb,Ezsql,我试图直接从phpbb3数据库检索特定用户的未读帖子总数。我使用ezsql让我的生活更轻松,我根据以下帖子编写了以下代码: $unreadposts似乎总是返回一个高于实际未读文章数的数字。在过去的12个小时里,我一直在做这件事,它让我毛骨悚然:) 任何帮助或建议都将不胜感激 // Step 1: get all topics the user has access to. Assuming all of them are unread until we prove otherw

我试图直接从phpbb3数据库检索特定用户的未读帖子总数。我使用ezsql让我的生活更轻松,我根据以下帖子编写了以下代码:

$unreadposts似乎总是返回一个高于实际未读文章数的数字。在过去的12个小时里,我一直在做这件事,它让我毛骨悚然:)

任何帮助或建议都将不胜感激

        // Step 1: get all topics the user has access to. Assuming all of them are unread until we prove otherwise
        $usertopicsallowed = $forumdb->get_results("SELECT DISTINCT t.topic_id, t.forum_id, t.topic_last_post_time FROM $forumdbname.phpbb_users u 
        INNER JOIN  $forumdbname.phpbb_user_group ug ON u.user_id = ug.user_id
        INNER JOIN  $forumdbname.phpbb_groups g ON g.group_id = ug.group_id
        INNER JOIN  $forumdbname.phpbb_acl_groups acl ON acl.group_id = ug.group_id
        INNER JOIN  $forumdbname.phpbb_forums f ON f.forum_id = acl.forum_id
        INNER JOIN  $forumdbname.phpbb_topics t ON f.forum_id = t.forum_id
        WHERE u.user_id = " . $forumuserid . ";");

        $usertopicsallowedcnt = count($usertopicsallowed);

        // Step 2: Return any topics for this user in topics_track
        $usertopicstrack = $forumdb->get_results("SELECT topic_id, mark_time FROM phpbb_topics_track WHERE user_id = " . $forumuserid . " ;");

        if (!empty($usertopicsallowed))
        {
            foreach($usertopicsallowed as $key => $usertopicallowed)
            {
                if (!empty($usertopicstrack))
                {
                    foreach($usertopicstrack as $key2 => $usertopictrack)
                    {
                        if ($usertopicsallowed[$key]->topic_id == $usertopicstrack[$key2]->topic_id)
                        {
                            if ($usertopicsallowed[$key]->topic_last_post_time < $usertopicstrack[$key2]->mark_time)
                            {
                                unset($usertopicsallowed[$key]);
                            }
                        }   
                    }
                }
            }
        }
        $usertopicsallowed2 = array_values($usertopicsallowed);
        $usertopicsallowed2cnt = count($usertopicsallowed2);

        // Step 3a: eturn any topics for this user in forums_track
        $userforumstrack = $forumdb->get_results("SELECT forum_id, mark_time FROM phpbb_forums_track WHERE user_id = " . $forumuserid . ";");

        // Step 3b: remove all topics before the forum tracks lastmark time
        if (!empty($usertopicsallowed2))
        {
            foreach($usertopicsallowed2 as $key => $usertopicsallow2)
            {
                if (!empty($userforumstrack))
                {
                    foreach($userforumstrack as $key2 => $userforumtrack)
                    {
                        if ($usertopicsallowed2[$key]->forum_id == $userforumstrack[$key2]->forum_id)
                        {
                            if ($usertopicsallowed2[$key]->topic_last_post_time < $userforumstrack[$key2]->mark_time)
                            {
                                unset($usertopicsallowed2[$key]);
                            }
                        }   
                    }
                }
            }
        }
        $usertopicsallowed3 = array_values($usertopicsallowed2);
        $usertopicsallowed3cnt = count($usertopicsallowed3);

        // Step 4: remove all topics before the user's lastmark time
        if (!empty($usertopicsallowed3))
        {
            foreach($usertopicsallowed3 as $key => $usertopicsallow3)
            {
                if ($usertopicsallowed3[$key]->topic_last_post_time < $forumuserlastmark)
                {
                    unset($usertopicsallowed3[$key]);
                }
            }
        }
        $usertopicsallowed4 = array_values($usertopicsallowed3);
        $usertopicsallowed4cnt = count($usertopicsallowed4);

        $unreadposts = count($usertopicsallowed4);
//步骤1:获取用户有权访问的所有主题。假设所有这些都是未读的,直到我们证明不是这样
$usertopicslowed=$forumdb->get_results(“从$forumdbname.phpbb_用户中选择不同的t.topic_id、t.forum_id、t.topic_last_post_time
内部联接$forumdbname.phpbb_用户_组ug ON u.user_id=ug.user_id
内部联接$forumdbname.phpbb_组g ON g.group_id=ug.group_id
内部联接$forumdbname.phpbb\u acl\u acl上的组acl.group\u id=ug.group\u id
内部加入$forumdbname.phpbb_论坛f ON f.forum_id=acl.forum_id
在f.forum\u id=t.forum\u id上的内部连接$forumdbname.phpbb\u主题t
其中u.user_id=“.forumuserid.”;”;
$usertopicsallowedcnt=计数($usertopicsallowed);
//步骤2:在主题跟踪中返回此用户的所有主题
$usertopicstrack=$forumdb->get_results(“从phpbb_topics_track中选择主题id,标记时间,其中user_id=“.$forumuserid.””);
如果(!empty($usertopicsallowed))
{
foreach($usertopicsallowed as$key=>$usertopicallowed)
{
如果(!empty($usertopicstrack))
{
foreach($usertopicstrack作为$key2=>$usertopictrack)
{
如果($usertopicsallowed[$key]->topic\u id==$usertopicstrack[$key2]->topic\u id)
{
如果($usertopicsallowed[$key]>topic_last_post_time<$usertopicstrack[$key2]>mark_time)
{
未设置($usertopicsallowed[$key]);
}
}   
}
}
}
}
$usertopicsallowed2=数组_值($usertopicsallowed);
$usertopicsallowed2cnt=计数($usertopicsallowed2);
//步骤3a:在论坛中为该用户返回任何主题
$userforumstrack=$forumdb->get_results(“从phpbb_论坛中选择论坛id,标记时间,跟踪其中的用户id=”.$forumuserid。“;”);
//步骤3b:在论坛跟踪最后标记时间之前删除所有主题
如果(!empty($usertopicsallowed2))
{
foreach($usertopicsallowed2作为$key=>$usertopicsallow2)
{
如果(!empty($userforumstrack))
{
foreach($userforumstrack作为$key2=>$userforumtrack)
{
如果($usertopicsallowed2[$key]->forum\u id==$userforumstrack[$key2]->forum\u id)
{
如果($usertopicsallowed2[$key2]->主题上次发布时间<$userforumstrack[$key2]->标记时间)
{
未设置($usertopicsallowed2[$key]);
}
}   
}
}
}
}
$usertopicsallowed3=数组_值($usertopicsallowed2);
$usertopicsallowed3cnt=计数($usertopicsallowed3);
//步骤4:在用户最后标记时间之前删除所有主题
如果(!empty($usertopicsallowed3))
{
foreach($usertopicsallowed3作为$key=>$usertopicsallow3)
{
如果($usertopicsallowed3[$key]->主题上次发布时间<$forumuserlastmark)
{
未设置($usertopicsallowed3[$key]);
}
}
}
$usertopicsallowed4=数组_值($usertopicsallowed3);
$usertopicsallowed4cnt=计数($usertopicsallowed4);
$unreadposts=计数($usertopicsallowed4);

好的,正如我在上面的评论中所说的,在12个小时的失败后,我在这里发布的15分钟内找到了答案!注意这个回复,所以它可能会在将来帮助其他人,我也会在链接上回复

这个链接给出了答案(https://www.phpbb.com/community/viewtopic.php?f=46&t=2092813#p12800435)但是不允许权限,因此您还需要添加我在下面编写的代码。因此,完整代码为:

// Step 1: get all topics the user has access to. Assuing all of them are unread until we prove otherwise
        $usertopicsallowed = $forumdb->get_results("SELECT DISTINCT t.topic_id, t.forum_id, t.topic_last_post_time FROM $forumdbname.phpbb_users u 
        INNER JOIN  $forumdbname.phpbb_user_group ug ON u.user_id = ug.user_id
        INNER JOIN  $forumdbname.phpbb_groups g ON g.group_id = ug.group_id
        INNER JOIN  $forumdbname.phpbb_acl_groups acl ON acl.group_id = ug.group_id
        INNER JOIN  $forumdbname.phpbb_forums f ON f.forum_id = acl.forum_id
        INNER JOIN  $forumdbname.phpbb_topics t ON f.forum_id = t.forum_id
        WHERE u.user_id = " . $forumuserid . ";");

        // Step 2: Calculate unread posts in all forums (regardless of permissions)         
        $phpbbv2 = $forumdb->get_results("SELECT t.topic_id, t.topic_last_post_time, tt.mark_time as topic_mark_time, ft.mark_time as forum_mark_time FROM (phpbb_topics t) 
        LEFT JOIN phpbb_topics_track tt ON (tt.user_id = " . $forumuserid . " AND t.topic_id = tt.topic_id) 
        LEFT JOIN phpbb_forums_track ft ON (ft.user_id = " . $forumuserid . " AND t.forum_id = ft.forum_id) 
        WHERE ( (tt.mark_time IS NOT NULL AND t.topic_last_post_time > tt.mark_time) 
        OR (tt.mark_time IS NULL AND ft.mark_time IS NOT NULL AND t.topic_last_post_time > ft.mark_time) 
        OR (tt.mark_time IS NULL AND ft.mark_time IS NULL AND t.topic_last_post_time > " . $forumuserlastmark . ") ) AND t.topic_moved_id = 0 AND t.topic_approved = 1 ORDER BY t.topic_last_post_time DESC;");

        // Step 3: Loop through step 2 and only increment the counter for every topic the user has permission to view
        $unreadcounter=0;
        if (!empty($phpbbv2))
        {
            foreach($phpbbv2 as $key => $phpbbv2a)
            {
                if (!empty($usertopicsallowed))
                {
                    foreach($usertopicsallowed as $key2 => $usertopicallowed)
                    {
                        if ($phpbbv2[$key]->topic_id == $usertopicsallowed[$key2]->topic_id)
                        {
                            $unreadcounter++;
                        }   
                    }
                }
            }
        }
        $unreadpost=$unreadcounter;

我相信它会更好,我不是php方面最有经验的人,但它对我来说很有用。

好吧,正如我在上面的评论中所说的,在12个小时没有让它发挥作用后,我在这里发布15分钟内找到了答案!注意这个回复,所以它可能会在将来帮助其他人,我也会在链接上回复

这个链接给出了答案(https://www.phpbb.com/community/viewtopic.php?f=46&t=2092813#p12800435)但是不允许权限,因此您还需要添加我在下面编写的代码。因此,完整代码为:

// Step 1: get all topics the user has access to. Assuing all of them are unread until we prove otherwise
        $usertopicsallowed = $forumdb->get_results("SELECT DISTINCT t.topic_id, t.forum_id, t.topic_last_post_time FROM $forumdbname.phpbb_users u 
        INNER JOIN  $forumdbname.phpbb_user_group ug ON u.user_id = ug.user_id
        INNER JOIN  $forumdbname.phpbb_groups g ON g.group_id = ug.group_id
        INNER JOIN  $forumdbname.phpbb_acl_groups acl ON acl.group_id = ug.group_id
        INNER JOIN  $forumdbname.phpbb_forums f ON f.forum_id = acl.forum_id
        INNER JOIN  $forumdbname.phpbb_topics t ON f.forum_id = t.forum_id
        WHERE u.user_id = " . $forumuserid . ";");

        // Step 2: Calculate unread posts in all forums (regardless of permissions)         
        $phpbbv2 = $forumdb->get_results("SELECT t.topic_id, t.topic_last_post_time, tt.mark_time as topic_mark_time, ft.mark_time as forum_mark_time FROM (phpbb_topics t) 
        LEFT JOIN phpbb_topics_track tt ON (tt.user_id = " . $forumuserid . " AND t.topic_id = tt.topic_id) 
        LEFT JOIN phpbb_forums_track ft ON (ft.user_id = " . $forumuserid . " AND t.forum_id = ft.forum_id) 
        WHERE ( (tt.mark_time IS NOT NULL AND t.topic_last_post_time > tt.mark_time) 
        OR (tt.mark_time IS NULL AND ft.mark_time IS NOT NULL AND t.topic_last_post_time > ft.mark_time) 
        OR (tt.mark_time IS NULL AND ft.mark_time IS NULL AND t.topic_last_post_time > " . $forumuserlastmark . ") ) AND t.topic_moved_id = 0 AND t.topic_approved = 1 ORDER BY t.topic_last_post_time DESC;");

        // Step 3: Loop through step 2 and only increment the counter for every topic the user has permission to view
        $unreadcounter=0;
        if (!empty($phpbbv2))
        {
            foreach($phpbbv2 as $key => $phpbbv2a)
            {
                if (!empty($usertopicsallowed))
                {
                    foreach($usertopicsallowed as $key2 => $usertopicallowed)
                    {
                        if ($phpbbv2[$key]->topic_id == $usertopicsallowed[$key2]->topic_id)
                        {
                            $unreadcounter++;
                        }   
                    }
                }
            }
        }
        $unreadpost=$unreadcounter;

我相信它会更好,我不是php方面最有经验的人,但它对我很有用。

从重构这只野兽开始。你的代码有6层,这是不对的。好吧,为什么我在电脑上做了12个小时的奴隶而无法管理它,但在stackoverflow上发布15分钟后,我发现了这个链接:-缺少的是步骤1,否则它会显示用户在论坛中有未读的主题,他们没有查看权限!我的代码可能还不是很好(在php方面不是很有经验),我是否应该编辑我的文章来显示新的(工作)版本?从重构那个野兽开始。你的代码有6层,这是不对的。好吧,为什么我在电脑上做了12个小时的奴隶,却无法管理它,但在stackoverflow上发布15分钟后,我发现了这个链接:-m是什么