我对 Codeigniter 和 PHP 总体来说还是新手,所以请耐心等待。
我正在尝试使用 codeigniter 分页类对查询返回的结果进行分页。下面的代码适用于不需要传递任何参数的静态查询。然而,当尝试将变量作为 URL 中的参数传递时,它似乎会崩溃,例如
localhost/index.php/termsbyletter/index/a
其中“a”是传递给 Controller /模型的 $letter 变量。
PHP 不会输出任何错误,并且查询按预期执行,模型中的 record_count 函数也是如此。结果是所有查询结果都显示出来,但都在同一页面上,单击分页链接时保持不变。
此外,在模型中,是否有比运行查询两次更有效的返回行数的方法?我在这里读到这是必要的,并且我没有成功地尝试以任何其他方式传递这个值。
这是我的 Controller :
<?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;
}
}
我正在使用类似的东西在 View 中输出结果:
<?php
foreach($results as $data) {
echo $data->slug "<br>";
}
?>
<p><?php echo $links; ?></p>
最佳答案
您尝试将事件记录与普通 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');
据我所知,无法通过单个查询返回所需的所有结果, Controller 需要总记录来确定分页,然后只需要选择一页的记录。
但是,您可以只编写一次查询并稍微更改参数。
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');
然后在你的 Controller 中你会得到这样的计数:
$config["total_rows"] = $this->terms_by_letter->term(0,0,$letter);
关于php - 使用 Codeigniter 对查询结果进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14201708/