2011-03-12 68 views
1

我有一个严重的问题在这里。我正在开发一个论坛,并试图获得“未读帖子”功能。然而,由于某种原因,我的代码决定循环&得到荒谬的CPU使用率超过我的dedi。我从我的MySQL进程列表中看到的是,相同的sql不断循环。代码循环和崩溃服务器。不知道发生了什么

这是我的代码:

public function __construct() 
{ 
    $this->getUnread(); 
} 

private function getUnread() 
{ 
    global $cms; 
    // check unread threads 
    $forumSQL = $cms->db->query('SELECT * FROM forum_for'); 
    while($forums = $forumSQL->fetch_assoc()) 
    { 
     $forumId = $forums['id']; 
     $forumArray[$forumId] = $forums;    
    } 

    if($unreadThreadsSql = $cms->db->query('SELECT * FROM forum_threads WHERE posted > "' . $_SESSION['lastVisit'] . '"')) 
    { 
     while(!$unreadThreads = $unreadThreadsSql->fetch_assoc()) 
     { 
      $forumId = $unreadThreads['forId']; 
      if($this->checkUnread($unreadThreads['id'])) 
      { 
       $cms->db->query(' 
        INSERT INTO 
         forum_unread(
          threadID, 
          catID, 
          forumID, 
          userID, 
          datetime, 
          threadtime) 
        VALUES(
          '.$unreadThreads['id'].', 
          '.$forumArray[$forumId]['cat_id'].', 
          '.$forumId.', 
          '.$_SESSION['userId'].', 
          NOW(), 
          "'.$unreadThreads['posted'].'")'); 
      } 
     } 
    } 

    // check unread posts 

    if($unreadPostsSql = $cms->db->query('SELECT * FROM forum_posts WHERE datetime > "' . $_SESSION['lastVisit'] . '"')) 
    { 
     while($unreadPosts = $unreadPostsSql->fetch_assoc()) 
     { 
      $threadSql = $cms->db->query('SELECT * FROM forum_threads WHERE id = ' . $unreadPosts['threadId']); 
      $thread = $threadSql->fetch_assoc(); 
      $forumId = $thread['forId']; 
      if(!$this->checkUnread($thread['id'])) 
      { 
       $cms->db->query(' 
        INSERT INTO 
         forum_unread(
          threadID, 
          catID, 
          forumID, 
          userID, 
          datetime, 
          threadtime) 
        VALUES(
          '.$thread['id'].', 
          '.$forumArray[$forumId]['cat_id'].', 
          '.$forumId.', 
          '.$_SESSION['userId'].', 
          NOW(), 
          "'.$thread['posted'].'")'); 
      } 
     } 
    } 
} 

private function checkUnread($id) 
{ 
    global $cms; 
    if($unreadSql = $cms->db->query('SELECT * FROM forum_unread WHERE threadID = ' .$id . ' AND userID = ' . $_SESSION['userId'])) 
    { 
     if($unreadSql->num_rows == 1) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     }   
    } 
    else 
    { 
     return false; 
    } 
} 

真的可以使用一些帮助在这里。我真的找不到为什么它循环,有没有人有一个想法...

对于谁想知道,它似乎代码循环功能checkUnread()。

作为一个额外的注意,当注释$ this-> getUnread();在构造函数中,整个事物停止超载。所以我确定它在这个代码中。

+2

贵'while'终止循环,你希望它? – alex 2011-03-12 16:48:32

回答

2

您的意思是while($unreadThreads = $unreadThreadsSql->fetch_assoc())

顺便说一句,如果你编写了一个大的INSERT查询,然后执行一次,而不是所有这些小小的查询,它将是高效率。

例子:

$inserts = Array(); 
$unreadThreadsSql = $cms->db->query('SELECT * FROM forum_threads WHERE posted > "' . $_SESSION['lastVisit'] . '"') or die($cms->db->error); 
while ($unreadThreads = $unreadThreadsSql->fetch_assoc()) { 
    $forumId = $unreadThreads['forId']; 
    if (!$this->checkUnread($unreadThreads['id'])) 
     continue; 

    $inserts[] = '(' . 
     $unreadThreads['id'] . ',' . 
     $forumArray[$forumId]['cat_id'] . ',' . 
     $forumId . ',' . 
     $_SESSION['userId'] . ',' . 
     'NOW(),' . 
     '"' . $unreadThreads['posted'] . '")' 
    ); 
} 

if (count($inserts)) { 
    $cms->db->query('INSERT INTO forum_unread(
         threadID, 
         catID, 
         forumID, 
         userID, 
         datetime, 
         threadtime) VALUES' . 
        implode(',', $inserts)) or die($cms->db->error); 
} 
+1

好吧,事实证明,如果你向其他人展示你的代码,你会发现最愚蠢的错误。谢谢,那!根本不应该在那里。 – 2011-03-12 16:54:15

+0

关于db查询。 我从mysqli文档中了解到,它们的功能一次不支持多个查询。如果这是错的,那么我可能会改变它。 – 2011-03-14 11:42:57

+0

@DaveSiegel:这可能是真的,但它不相关,因为我一次不执行多个查询。我使用多行执行_one_ ['INSERT'语句](http://dev.mysql.com/doc/refman/5.5/en/insert.html)。 – 2011-03-14 12:13:08