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ページを更新すると値が 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回更新されます。

何かご意見は?

4

1 に答える 1