我有一个严重的问题在这里。我正在开发一个论坛,并试图获得“未读帖子”功能。然而,由于某种原因,我的代码决定循环&得到荒谬的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();在构造函数中,整个事物停止超载。所以我确定它在这个代码中。
贵'while'终止循环,你希望它? – alex 2011-03-12 16:48:32