0

私は一般的にCodeigniterとPHPを初めて使用するので、ご容赦ください。

クエリから返された結果をページ分割するために、codeigniter ページ分割クラスを使用しようとしています。以下のコードは、パラメーターの受け渡しを必要としない静的クエリで問題なく動作します。ただし、変数をURLのパラメータとして渡そうとするとうまくいかないようです。

localhost/index.php/termsbyletter/index/a  

ここで、「a」はコントローラー/モデルに渡される $letter 変数です。

PHP はエラーを出力しておらず、モデル内の record_count 関数と同様に、クエリは期待どおりに実行されます。その結果、すべてのクエリ結果が表示されますが、ページネーション リンクをクリックしても同じページに表示されます。

また、モデル内で、クエリを 2 回実行するよりも効率的に行数を返す方法はありますか? 私はこれが必要であることをここで読みましたが、この値を他の方法で渡そうとしても成功していません。

これが私のコントローラーです:

 <?php

class Termsbyletter extends CI_Controller
{
    public function __construct() {
        parent:: __construct();
        $this->load->helper("url");
        $this->load->model("terms_by_letter");
        $this->load->library("pagination");
    }

    public function index($letter) {

        $config = array();
        $config["base_url"] = base_url() . 'index.php/termsbyletter/index/' . $letter;
        $config["total_rows"] = $this->terms_by_letter->record_count($letter);
        $config["per_page"] = 3;
        $config["uri_segment"] = 5;

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

        $page = ($this->uri->segment(5)) ? $this->uri->segment(5) : 0;
        $data["results"] = $this->terms_by_letter->term($config["per_page"], $page, $letter);
        echo $this->pagination->create_links();

        $this->load->view("/templates/header"); 
        $this->load->view("/terms/index", $data);  
        $this->load->view("/templates/footer"); 
       }
}

そしてモデル:

class Terms_by_letter extends CI_Model
 {
    public function __construct() {
        parent::__construct();
            $this->load->database();
          }

    public function record_count($letter) {

          $query = $this->db->query("SELECT * FROM news WHERE LEFT(slug, 1) = '$letter'");
             return $query->num_rows();      
          }

    public function term($limit, $start, $letter) {

          $this->db->limit($limit, $start);
          $query = $this->db->query("SELECT * FROM news WHERE LEFT(slug, 1) = '$letter'");


              if ($query->num_rows() > 0) {
              foreach ($query->result() as $row) {
                 $data[] = $row;

            }
            return $data;
        }
        return false;


    }
 }

ビューに結果を出力するために、次のようなものを使用しています。

 <?php
foreach($results as $data) {
    echo $data->slug "<br>";
}
?>
   <p><?php echo $links; ?></p>
4

1 に答える 1

1

アクティブなレコードと通常の CI クエリを混在させようとしていますが、うまくいきません。クエリを次のように変更します。

$query = $this->db->query("SELECT * FROM news WHERE LEFT(slug, 1) = '$letter' LIMIT $start, $limit");

それか、次の方法で完全にアクティブなレコードルートに進みます。

$this->db->limit($limit, $start);
$this->db->where('LEFT(slug,1)',$letter);
$this->db->get('news');

私の知る限り、単一のクエリで必要なすべての結果を返す方法はありません。コントローラーは、ページネーションを把握するために合計レコードを必要とし、1 ページのレコードのみを選択する必要があります。

ただし、クエリを 1 回だけ記述して、パラメーターを少し変更することもできます。

public function term($limit, $start, $letter) {
if($limit > 0)
{
    $this->db->limit($limit, $start);
}
$this->db->where('LEFT(slug,1)',$letter);
$this->db->get('news');

次に、コントローラーで次のようにカウントを取得します。

$config["total_rows"] = $this->terms_by_letter->term(0,0,$letter);
于 2013-01-07T19:28:24.670 に答える