0

我正在一个论坛上工作,并达到了我想要跟踪页面浏览量的地步。

我决定在拉入线程内容(OP)的mysql查询之后添加视图更新代码。

    public function get_threads($threadid)
    {
        $sql = "SELECT t.*, u.username, up.avatar_loc from threads t
            INNER JOIN users u
            on u.id = t.userid
            INNER JOIN user_profiles up
            on u.id = up.id
            where threadid = $threadid";
        $result = $this->db->query($sql)->row_array();
        $view = $result['numviews'];
        $view ++; 
        $update = "UPDATE threads SET numviews = $view WHERE threadid = $threadid";
        $this->db->query($update);
        return $result;
    }

但是,在 Chrome 中,该numviews值会在页面刷新时增加两倍。这在 Firefox 中不会发生。

通常,内容将通过 AJAX 调用加载,当它通过这种方式时,它也没有任何问题。在 AJAX 调用之后,我使用 popstate 更改 URL,如果用户在页面上刷新,您会收到错误,或者如果他们导航到页面(使用在新窗口中打开)。

这是 AJAX 和非 ajax 的控制器代码:

非 Ajax 线程控制器:

public function threads($threadid)
{
   //...whole lot of other stuff
   $data['content']                 = $this->components_m->thread($threadid);
   $this->load->view('template/template' ,$page);
}

AJAX 控制器:

    public function ajax_thread()
    {
        $threadid = $this->input->post('threadid');
        $result['content']              = $this->components_m->thread($threadid);
        echo json_encode($result);
    }

这是components_m->thread($threadid)

    public function thread($threadid)
    {
        $data['threadid']           = $threadid;
        $data['wysihtml5_toolbar']  = $this->load->view('newthread/wysihtml5_toolbar','',TRUE);
        $data['op']                 = $this->threads_m->get_threads($threadid);
        $data['replies']            = $this->threads_m->replies($threadid);

        $page['subject']            = $data['op']['subject'];
        $page['replyTo']            = $this->threads_m->replyTo($data);
        $page['replies']                 = $this->threads_m->create_replies($data);
        return $this->load->view('thread', $page, TRUE);
    }

我搜索了整个项目,get_threads($threadid)只存在于上面列出的两个函数中。

当我使用时,$this->output->enable_profiler(TRUE);我只看到更新功能运行一次。

我什至尝试过评论$result['content'] = $this->components_m->thread($threadid);ajax_thread()但它仍然在 Chrome 中更新了两次。

有什么想法吗?

4

1 回答 1

0

通过更改 UPDATE sql 代码修复它:

$update = "UPDATE threads SET numviews = numviews + 1 WHERE threadid = $threadid";
$this->db->query($update);
于 2013-07-01T15:00:42.053 回答