帝国论坛帝国网站管理系统交流区帝国CMS使用交流[分享]帝国CMS 8.0 高级搜索分页与数量限制问题完整解决方案 【本版专题贴子】  
主题:[分享]帝国CMS 8.0 高级搜索分页与数量限制问题完整解决方案 [加入收藏夹]   

xiaojiekk
用户头衔:秀才

精华贴   :0
发贴数   :75
经验值   :532
注册时间:2016-05-13
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 1 楼]
[分享]帝国CMS 8.0 高级搜索分页与数量限制问题完整解决方案
一、问题发现
在将帝国CMS从7.5版本升级到8.0后,发现高级搜索出现两个严重问题:

搜索结果数量被限制:数据库明明有几万条数据,搜索结果却始终只有274条,后台设置的“搜索结果数量限制”完全不生效。

大页码无法显示:搜索结果有857页,但只能点到198页,之后的页码均提示“没有搜索到相关的内容”。

二、问题排查过程
2.1 搜索结果数量限制问题
通过追踪代码发现,/e/search/index.php 中调用了 eSqlToGetids 函数:

$getids_r = eSqlToGetids($queryids, 0, $public_r['searchupnum'], 3000, 1);
PHP
该函数有两个限制条件:

$maxnum:后台设置的搜索数量限制(如1000条)

$maxlen:字符串长度限制(默认3000字符)

问题根源:$maxlen=3000 的字符长度限制优先级高于后台设置,且 $mustlen=1 导致每个ID被填充空格到固定10位,空间利用率只有60%,实际能存储的ID数量远低于预期。

2.2 大页码无法显示问题
通过追踪代码发现,/e/search/result/index.php 中调用了 eGetidsLimitMlen 函数:

$pageids = eGetidsLimitMlen($search_r['andsql'], 10, $line, $page, 1);
PHP
该函数通过字符串截取方式实现分页,当页码较大时计算偏移量出错,导致返回空值。

问题根源:字符串截取方式在处理大数据量和大页码时不稳定,且 andsql 字段类型为 text(最大65535字符),无法存储完整的ID列表。

三、解决方案
3.1 修改 /e/search/index.php
找到代码(约第236行):

$getids_r = eSqlToGetids($queryids, 0, $public_r['searchupnum'], 3000, 1);
PHP
修改为:

//--yeskylog_modify $maxlen限制增大到500000 存储约80000+条5位数ID 取消$mustlen占位符 2026/6/11
$getids_r = eSqlToGetids($queryids, 0, $public_r['searchupnum'], 500000, 0);
PHP
修改说明:

参数        原值        新值        作用
第4个参数        3000        500000        增大字符串长度限制
第5个参数        1        0        取消ID空格填充
3.2 修改 /e/search/result/index.php
找到代码(约第46-56行):

//ids

$pageids=eGetidsLimitMlen($search_r['andsql'],10,$line,$page,1);
if(!$pageids)
{
    printerror("SearchNotRecord",$getfrom,1);
}
$query="select * from {$dbtbpre}ecms_".$search_r['tbname']." where id in (".$pageids.")";

//$query.=" order by ".$myorder."".do_dblimit($line,$offset);
$query.=" order by ".$myorder."";
PHP
修改为:

//--yeskylog_modify ids - 取消eGetidsLimitMlen函数返回ID列表(固定字符) 直接数组分割分页 2026/6/11

$ids_clean = str_replace(' ', '', $search_r['andsql']);
$id_arr = explode(',', $ids_clean);
$total_ids = count($id_arr);

$start = $page * $line;
if ($start >= $total_ids) {
    printerror("SearchNotRecord", $getfrom, 1);
}

$page_ids = array_slice($id_arr, $start, $line);
if (empty($page_ids)) {
    printerror("SearchNotRecord", $getfrom, 1);
}

$pageids = implode(',', $page_ids);

$query = "select * from {$dbtbpre}ecms_" . $search_r['tbname'] . " where id in (" . $pageids . ")";
$query .= " order by " . $myorder;

//--yeskylog_modify ids - 取消eGetidsLimitMlen函数返回ID列表(固定字符) 直接数组分割分页 2026/6/11
PHP
3.3 升级数据库字段类型
执行SQL,将 andsql 字段从 text 升级为 mediumtext:

