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

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

我正在使用 PHP 8.2.12 开发一个旧的 Codeigniter 3.1.9 网站。我的问题是,是否可以将数据库中的搜索结果分成每页 20 个结果加上 2 个标题行,以使用 CI 分页编译整个页面?。

我的数据库中共有 58 条食谱记录,位于名为“recipe”的表中。在这个表中我有 14 个字段。不过,目前我的搜索中只包含 4 个。它们是 id、名称、类别和子类别。

我遇到的问题是,无论搜索什么,都没有结果行限制搜索结果的长度。因此,假设有人搜索像“菜谱”这样通用的内容,搜索将返回每个菜谱记录。这就是我想要的,但我更希望搜索能够处理这个问题,而不是一次显示所有 58 条记录。

所以,这让我想到了我的问题:如何让我的搜索结果将结果输出到一次最多包含 19 个结果行的容器中,并且能够逐页查看其余结果?

我已经在我的管理部分使用 CI 的分页来制作食谱活页簿。然而,这是根据每个食谱的所有字段设置的。

我对 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'] = 9; // You will see 10 numerical link buttons in pagination.
 $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');  //modify here:        
  //$results = $this->recipe_model->search($search);
  $page = $this->uri->segment(3);
  $perPage = 19;
  $this->load->library('pagination');   
  $config['base_url'] = site_url('recipe/search');
  $config['total_rows'] = $this->recipe_model->num_rows();
  $config['uri_segment'] = '3';
  $config['per_page'] = 1;
  $config['num_links'] = 4; // You will see 10 numerical link buttons in pagination.
  $config['display_pages'] = TRUE;
  $config['full_tag_open'] = '<div id="pagination" class="grid-item3">';
  $config['full_tag_close'] = '</div>';    
  $this->pagination->initialize($config);  
  $results = $this->recipe_model->search($search, $page, $perPage);
  $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, $currentPage = 1, $perPage = 19){ 
  $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();
 }

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>
   <?php echo $this->pagination->create_links(); ?>
  </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>

Pagination.php 库

