phpcms 搜索结果第一页比设定的多一条数据的解决办法

2021-01-05 浏览:4380
phpcms 搜索结果第一页比设定的多一条数据的解决办法
评论:(1)复制地址

phpcms新增了分页代码,但是不会到是不是修改程序的问题,搜索结果第一页总是比设置的每页数量多一条,现在修改如下


模板页面代码

{loop $data_search $i $v}
            <article class="column column column--xs-6 column--md-4 product">
              <div class="product__content">
                <header class="product__header">
                  <h2 class="product__title"> <a href="{$v[url]}" title="{$v[title]}">{$v[title]}</a> </h2>
                  <span class="product__meta product__meta--pricing">
                  <span class="product__price" itemprop="price"></span> </span>
                </header>
              </div>
            </article>
            {/loop}
            {if empty($data_search)}未找到结果{/if}

<nav class="pagination" role="navigation">{$new_pages}</nav>


这个代码中新增了分页代码样式,具体看《phpcms新增分页样式修改


phpcms\modules\search\index.php 代码修改如下,通过第35行的pagesize控制每页数量

<?php
defined( 'IN_PHPCMS' )or exit( 'No permission resources.' );
pc_base::load_sys_class( 'form', '', 0 );
pc_base::load_sys_class( 'format', '', 0 );
class index {
  function __construct() {
    $this->db = pc_base::load_model( 'search_model' );
    $this->content_db = pc_base::load_model( 'content_model' );
  }

