我正在使用 PHP 8.2.12 开发一个旧的 Codeigniter 3.1.9 网站。我的问题是,是否可以将数据库中的搜索结果分成每页 20 个结果加上 2 个标题行,以使用 CI 分页编译整个页面?。
我的数据库中共有 58 条食谱记录,位于名为“recipe”的表中。在此表中,我有 14 个字段:id、名称、按钮文本、链接名称、时间、img、成分、设备、准备、方向、类别、子类别、更新和关键字。
在这些字段中,我目前只搜索了 4 个字段。它们是 id、名称、类别和子类别。
我遇到的问题是,无论搜索什么,搜索结果的长度都没有高度限制。假设有人搜索像“菜谱”这样通用的东西,搜索将返回每个菜谱。这就是我想要的,但我希望它不会因为打印出所有 58 条记录而让用户感到不知所措,并且必须一次滚动浏览所有 58 条记录行。
所以,这引出了我的问题。是否可以将这些搜索结果一次最多输出 20 个结果到结果容器,并能够逐页查找其余结果?
我已经在 CI3 的管理部分使用分页来制作食谱翻页书。然而,它被设置为根据每个食谱的所有字段进行分页。
我对 PHP 还是个新手,这个项目被扔到我的腿上来弄清楚,并试图破译这个网站的怪物是相当大的挑战。从 Codeigniter 1.83 开始我就一直让它运行。请善待我,帮助我渡过难关。
此外,我最初并没有为该网站编写代码,因此我必须对几乎所有内容进行逆向工程。我将提供您可能需要查看的任何文件。我只是不想让我的帖子比现在更长,并用不必要的代码让你们不知所措。
话虽如此,这里是您可能需要的一些代码:
Recipe.php 控制器(用于翻书和搜索)
function flipbook(){
$this->require_login();
$this->load->library('pagination');
$config['base_url'] = site_url('recipe/flipbook');
$config['total_rows'] = $this->recipe_model->num_rows();
$config['uri_segment'] = '3';
$config['per_page'] = 1;
$config['num_links'] = 10;
$config['display_pages'] = TRUE;
$config['full_tag_open'] = '<div id="pagination">';
$config['full_tag_close'] = '</div>';
$this->pagination->initialize($config);
$recipe = $this->recipe_model->read_records($config['per_page'], $this->uri->segment(3))->row_array();
$data = array(
'title' => "Shirley's Recipes:".$recipe['name'],
'columns' => array('toc', 'admin/page/recipe_flipbook'),
'recipe' => $recipe,
'updated' => $this->format_date($recipe['updated'])
);
$this->load->view('templates/main', $data);
}
function search(){
if($this->input->method() === 'post'){
$search = $this->input->post('query');
$results = $this->recipe_model->search($search);
$data = array(
'title' => "Shirley's Recipes:Search Results",
'columns' => array('toc', 'public/page/search_results'),
'recipes' => $results, // $results is being renamed $recipes. I don't really know why though yet...
'search' => $search
);
$this->load->view('templates/main', $data);
}
else{
redirect('recipe');
}
}
Recipe_model 模型
function search($search){
$terms = explode(' ', $search);
$match = " ";
foreach($terms as $term){
$match .= $term;
}
$querystr = "SELECT id, name, category, subcategory, keywords, MATCH(name, category, subcategory, keywords) AGAINST('".$match."') as score FROM recipe WHERE MATCH(name, category, subcategory, keywords) AGAINST('".$match."') ORDER BY name;";
$q = $this->db->query($querystr);
return $q->result();
}
search_result.php 查看
<link rel="stylesheet" type="text/css" href="/assets/css/public/page/searchresults.css" media="screen" />
<div id="sitecontent" class="grid-item2 grid-container">
<?php
if($admin){
$this->load->view('admin/nav/notesnav');
}
?>
<div id="contents" class="grid-item1 grid-container scrollbar <?php if($admin){echo 'grid-item2';} ?>">
<div id="spiral" class="grid-item1">
<img class="spiral" src="/assets/img/lines/spiral1trans.png"/>
</div>
<div id="searchresults" class="grid-item2 grid-container">
<h1>Search Results</h1>
<div id="results" class="grid-item1 grid-container">
<div id="resultsheading" class="grid-item1 heading">Your Search Results for:</div><div id="searchterm" class="grid-item"><?= $search ?></div>
<div id="numheading" class="grid-item3 heading">#:</div>
<div id="resultlistheading" class="grid-item4 heading">Results:</div>
<div id="categoryheading" class="grid-item5 heading">Category:</div>
<div id="subcategoryheading" class="grid-item6 heading">Subcategory</div>
<?php
if(!empty($recipes)):
foreach ($recipes as $key => $recipe):
?>
<div class="grid-item num"><?= $key + 1 ?></div>
<div class="grid-item result"><a href="/recipe/<?= $recipe->id ?>"><?= $recipe->name ?></a></div>
<div class="grid-item result"><?= $recipe->category ?></div>
<div class="grid-item result"><?= $recipe->subcategory ?></div>
<?php endforeach; ?>
<?php else: ?>
<div class="grid-item no-result">No matching recipes</div>
<?php endif; ?>
</div>
</div>
</div>
<div id="updated" class="grid-item2">Updated 05/27/2023 @ 2:34 EDT</div>
</div>
recipe_flipbook.php 查看
<link rel="stylesheet" type="text/css" href="/assets/css/admin/core/admin.css" media="screen" />
<link rel="stylesheet" type="text/css" href="/assets/css/admin/page/flipbook.css" media="screen" />
<link rel="stylesheet" type="text/css" href="/assets/css/admin/core/pagination.css" />
<div id="sitecontent" class="grid-item2 grid-container">
<?php $this->load->view('admin/nav/notesnav'); ?>
<div id="contents" class="grid-item2 grid-container scrollbar">
<div id="spiral" class="grid-item1">
<img class="spiral" src="/assets/img/lines/spiral1trans.png"/>
</div>
<div id="recipe-flipbook" class="grid-item2 grid-container">
<div id="title" class="box grid-item1">
<h1><?=$recipe['name']; ?></h1>
<h3><?=$recipe['time']; ?></h3>
</div>
<div id="ingredients" class="box grid-item2">
<h2>Ingredients:</h2>
<?php
if(isset($recipe['ingredients']) && $recipe['ingredients'] != ''){
echo $this->mkdn->translate($recipe['ingredients']);
}
else{
echo '<br><br><br><br><br><br><br><br><br><br><br>';
}
?>
</div>
<div id="equipment" class="box grid-item3">
<h2>Equipment:</h2>
<?php
if(isset($recipe['equipment']) && $recipe['equipment'] != ''){
echo $this->mkdn->translate($recipe['equipment']);
}
else{
echo '<br><br><br><br><br><br><br><br><br><br><br>';
}
?>
</div>
<div id="prepreparation" class="box grid-item4">
<h2>Pre-Preparation:</h2>
<?php
if(isset($recipe['prepreparation']) && $recipe['prepreparation'] != ''){
echo $this->mkdn->translate($recipe['prepreparation']);
}
else{
echo '<br><br><br><br><br><br><br><br><br><br><br>';
}
?>
</div>
<div id="directions" class="box grid-item5">
<h2>Directions:</h2>
<?php
if(isset($recipe['directions']) && $recipe['directions'] != ''){
echo $this->mkdn->translate($recipe['directions']);
}
else{
echo '<br><br><br><br><br><br><br><br><br><br><br>';
}
?>
</div>
</div>
<script type="text/javascript" src="/assets/js/confirmdelete.js"></script>
</br>
</div>
<?php
echo $this->pagination->create_links();
if(isset($updated)){
echo '<div id="updated" class="grid-item4 noprint">Updated '.$updated.'</div>';
}
if($admin){
echo '<div id="optionbuttons" class="grid-tem5 noprint">';
echo anchor('recipe/edit/'.$recipe['id'], img(array('src'=>'./assets/img/icons/edit.png', 'alt'=>'Edit', 'title'=>'Edit')));
echo ' ';
echo '<a href="javascript:confirmdelete(\'Delete recipe?\',\''.base_url().'recipe/delete/'.$recipe['id'].'\')">'.img(array('src'=>'./assets/img/icons/delete.png', 'alt'=>'Delete', 'title'=>'Delete')).'</a>';
echo '</div>';
}
?>
</div>
任何人可以提供的任何帮助将不胜感激!先谢谢大家了
在应用程序的模型部分,您应该按照如下方式修改搜索方法和控制器的其他部分:
搜索方法应该是这样的:
function search($search, $currentPage=1, $perPage=15){
$offset = ($currentPage - 1) *$perPage
$terms = explode(' ', $search);
$match = " ";
foreach($terms as $term){
$match .= $term;
}
$querystr = "SELECT id, name, category, subcategory, keywords, MATCH(name, category, subcategory, keywords) AGAINST('".$match."') as score FROM recipe WHERE MATCH(name, category, subcategory, keywords) AGAINST('".$match."') ORDER BY name LIMIT ".$perPage." OFFSET ".$offset.";";
$q = $this->db->query($querystr);
return $q->result();
}
然后在控制器中如果你想修改每个页面或获取不同的页面,你应该传递搜索函数的这两个参数。
想要更详细的答案请评论!