<?php
 
 defined('BASEPATH') OR exit('No direct script access allowed');

 /*
  * Pagination Class
  * @package CodeIgniter
  * @subpackage Libraries
  * @category Pagination
  * @author EllisLab Dev Team
  * @link https://codeigniter.com/user_guide/libraries/pagination.html
 */
 
 class CI_Pagination{

  /*
   * Base URL
   * The page that we're linking to
   * @var string
  */
  
  protected $base_url = '';

  /*
   * Prefix
   * @var string
  */
  
  protected $prefix = '';

  /*
   * Suffix
   * @var string
  */
  
  protected $suffix = '';

  /*
   * Total number of items
   * @var int
  */
  
  protected $total_rows = 0;

  /*
   * Number of links to show
   * Relates to "digit" type links shown before/after the currently viewed page.
   * @var int
  */
  
  protected $num_links = 2;

  /*
   * Items per page
   * @var int
  */
  
  public $per_page = 10;

  /*
   * Current page
   * @var int
  */
  
  public $cur_page = 0;

  /*
   * Use page numbers flag
   * Whether to use actual page numbers instead of an offset
   * @var bool
  */
  
  protected $use_page_numbers = FALSE;

  /*
   * First link
   * @var string
  */
  
  protected $first_link = '&lsaquo; First';

  /*
   * Next link
   * @var string
  */
  
  protected $next_link = '&gt;';

  /*
   * Previous link
   * @var string
  */
  
  protected $prev_link = '&lt;';

  /*
   * Last link
   * @var string
  */
  
  protected $last_link = 'Last &rsaquo;';

  /*
   * URI Segment
   * @var int
  */
  
  protected $uri_segment = 0;

  /*
   * Full tag open
   * @var string
  */
  
  protected $full_tag_open = '';

  /*
   * Full tag close
   * @var string
  */
  
  protected $full_tag_close = '';

  /*
   * First tag open
   * @var string
  */
  
  protected $first_tag_open = '';

  /*
   * First tag close
   * @var string
  */
  
  protected $first_tag_close = '';

  /*
   * Last tag open
   * @var string
  */
  
  protected $last_tag_open = '';

  /*
   * Last tag close
   * @var string
  */
  
  protected $last_tag_close = '';

  /*
   * First URL
   * An alternative URL for the first page
   * @var string
  */
  
  protected $first_url = '';

  /*
   * Current tag open
   * @var string
  */
  
  protected $cur_tag_open = '<strong>';

  /*
   * Current tag close
   * @var string
  */
  
  protected $cur_tag_close = '</strong>';

  /*
   * Next tag open
   * @var string
  */
  
  protected $next_tag_open = '';

  /*
   * Next tag close
   * @var string
  */
  
  protected $next_tag_close = '';

  /*
   * Previous tag open
   * @var string
  */
  
  protected $prev_tag_open = '';

  /*
   * Previous tag close
   * @var string
  */
  
  protected $prev_tag_close = '';

  /*
   * Number tag open
   * @var string
  */
  
  protected $num_tag_open = '';

  /*
   * Number tag close
   * @var string
  */
  
  protected $num_tag_close = '';

  /*
   * Page query string flag
   * @var bool
  */
  
  protected $page_query_string = FALSE;

  /*
   * Query string segment
   * @var string
  */
  
  protected $query_string_segment = 'per_page';

  /*
   * Display pages flag
   * @var bool
  */
  
  protected $display_pages = TRUE;

  /*
   * Attributes
   * @var string
  */
  
  protected $_attributes = '';

  /*
   * Link types
   * "rel" attribute
   * @see CI_Pagination::_attr_rel()
   * @var array
  */
  
  protected $_link_types = array();

  /*
   * Reuse query string flag
   * @var bool
  */
  
  protected $reuse_query_string = FALSE;

  /*
   * Use global URL suffix flag
   * @var bool
  */
  
  protected $use_global_url_suffix = FALSE;

  /*
   * Data page attribute
   * @var string
  */
  
  protected $data_page_attr = 'data-ci-pagination-page';

  /*
   * CI Singleton
   * @var object
  */
  
  protected $CI;

  /*
   * Constructor
   * @param array $params Initialization parameters
   * @return void
  */
  
  public function __construct($params = array()){
   $this->CI =& get_instance();
   $this->CI->load->language('pagination');
   foreach(array('first_link', 'next_link', 'prev_link', 'last_link') as $key){
    if(($val = $this->CI->lang->line('pagination_'.$key)) !== FALSE){
     $this->$key = $val;
    }
   }
   
   /*
    * _parse_attributes(), called by initialize(), needs to run at least once in order to enable "rel" attributes, 
    * and this triggers it.
   */
   
   isset($params['attributes']) OR $params['attributes'] = array();
   $this->initialize($params);
   log_message('info', 'Pagination Class Initialized');
  }

  /*
   * Initialize Preferences
   * @param array $params Initialization parameters
   * @return CI_Pagination
  */
  
  public function initialize(array $params = array()){
   if(isset($params['attributes']) && is_array($params['attributes'])){
    $this->_parse_attributes($params['attributes']);
    unset($params['attributes']);
   }
   
   /*
    * Deprecated legacy support for the anchor_class option
    * Should be removed in CI 3.1+
   */
   
   if(isset($params['anchor_class'])){
    empty($params['anchor_class']) OR $attributes['class'] = $params['anchor_class'];
    unset($params['anchor_class']);
   }
   foreach($params as $key => $val){
    if(property_exists($this, $key)){
     $this->$key = $val;
    }
   }
   if($this->CI->config->item('enable_query_strings') === TRUE){
    $this->page_query_string = TRUE;
   }
   if($this->use_global_url_suffix === TRUE){
    $this->suffix = $this->CI->config->item('url_suffix');
   }
   return $this;
  }

  /*
   * Generate the pagination links
   * @return string
  */
  
  public function create_links(){
   
   /*
    * If our item count or per_page total is zero there is no need to continue.
    * Note: DO NOT change the operator to === here!
   */
   
   if($this->total_rows == 0 OR $this->per_page == 0){
    return '';
   }

   /* Calculate the total number of pages */
   
   $num_pages = (int) ceil($this->total_rows / $this->per_page);
   
   /* Is there only one page? Hm... nothing more to do here then. */
   
   if($num_pages === 1){
    return '';
   }

   /* Check the user defined number of links. */
   
   $this->num_links = (int) $this->num_links;
   if($this->num_links < 0){
    show_error('Your number of links must be a non-negative number.');
   }
   
   /*
    * Keep any existing query string items.
    * Note: Has nothing to do with any other query string option.
   */
   
   if($this->reuse_query_string === TRUE){
    $get = $this->CI->input->get();
    
    /* Unset the control, method, old-school routing options */
    
    unset($get['c'], $get['m'], $get[$this->query_string_segment]);
   }
   else{
    $get = array();
   }
   
   /*
    * Put together our base and first URLs.
    * Note: DO NOT append to the properties as that would break successive calls
   */
   
   $base_url = trim($this->base_url);
   $first_url = $this->first_url;
   $query_string = '';
   $query_string_sep = (strpos($base_url, '?') === FALSE) ? '?' : '&amp;';
   
   /* Are we using query strings? */
   
   if($this->page_query_string === TRUE){
    
    /* If a custom first_url hasn't been specified, we'll create one from the base_url, but without the page item. */
    
    if($first_url === ''){
     $first_url = $base_url;
     
     /* If we saved any GET items earlier, make sure they're appended. */
     
     if( ! empty($get)){
      $first_url .= $query_string_sep.http_build_query($get);
     }
    }
    
    /* Add the page segment to the end of the query string, where the page number will be appended. */
    
    $base_url .= $query_string_sep.http_build_query(array_merge($get, array($this->query_string_segment => '')));
   }
   else{
    
    /*
     * Standard segment mode.
     * Generate our saved query string to append later after the page number.
    */
    
    if( ! empty($get)){
     $query_string = $query_string_sep.http_build_query($get);
     $this->suffix .= $query_string;
    }

    /*
     * Does the base_url have the query string in it?
     * If we're supposed to save it, remove it so we can append it later.
    */
    
    if($this->reuse_query_string === TRUE && ($base_query_pos = strpos($base_url, '?')) !== FALSE){
     $base_url = substr($base_url, 0, $base_query_pos);
    }
    if($first_url === ''){
     $first_url = $base_url.$query_string;
    }
    $base_url = rtrim($base_url, '/').'/';
   }
   
   /* Determine the current page number. */
   
   $base_page = ($this->use_page_numbers) ? 1 : 0;
   
   /* Are we using query strings? */
   
   if($this->page_query_string === TRUE){
    $this->cur_page = $this->CI->input->get($this->query_string_segment);
   }
   elseif(empty($this->cur_page)){
    
    /* Default to the last segment number if one hasn't been defined. */
    
    if($this->uri_segment === 0){
     $this->uri_segment = count($this->CI->uri->segment_array());
    }
    $this->cur_page = $this->CI->uri->segment($this->uri_segment);
    
    /* Remove any specified prefix/suffix from the segment. */
    
    if($this->prefix !== '' OR $this->suffix !== ''){
     $this->cur_page = str_replace(array($this->prefix, $this->suffix), '', $this->cur_page);
    }
   }
   else{
    $this->cur_page = (string) $this->cur_page;
   }
   
   /* If something isn't quite right, back to the default base page. */
   
   if(!ctype_digit((string)$this->cur_page) OR ($this->use_page_numbers && (int) $this->cur_page === 0)){
    $this->cur_page = $base_page;
   }
   else{
    
    /* Make sure we're using integers for comparisons later. */
    
    $this->cur_page = (int) $this->cur_page;
   }
   
   /*
    * Is the page number beyond the result range?
    * If so, we show the last page.
   */
   
   if($this->use_page_numbers){
    if($this->cur_page > $num_pages){
     $this->cur_page = $num_pages;
    }
   }
   elseif($this->cur_page > $this->total_rows){
    $this->cur_page = ($num_pages - 1) * $this->per_page;
   }
   $uri_page_number = $this->cur_page;
   
   /*
    * If we're using offset instead of page numbers, convert it to a page number, so we can generate the surrounding 
    * number links.
   */
   
   if( ! $this->use_page_numbers){
    $this->cur_page = (int) floor(($this->cur_page/$this->per_page) + 1);
   }
   
   /* Calculate the start and end numbers. These determine which number to start and end the digit links with. */
   
   $start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1):1;
   $end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links:$num_pages;
   
   /* And here we go... */
   
   $output = '';
   
   /* Render the "First" link. */
   
   if($this->first_link !== FALSE && $this->cur_page > ($this->num_links + 1 + ! $this->num_links)){
    
    /* Take the general parameters, and squeeze this pagination-page attr in for JS frameworks. */
    
    $attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, 1);
    $output .= $this->first_tag_open.'<a href="'.$first_url.'"'.$attributes.$this->_attr_rel('start').'>' 
               .$this->first_link.'</a>'.$this->first_tag_close;
   }
   
   /* Render the "Previous" link. */
   
   if($this->prev_link !== FALSE && $this->cur_page !== 1){
    $i = ($this->use_page_numbers) ? $uri_page_number - 1:$uri_page_number - $this->per_page;
    $attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, ($this->cur_page - 1));
    if($i === $base_page){
     
     /* First page */
     
     $output .= $this->prev_tag_open.'<a href="'.$first_url.'"'.$attributes.$this->_attr_rel('prev').'>'
                .$this->prev_link.'</a>'.$this->prev_tag_close;
    }
    else{
     $append = $this->prefix.$i.$this->suffix;
     $output .= $this->prev_tag_open.'<a href="'.$base_url.$append.'"'.$attributes.$this->_attr_rel('prev').'>'
                .$this->prev_link.'</a>'.$this->prev_tag_close;
    }
   }
   
   /* Render the pages */
   
   if($this->display_pages !== FALSE){
    
    /* Write the digit links */
    
    for($loop = $start - 1; $loop <= $end; $loop++){
     $i = ($this->use_page_numbers) ? $loop : ($loop * $this->per_page) - $this->per_page;
     $attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, $loop);
     if($i >= $base_page){
      if($this->cur_page === $loop){
       
       /* Current page */
       
       $output .= $this->cur_tag_open.$loop.$this->cur_tag_close;
      }
      elseif($i === $base_page){
       
       /* First page */
       
       $output .= $this->num_tag_open.'<a href="'.$first_url.'"'.$attributes.$this->_attr_rel('start').'>'
               .$loop.'</a>'.$this->num_tag_close;
      }
      else{
       $append = $this->prefix.$i.$this->suffix;
       $output .= $this->num_tag_open.'<a href="'.$base_url.$append.'"'.$attributes.'>'
                  .$loop.'</a>'.$this->num_tag_close;
      }
     }
    }
   }
   
   /* Render the "next" link */
   
   if($this->next_link !== FALSE && $this->cur_page < $num_pages){
    $i = ($this->use_page_numbers) ? $this->cur_page + 1 : $this->cur_page * $this->per_page;
    $attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, $this->cur_page + 1);
    $output .= $this->next_tag_open.'<a href="'.$base_url.$this->prefix.$i.$this->suffix.'"'.$attributes
               .$this->_attr_rel('next').'>'.$this->next_link.'</a>'.$this->next_tag_close;
   }

   /* Render the "Last" link */
   
   if($this->last_link !== FALSE && ($this->cur_page + $this->num_links + ! $this->num_links) < $num_pages){
    $i = ($this->use_page_numbers) ? $num_pages : ($num_pages * $this->per_page) - $this->per_page;
    $attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, $num_pages);
    $output .= $this->last_tag_open.'<a href="'.$base_url.$this->prefix.$i.$this->suffix.'"'.$attributes.'>'
               .$this->last_link.'</a>'.$this->last_tag_close;
   }
   
   /* 
    * Kill double slashes. 
    * Note: Sometimes we can end up with a double slash in the penultimate link so we'll kill all double slashes. 
   */
   
   $output = preg_replace('#([^:"])//+#', '\\1/', $output);
   
   /* Add the wrapper HTML if exists */
   
   return $this->full_tag_open.$output.$this->full_tag_close;
  }

  /*
   * Parse attributes
   * @param array $attributes
   * @return void
  */
  
  protected function _parse_attributes($attributes){
   isset($attributes['rel']) OR $attributes['rel'] = TRUE;
   $this->_link_types = ($attributes['rel']) ? array('start' => 'start', 'prev' => 'prev', 'next' => 'next'):array();
   unset($attributes['rel']);
   $this->_attributes = '';
   foreach($attributes as $key => $value){
    $this->_attributes .= ' '.$key.'="'.$value.'"';
   }
  }

  /*
   * Add "rel" attribute
   * @link http://www.w3.org/TR/html5/links.html#linkTypes
   * @param string $type
   * @return string
  */
  
  protected function _attr_rel($type){
   if (isset($this->_link_types[$type])){
    unset($this->_link_types[$type]);
    return ' rel="'.$type.'"';
   }
   return '';
  }
 }
 
 // End of Pagination.php
 
?>

更新:2024 年 10 月 29 日 我已根据 alireza.2281 的建议将帖子中的所有代码更新为当前代码。

我还包含了分页库的完整代码。

当前状态: 我现在初始加载 19 行结果,并且 CI 分页加载到页面上,但当我单击任何编号链接时会引发错误。错误如下:

An uncaught Exception was encountered

Type: TypeError

Message: count(): Argument #1 ($value) must be of type Countable|array, null given

Filename: C:\xampp\htdocs\shirleysrecipesupdate\application\controllers\Recipe.php

Line Number: 17

Backtrace:

File: C:\xampp\htdocs\shirleysrecipesupdate\index.php
Line: 316
Function: require_once
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();
}

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

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

编辑:只需替换模型文件中的上述函数,控制器应更改为:

    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');  //modify here:        
    //$results = $this->recipe_model->search($search);
    $page=$this->uri->segment(3);
    $perPage=15;
    $results = $this->recipe_model->search($search, $page, $perPage);
    $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');
   }
  }  
© www.soinside.com 2019 - 2024. All rights reserved.