  /**
   * 关键词搜索
   */
  public function init() {
    //获取siteid
    $siteid = isset( $_REQUEST[ 'siteid' ] ) && trim( $_REQUEST[ 'siteid' ] ) ? intval( $_REQUEST[ 'siteid' ] ) : 1;
    $SEO = seo( $siteid );

    //搜索配置
    $search_setting = getcache( 'search' );
    $setting = $search_setting[ $siteid ];

    $search_model = getcache( 'search_model_' . $siteid );
    $type_module = getcache( 'type_module_' . $siteid );

    if ( isset( $_GET[ 'q' ] ) ) {
      if ( trim( $_GET[ 'q' ] ) == '' ) {
        header( 'Location: ' . APP_PATH . 'index.php?m=search' );
        exit;
      }
      $catid = $_GET[ 'catid' ] ? " AND catid = '$_GET[catid]'" : '';
      $typeid = empty( $_GET[ 'typeid' ] ) ? 48 : intval( $_GET[ 'typeid' ] );
      $time = empty( $_GET[ 'time' ] ) || !in_array( $_GET[ 'time' ], array( 'all', 'day', 'month', 'year', 'week' ) ) ? 'all' : trim( $_GET[ 'time' ] );
      $page = isset( $_GET[ 'page' ] ) ? intval( $_GET[ 'page' ] ) : 1;
      $pagesize = 3;
      $q = safe_replace( trim( $_GET[ 'q' ] ) );
      $q = new_html_special_chars( strip_tags( $q ) );
      $q = str_replace( '%', '', $q ); //过滤'%',用户全文搜索
      $search_q = $q; //搜索原内容

      //按时间搜索
      if ( $time == 'day' ) {
        $search_time = SYS_TIME - 86400;
        $sql_time = ' AND adddate > ' . $search_time;
      } elseif ( $time == 'week' ) {
        $search_time = SYS_TIME - 604800;
        $sql_time = ' AND adddate > ' . $search_time;
      } elseif ( $time == 'month' ) {
        $search_time = SYS_TIME - 2592000;
        $sql_time = ' AND adddate > ' . $search_time;
      } elseif ( $time == 'year' ) {
        $search_time = SYS_TIME - 31536000;
        $sql_time = ' AND adddate > ' . $search_time;
      } else {
        $search_time = 0;
        $sql_time = '';
      }
      if ( $page == 1 && !$setting[ 'sphinxenable' ] ) {
        //精确搜索
        //$commend = $this->db->get_one("`typeid` = '$typeid' $sql_time AND `data` like '%$q%'");
        $commend = $this->db->get_one( "`typeid` = '$typeid' $sql_time $catid AND `data` like '%$q%'" );
      } else {
        $commend = '';
      }
      //如果开启sphinx
      if ( $setting[ 'sphinxenable' ] ) {
        $sphinx = pc_base::load_app_class( 'search_interface', '', 0 );
        $sphinx = new search_interface();

        $offset = $pagesize * ( $page - 1 );
        $res = $sphinx->search( $q, array( $siteid ), array( $typeid ), array( $search_time, SYS_TIME ), $offset, $pagesize, '@weight desc' );
        $totalnums = $res[ 'total' ];
        //如果结果不为空
        if ( !empty( $res[ 'matches' ] ) ) {
          $result = $res[ 'matches' ];
        }
      } else {
        pc_base::load_sys_class( 'segment', '', 0 );
        $segment = new segment();
        //分词结果
        $segment_q = $segment->get_keyword( $segment->split_result( $q ) );
        //如果分词结果为空
        if ( !empty( $segment_q ) ) {
          $sql = "`siteid`= '$siteid' AND `typeid` = '$typeid' $catid $sql_time AND MATCH (`data`) AGAINST ('$segment_q' IN BOOLEAN MODE)";
        } else {
          $sql = "`siteid`= '$siteid' AND `typeid` = '$typeid' $catid $sql_time AND `data` like '%$q%'";
        }
        $result = $this->db->listinfo( $sql, 'searchid DESC', $page, $pagesize );
          //var_dump($result);
      }

      //如果开启相关搜索功能
      if ( $setting[ 'relationenble' ] ) {
        //如果关键词长度在8-16之间,保存关键词作为relation search
        $this->keyword_db = pc_base::load_model( 'search_keyword_model' );

        if ( strlen( $q ) < 17 && strlen( $q ) > 5 && !empty( $segment_q ) ) {
          $res = $this->keyword_db->get_one( array( 'keyword' => $q ) );
          if ( $res ) {
            //关键词搜索数+1
            //$this->keyword_db->update(array('searchnums'=>'+=1'), array('keyword'=>$q));
          } else {
            //关键词转换为拼音
            pc_base::load_sys_func( 'iconv' );
            $pinyin = gbk_to_pinyin( $q );
            if ( is_array( $pinyin ) ) {
              $pinyin = implode( '', $pinyin );
            }
            $this->keyword_db->insert( array( 'keyword' => $q, 'searchnums' => 1, 'data' => $segment_q, 'pinyin' => $pinyin ) );
          }
        }
        //相关搜索
        if ( !empty( $segment_q ) ) {
          $relation_q = str_replace( ' ', '%', $segment_q );
        } else {
          $relation_q = $q;
        }
        $relation = $this->keyword_db->select( "MATCH (`data`) AGAINST ('%$relation_q%' IN BOOLEAN MODE)", '*', 10, 'searchnums DESC' );
      }

      //如果结果不为空
      if ( !empty( $result ) || !empty( $commend[ 'id' ] ) ) {
        //开启sphinx后文章id取法不同
        if ( $setting[ 'sphinxenable' ] ) {
          foreach ( $result as $_v ) {
            $sids[] = $_v[ 'attrs' ][ 'id' ];
          }
        } else {
          foreach ( $result as $_v ) {
            $sids[] = $_v[ 'id' ];
          }
        }

        if ( !empty( $commend[ 'id' ] ) ) {
          $sids[] = $commend[ 'id' ];
        }
        $sids = array_unique( $sids );

        $where = to_sqls( $sids, '', 'id' );
        //获取模型id
        $model_type_cache = getcache( 'type_model_' . $siteid, 'search' );
        $model_type_cache = array_flip( $model_type_cache );
        $modelid = $model_type_cache[ $typeid ];

        //是否读取其他模块接口
        if ( $modelid ) {
          $this->content_db->set_model( $modelid );

          /**
           * 如果表名为空,则为黄页模型
           */
          if ( empty( $this->content_db->model_tablename ) ) {
            $this->content_db = pc_base::load_model( 'yp_content_model' );
            $this->content_db->set_model( $modelid );

          }

          if ( $setting[ 'sphinxenable' ] ) {
            $data_search = $this->content_db->listinfo( $where, 'id DESC', 1, $pagesize );
            $pages = pages( $totalnums, $page, $pagesize );
            $new_pages = new_pages( $totalnums, $page, $pagesize );
          } else {
            //$data_search = $this->content_db->select( $where, '*' );
            $data_search = $this->content_db->select( $where, '*', $pagesize, $order = 'id DESC' );
            $pages = $this->db->pages;
            $new_pages = $this->db->new_pages;
            $totalnums = $this->db->number;
          }

          //如果分词结果为空
          if ( !empty( $segment_q ) ) {
            $replace = explode( ' ', $segment_q );
            foreach ( $replace as $replace_arr_v ) {
              $replace_arr[] = '<font color=red>' . $replace_arr_v . '</font>';
            }
            foreach ( $data_search as $_k => $_v ) {
              $data_search[ $_k ][ 'title' ] = str_replace( $replace, $replace_arr, $_v[ 'title' ] );
              $data_search[ $_k ][ 'description' ] = str_replace( $replace, $replace_arr, $_v[ 'description' ] );
            }
          } else {
            foreach ( $data_search as $_k => $_v ) {
              $data_search[ $_k ][ 'title' ] = str_replace( $q, '<font color=red>' . $q . '</font>', $_v[ 'title' ] );
              $data_search[ $_k ][ 'description' ] = str_replace( $q, '<font color=red>' . $q . '</font>', $_v[ 'description' ] );
            }
          }
        } else {
          //读取专辑搜索接口
          $special_api = pc_base::load_app_class( 'search_api', 'special' );
          $data_search = $special_api->get_search_data( $sids );
          $totalnums = count( $data_search );
        }
      }
      $execute_time = execute_time();
      $pages = isset( $pages ) ? $pages : '';
      $new_pages = isset( $new_pages ) ? $new_pages : '';
      $totalnums = isset( $totalnums ) ? $totalnums : 0;
      $data_search = isset( $data_search ) ? $data_search : '';

      include template( 'search', 'list' );
    } else {
      include template( 'search', 'index' );
    }
  }


