如何分页显示每页20行的搜索结果?

问题描述 投票:0回答:1

我正在使用 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 '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
      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>

任何人可以提供的任何帮助将不胜感激!先谢谢大家了

php html search codeigniter-3
1个回答
0
投票

在应用程序的模型部分,您应该按照如下方式修改搜索方法和控制器的其他部分:

搜索方法应该是这样的:

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();
}

然后在控制器中如果你想修改每个页面或获取不同的页面,你应该传递搜索函数的这两个参数。

想要更详细的答案请评论!

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.