我正在一个论坛上工作,并达到了我想要跟踪页面浏览量的地步。
我决定在拉入线程内容(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 中更新了两次。
有什么想法吗?