ALTER TABLE `{$dbtbpre}enewssearch` MODIFY COLUMN `andsql` MEDIUMTEXT;
SQL
字段容量对比:

字段类型        最大字符数        可存5位数ID数量
text        65,535        约10,900条
mediumtext        16,777,215        约2,796,000条
四、修改前后对比
问题        修改前        修改后
搜索结果数量        最多274条        按后台设置正常显示
分页支持        最多198页        支持全部857页
国产数据库兼容        依赖复杂函数        ✅ 完全兼容
andsql 字段类型        text(65535字符)        mediumtext(16MB)
五、国产数据库兼容性说明
新方案的核心是使用 explode + array_slice 进行数组分割分页,生成的SQL为标准语法:

SELECT * FROM table WHERE id IN (id1,id2,id3,...) ORDER BY newstime DESC
SQL
该SQL所有数据库均支持:

MySQL / MariaDB

PostgreSQL

华为高斯 openGauss

金仓数据库 KingbaseES

瀚高数据库

六、总结
本次修改解决了帝国CMS 8.0高级搜索的两个核心问题:

搜索结果数量限制问题:通过调大 $maxlen 参数并取消ID空格填充,让后台设置真正生效。

大页码分页问题:用数组分割替代字符串截取,彻底解决了大页码报错问题。

修改后的代码不仅稳定可靠,而且完全兼容国产数据库,可满足信创项目部署要求。

原文地址https://www.yeskylog.com/ecms/201.html
修复的附件在下面
通过网盘分享的文件:e.zip
链接: https://pan.baidu.com/s/1g6rzLBd0C9Ck0d8b_KF_tg?pwd=9cim 提取码: 9cim 复制这段内容后打开百度网盘手机App,操作更方便哦

上传以下附件:
[下载 *.zip](文件大小:8.23 KB,下载次数:2)

[该贴被修改 3 次,最后修改时间 2026-06-12 00:04:39 ]


夜星空:http://www.yeskylog.com
AK资源网:http://www.akzyw.com
QQ:18707710
VX:yeskylog

2026-06-11 23:46:20 已设置保密 顶部 回复 引用 报告 编辑 删除

xiaojiekk
用户头衔:秀才

精华贴   :0
发贴数   :75
经验值   :532
注册时间:2016-05-13
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 2 楼]

顺便提一嘴8.0问题还挺多的 非必要站长不要升级7.5也够用了 8.0升级主要方向支持国产数据库  

针对部分企业强制信创项目部署要求改造 这是必须升级的,要不就使用其他支持国产化代替的程序



整理目前发现这三个问题

还有一个 “在原有的7.5版本升级到8.0版本使用升级包发生的采集表单问题(已经修复官方已经更新文件)”http://wtbbs.phome.net/ShowThread/?threadid=368146&forumid=42

[该贴被修改 2 次,最后修改时间 2026-06-12 00:51:22 ]


夜星空:http://www.yeskylog.com
AK资源网:http://www.akzyw.com
QQ:18707710
VX:yeskylog

2026-06-12 00:20:53 已设置保密 顶部 回复 引用 报告 编辑 删除

hibaidu
用户头衔:探花

精华贴   :0
发贴数   :4531
经验值   :13870
注册时间:2010-05-26
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 3 楼]

支持一下




2026-06-12 07:28:28 已设置保密 顶部 回复 引用 报告 编辑 删除

cighsen02
用户头衔:进士

精华贴   :0
发贴数   :1102
经验值   :4156
注册时间:2009-09-29
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 4 楼]

有需要的帝国7.5运行于php8.x,按php8.0以上语法改的完美运行。支持在线安装。官方的网站数据。

在线演示站:http://test.959602.com/3300/info/c31/

附图,多次迭代。容错更强。

上传以下图片:


[该贴被修改 1 次,最后修改时间 2026-06-12 09:42:36 ]


要上就上安心站长 www.axzz.cn q:365182575
2026-06-12 09:40:50 已设置保密 顶部 回复 引用 报告 编辑 删除

快速回复
内容

表情
使用EBB代码 使用smile代码 显示签名 自动分析url 自动分析img
     【进入高级模式】   (按 Ctrl+Enter 直接提交)
    顶部  加入收藏夹
关于帝国 | 广告服务 | 联系我们 | 法律声明 | 隐私条款 | 许可协议
Powered by: EBB Version 2.2.1