  public function public_get_suggest_keyword() {
    $url = $_GET[ 'url' ] . '&q=' . $_GET[ 'q' ];
    $trust_url = array( 'c8430fcf851e85818b546addf5bc4dd3' );
    $urm_md5 = md5( $url );
    if ( !in_array( $urm_md5, $trust_url ) )exit;

    $res = @file_get_contents( $url );
    if ( CHARSET != 'gbk' ) {
      $res = iconv( 'gbk', CHARSET, $res );
    }
    echo $res;
  }

  /**
   * 提示搜索接口
   * TODO 暂时未启用,用的是google的接口
   */
  public function public_suggest_search() {
    //关键词转换为拼音
    pc_base::load_sys_func( 'iconv' );
    $pinyin = gbk_to_pinyin( $q );
    if ( is_array( $pinyin ) ) {
      $pinyin = implode( '', $pinyin );
    }
    $this->keyword_db = pc_base::load_model( 'search_keyword_model' );
    $suggest = $this->keyword_db->select( "pinyin like '$pinyin%'", '*', 10, 'searchnums DESC' );

    foreach ( $suggest as $v ) {
      echo $v[ 'keyword' ] . "\n";
    }


  }
  /**
   * 栏目搜索 20200218 by miaojingyun
   */
  public function searchcat() {
    //获取siteid
    $siteid = isset( $_REQUEST[ 'siteid' ] ) && trim( $_REQUEST[ 'siteid' ] ) ? intval( $_REQUEST[ 'siteid' ] ) : 1;
    $SEO = seo( $siteid );
    $this->category_db = pc_base::load_model( 'category_model' );
    if ( isset( $_GET[ 'q' ] ) ) {
      if ( trim( $_GET[ 'q' ] ) == '' ) {
        //header('Location: '.APP_PATH.'index.php?m=search');
        echo "<script>alert('搜索内容不能为空');</script>";
        exit;
      }
      $parentid = empty( $_GET[ 'parentid' ] ) ? 48 : intval( $_GET[ 'parentid' ] );
      $page = isset( $_GET[ 'page' ] ) ? intval( $_GET[ 'page' ] ) : 1;
      $pagesize = isset( $_GET[ 'pagesize' ] ) ? intval( $_GET[ 'pagesize' ] ) : 10;
      $tempname = safe_replace( trim( $_GET[ 'tempname' ] ) );
      $q = safe_replace( trim( $_GET[ 'q' ] ) );
      $q = new_html_special_chars( strip_tags( $q ) );
      $q = str_replace( '%', '', $q ); //过滤'%',用户全文搜索
      $search_q = $q; //搜索原内容
      if ( empty( $_GET[ 'tempname' ] ) ) {
        $tempname = catlist;
      }

      $where = "FIND_IN_SET($parentid,arrparentid) AND `child` = 0 AND `catname` like '%$search_q%'";
      $data_scat = $this->category_db->listinfo( $where, 'catid DESC', $page, $pagesize );
      $pages = $this->category_db->pages;
      $totalnums = $this->category_db->number;
      $execute_time = execute_time();
      $data_scat = isset( $data_scat ) ? $data_scat : '';
      //print_r($data_scat);
      include template( 'search', $tempname );
    } else {
      echo "<script>alert('搜索内容不能为空');</script>";
      exit;
    }
  }
}
?>


评论:(1)复制地址
发布:苗景云 | 分类:IT技术&设计 | Tags:phpcms 搜索 分页

评论列表:

新闻头条

评论于2021-05-18 21:34:20
文章不错交个朋友 - 回复该评论

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。