2011-08-14 20 views
4

以下に示すように、質問のリストをデータベースに照会しています。Codeigniterページネーションでクエリ結果の最初の行が表示されない

私のモデルでは、質問数(count_questions())だけでなく、質問自体(get_questions($args))が返されます。ページ番号が付けられます。

$limit = '10'; 
    $count = $this->forum_model->count_questions(); 
    $offset = $this->uri->segment(3, 0); 

    $this->load->library('pagination'); 

    $config['base_url']   = base_url() . 'forum/all/'; 
    $config['total_rows']  = $count; 
    $config['per_page']   = $limit; 
    $config['full_tag_open'] = '<div class="pagination">'; 
    $config['full_tag_close'] = '</div>'; 
    $config['uri_segment']   = 3; 

    $this->pagination->initialize($config); 

    $data['q']   = $this->forum_model->get_questions(NULL, $limit, $offset); 

    $data['pag_links'] = $this->pagination->create_links(); 

私は見てい奇妙な振る舞いは、そのcount_questions()戻って「25」(正解である)です。

ただし、ページング出力には24個の質問が表示され、データベースの最初の行/質問はスキップされます。

最初は、オフセットが間違っている可能性があると考えましたが、最初のページでは0に設定されています。

私がページネーションを使用しない場合、コントローラーは25個の質問すべてを私のビューに出力します。だから、私がやっていることがあると思われるページネーションの制限/オフセットがあるようです。

ここに間違いがありますか?

ありがとうございます。

デフォルトモデル(count_questions)

function count_questions() 
{ 
    $query = $this->db->query(" 
    SELECT * 
    FROM forum_qa 
    WHERE forum_qa_type = 1; 
    "); 

    return $query->num_rows; 
} 
+0

モデルで使用しているコードを表示できますか? –

+0

投稿を更新しました - あなたの考えを知ってもらいますように - ありがとう – pepe

+0

そして 'forum_model-> count_questions();'? –

答えて

0
$this->uri->segment(3, 0); 

モデル(get_questions)

function get_questions($forum_qa_id = NULL, $limit = NULL, $offset = NULL) 
{ 
    ($forum_qa_id === NULL) ? ($forum_qa_id = "'%'") : ($forum_qa_id = $forum_qa_id); 
    ($limit  === NULL) ? ($limit = 1) : ($limit = $limit); 
    ($offset  === NULL) ? ($offset = 0) : ($offset = $offset); 

    $query = $this->db->query(" 
    SELECT forum_qa.*, 
      user_profiles.*, 
      c.*, 
      n.pid, 
      v.*, 
      Ifnull(n.ans_count, 0) AS ans_count 
    FROM forum_qa 
      JOIN user_profiles 
      ON user_id = forum_qa_author_id 
      LEFT JOIN (SELECT * 
         FROM votes) AS v 
      ON forum_qa_id = v.forum_qa_id_fk 
      LEFT JOIN (SELECT forum_cm_id, 
          forum_cm_author_id, 
          forum_qa_id_fk, 
          forum_cm_text, 
          forum_cm_timestamp, 
          forum_cm_flag, 
          first_name AS forum_cm_first_name, 
          last_name AS forum_cm_last_name, 
          facebook_id AS forum_cm_fb_id, 
          picture  AS forum_cm_picture, 
          moderator AS forum_cm_moderator 
         FROM forum_cm 
          JOIN user_profiles 
           ON user_id = forum_cm_author_id) AS c 
      ON forum_qa_id = c.forum_qa_id_fk 
      LEFT JOIN (SELECT forum_qa_parent_id AS pid, 
          COUNT(*)   AS ans_count 
         FROM forum_qa 
         WHERE forum_qa_parent_id IS NOT NULL 
         GROUP BY forum_qa_parent_id) AS n 
      ON forum_qa_id = n.pid 
    WHERE forum_qa_id LIKE $forum_qa_id 
      AND forum_qa_parent_id IS NULL 
    ORDER BY forum_qa_timestamp DESC 
    LIMIT $limit 
    OFFSET $offset;  
    "); 

機能セグメントが存在しない場合(ブール)FALSEを返します。だから私は正しいとは思わない!

($offset  === NULL) ? ($offset = 0) : ($offset = $offset); 
+0

'$ this-> uri-> segment'の2番目のパラメータは、uriセグメントが存在しない場合に返すものです。 '$ this-> uri-> segment(3,0);' 3番目のURIセグメントがない場合は '0'(FALSEではなく)を返します。 –

+0

あなたは '$ config ['uri_segment'] = 3;'を使っています(ページ番号機能はURIのどの部分にページ番号が含まれているかを自動的に判断します。 - > uri-> segment(3、0); '...だから、あなたは1ページ目にあり、オフセットも1に設定されていると思います(最初の行はスキップされるので" – spotlr

+0

とtorrは問題を見つけましたか? – spotlr

1

return $query->num_rows;return $query->num_rows();でなければなりません。

また、LIMIT $limit OFFSET $offsetLIMIT $offset,$limitに変更してみてください。

+0

@rocket、提案のためのthx - 変更を行ったがまだ行かない - その行はまだフロントエンドに表示されない – pepe

+0

@Torr: 'LIMIT $ limit OFFSET $ offset'を' LIMIT $ offset 'に変更しようとすると、 $ limit'。 –

+0

残念なことに、私はテーブル内の最初の行が省略されてしまいます - 他のすべてはうまく表示されます - そしてOPで上記のように、ページネーションを使用しないと、最初の行が表示されます – pepe

0

問題は、デフォルトのページが、それは最初の行が欠落している理由です、ゼロの代わりに1行目から記録を開始し実行すると、です。この問題を解決するために次のコードを適用しました

$ page =($ this-> uri-> segment(3))? $ this-> uri-> segment(3):0;

リクエストURLに応じてセグメントを編集してください

関連する問題