私はフォーラムに取り組んでおり、ページビューを追跡したいところまで来ました。
スレッドの内容 (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
ページを更新すると値が 2 倍になります。これは 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)
ところ、上記の 2 つの関数にのみ存在します。
使用する$this->output->enable_profiler(TRUE);
と、更新機能が1回しか実行されていません。
私もコメントアウトしようとしました$result['content'] = $this->components_m->thread($threadid);
がajax_thread()
、それでもChromeで2回更新されます。
何かご意見は?