Php Codeigniter搜索引擎错误:结果分页项显示所有帖子
我正在使用Codeigniter 3.1.8开发一个基本的博客应用程序。和引导4。该应用程序具有搜索帖子功能 标题视图中的表单:Php Codeigniter搜索引擎错误:结果分页项显示所有帖子,php,codeigniter,codeigniter-3,Php,Codeigniter,Codeigniter 3,我正在使用Codeigniter 3.1.8开发一个基本的博客应用程序。和引导4。该应用程序具有搜索帖子功能 标题视图中的表单: <form method="get" action="<?php echo base_url('posts/search') ?>" id="search_form" class="w-100 py-1 px-2 px-md-3 px-lg-5" accept-charset="utf-8"> <div class="input-
<form method="get" action="<?php echo base_url('posts/search') ?>" id="search_form" class="w-100 py-1 px-2 px-md-3 px-lg-5" accept-charset="utf-8">
<div class="input-group <?php if(form_error('search')) echo 'has-error';?>">
<input class="form-control form-control-dark" type="text" name="search" placeholder="Search posts..." aria-label="Search">
<?php if(form_error('search')) echo form_error('search'); ?>
<div class="input-group-append">
<button class="btn btn-success" type="submit"><i class="fa fa-search"></i></button>
</div>
</div>
</form>
模型:
public function search_count($expression) {
$query = $this->db->like('title', $expression)
->or_like('description', $expression)
->or_like('content', $expression);
$query = $this->db->get('posts');
return $query->num_rows();
}
public function search($expression, $limit, $offset) {
$query = $this->db->like('title', $expression)
->or_like('description', $expression)
->or_like('content', $expression);
$this->db->order_by('posts.id', 'DESC');
$query = $this->db->get('posts', $limit, $offset);
return $query->result();
}
问题:
搜索结果的第一页按预期显示12个包含搜索表达式的项目,但所有其他页面将再次显示所有帖子
由于分页使用了$config['query\u string\u segment']
,因此行$query\u string\u segment='search='$表情。”&页面'
应该有助于通过$\u GET[]
将搜索表达式传递到第1页、第2页等
但是页面项目链接不保留=
和&
:
<a href="http://localhost/ciblog/posts/search?search%3Dharum%26page=2" data-ci-pagination-page="2">2</a>
为什么会这样?我的错误在哪里?这里有一个解决方案:
public function get_posts_search($keyword,$limit,$start){
$this->db->where("(title LIKE '%$keyword%' || description LIKE '%$keyword%' || content LIKE '%$keyword%')");
$this->db->limit($limit, $start);
$query = $this->db->get('posts');
return $query; //don't return result when your query haven't check if having a records
}
public function get_posts_search_total($keyword){
$this->db->where("(title LIKE '%$keyword%' || description LIKE '%$keyword%' || content LIKE '%$keyword%')");
$query = $this->db->get('posts');
return $query->num_rows(); //don't return result when your query haven't check if having a records
}
在
\u initPagination
方法中添加这两行解决了问题:
$config['enable_query_strings'] =TRUE;
$config['reuse_query_string'] =TRUE;
整个代码:
private function _initPagination($path, $totalRows, $query_string_segment = 'page') {
//load and configure pagination
$this->load->library('pagination');
$config['base_url'] = base_url($path);
$config['query_string_segment'] = $query_string_segment;
$config['enable_query_strings'] =TRUE;
$config['reuse_query_string'] =TRUE;
$config['total_rows'] = $totalRows;
$config['per_page'] = 12;
if (!isset($_GET[$config['query_string_segment']]) || $_GET[$config['query_string_segment']] < 1) {
$_GET[$config['query_string_segment']] = 1;
}
$this->pagination->initialize($config);
$limit = $config['per_page'];
$offset = ($this->input->get($config['query_string_segment']) - 1) * $limit;
return ['limit' => $limit, 'offset' => $offset];
}
public function search() {
// Force validation since the form's method is GET
$this->form_validation->set_data($this->input->get());
$this->form_validation->set_rules('search', 'Search term', 'required|trim|min_length[3]');
$this->form_validation->set_error_delimiters('<p class = "error search-error"> ', ' </p>
');
// If search fails
if ($this->form_validation->run() === FALSE) {
return $this->index();
} else {
$expression = $this->input->get('search');
$posts_count = $this->Posts_model->search_count($expression);
$query_string_segment = 'page';
$config = $this->_initPagination("/posts/search", $posts_count, $query_string_segment);
$data = $this->Static_model->get_static_data();
$data['categories'] = $this->Categories_model->get_categories();
//use limit and offset returned by _initPaginator method
$data['posts'] = $this->Posts_model->search($expression, $config['limit'], $config['offset']);
$data['expression'] = $expression;
$data['posts_count'] = $posts_count;
$this->load->view('partials/header', $data);
$this->load->view('search');
$this->load->view('partials/footer');
}
}
private function\u initPagination($path、$totalRows、$query\u string\u segment='page')){
//加载和配置分页
$this->load->library('pagination');
$config['base\u url']=base\u url($path);
$config['query\u string\u segment']=$query\u string\u segment;
$config['enable_query_strings']=TRUE;
$config['reuse\u query\u string']=TRUE;
$config['total_rows']=$totalRows;
$config['per_page']=12;
如果(!isset($\u GET[$config['query\u string\u segment']]))$\u GET[$config['query\u string\u segment']]<1){
$\u GET[$config['query\u string\u segment']=1;
}
$this->pagination->initialize($config);
$limit=$config['每页'];
$offset=($this->input->get($config['query\u string\u segment'))-1)*$limit;
返回['limit'=>$limit',offset'=>$offset];
}
公共函数搜索(){
//强制验证,因为表单的方法是GET
$this->form\u validation->set\u data($this->input->get());
$this->form_validation->set_规则('search'、'search term'、'required | trim | min_length[3]);
$this->form\u validation->set\u error\u分隔符(“”,”
');
//如果搜索失败
如果($this->form\u validation->run()==FALSE){
返回$this->index();
}否则{
$expression=$this->input->get('search');
$posts\u count=$this->posts\u model->search\u count($expression);
$query_string_segment='page';
$config=$this->\初始化分页(“/posts/search”、$posts\u count、$query\u string\u段);
$data=$this->Static_model->get_Static_data();
$data['categories']=$this->categories\u model->get\u categories();
//使用_initPaginator方法返回的限制和偏移量
$data['posts']=$this->posts_model->search($expression,$config['limit'],$config['offset']);
$data['expression']=$expression;
$data['posts\u count']=$posts\u count;
$this->load->view('partials/header',$data);
$this->load->view('search');
$this->load->view('partials/footer');
}
}
而不是$config=$this->\u初始化分页(“/posts/search”,$posts\u count)
try$config=array\u merge($this->\u initPagination(“/posts/search”,$posts\u count),$config)代码>搜索总是CI中的问题我很久以前就用过这个教程,因为CI搜索引擎参数在url中不可见,但分页效果很好@umefarooq很好的教程,但我不希望有一个存储搜索的表。我知道如何使用get()
,而不是post()
。正如您在search%3Dharum%26page=2
中所看到的那样,=
不会自动将URL编码为%3D
,因为此链接中存在另一个=
。你在代码中的什么地方建立这个链接?@vivek_23我该如何解决这个问题?
private function _initPagination($path, $totalRows, $query_string_segment = 'page') {
//load and configure pagination
$this->load->library('pagination');
$config['base_url'] = base_url($path);
$config['query_string_segment'] = $query_string_segment;
$config['enable_query_strings'] =TRUE;
$config['reuse_query_string'] =TRUE;
$config['total_rows'] = $totalRows;
$config['per_page'] = 12;
if (!isset($_GET[$config['query_string_segment']]) || $_GET[$config['query_string_segment']] < 1) {
$_GET[$config['query_string_segment']] = 1;
}
$this->pagination->initialize($config);
$limit = $config['per_page'];
$offset = ($this->input->get($config['query_string_segment']) - 1) * $limit;
return ['limit' => $limit, 'offset' => $offset];
}
public function search() {
// Force validation since the form's method is GET
$this->form_validation->set_data($this->input->get());
$this->form_validation->set_rules('search', 'Search term', 'required|trim|min_length[3]');
$this->form_validation->set_error_delimiters('<p class = "error search-error"> ', ' </p>
');
// If search fails
if ($this->form_validation->run() === FALSE) {
return $this->index();
} else {
$expression = $this->input->get('search');
$posts_count = $this->Posts_model->search_count($expression);
$query_string_segment = 'page';
$config = $this->_initPagination("/posts/search", $posts_count, $query_string_segment);
$data = $this->Static_model->get_static_data();
$data['categories'] = $this->Categories_model->get_categories();
//use limit and offset returned by _initPaginator method
$data['posts'] = $this->Posts_model->search($expression, $config['limit'], $config['offset']);
$data['expression'] = $expression;
$data['posts_count'] = $posts_count;
$this->load->view('partials/header', $data);
$this->load->view('search');
$this->load->view('partials/footer');
}
}