2016-05-07 59 views
2

我试图从我的论坛和子论坛中获得所有主题。但是,由于某些原因,我的代码无法正常工作。它不会给我任何错误,但会显示错误的信息。我正在使用medoo。 这里是我的功能:从我的论坛中获取所有主题他们在medoo的子论坛

public function getForumTopicsCount($forumId) 
{ 
    $getForumTopicsCount = $this->db->count('forum_topics', [ 
     "topic_forum" => $forumId 
    ]); 

    $subForums = $this->db->query("SELECT * FROM `forums` WHERE forum_subforum = $forumId")->fetchAll(); 
    $c = 0; 
    foreach($subForums as $subForum) { 
     $subForumTopics = $this->db->query("SELECT * FROM `forum_posts`")->fetchAll(); 
     foreach($subForumTopics as $topic) { 
      if ($subForum['forum_id'] == $topic['topic_forum']) { 
       $c++; 
      } 
     } 
    } 
    return $getForumTopicsCount + $c; 
} 

所以在我的数据库中,我有一个表论坛,在那里我有一个列forum_subforum这是一个整数,它的价值是他们的头论坛的ID。我还有一个forum_topics表,它由我整个论坛中的所有主题组成,其中有一个名为topic_forum的列,它也是整数,并且是该主题所属论坛的标识。

谢谢你的帮助。非常感谢。

+0

你为什么要查询'form_posts'?那应该不是'forum_topics'? – Pevara

+0

是的你是对的谢谢你。上帝非常愚蠢的错误,我甚至没有注意到它,并且我经历了很多次这个代码。你救了我的命<3。 –

回答

1

我不是100%确定我理解你的问题,但从你的代码我想你想知道在给定的论坛有多少主题,包括论坛可能有的任何子论坛。

我相信下面的查询应该做的正是:

select count(*) from forum_topics 
right join forums on forum_topics.topics_forum = forums.id 
where forums.forum_id = :id or forums.forum_subforum = :id 

请允许我给你代码中的几句话:

  • 避免select *,除非你真的需要的所有数据。限制你的查询到你需要的。
  • 使用预处理语句代替用变量的方式组织查询。如果您收到的$ formId来自不安全的源,这可能会构成安全线程。
  • 在循环中运行查询时要小心。你应该问问自己这是否真的有必要。在这种情况下,一个查询就足够了。
  • 比较和搜索大型数据集是数据库设计的目的。让他们在可能的情况下完成工作,而不是获取大量数据并在php中进行处理。
+0

你是对的,但我以不同的方式做到了。它的问题在于我写了forum_posts而不是forum_topics,出于某种原因,我甚至没有注意到它。感谢您的快速反应。在我将其重命名为forum_topics后,一切正常。 –