PHP框架搜索功能需依次完成关键词标准化、模糊查询构建、ES集成、手动分页及Laravel Scout分页:先清洗关键词并分词,再动态构造安全SQL或ES查询,最后通过COUNT/LIMIT或Scout自动实现分页。

如果您在PHP框架中需要实现搜索功能,关键词处理与结果分页是两个核心环节。以下是针对该需求的具体实施步骤:
一、关键词标准化处理
搜索前需对用户输入的关键词进行清洗和规范化,避免空格、特殊字符、SQL注入风险及大小写干扰,确保匹配逻辑稳定可靠。
1、使用trim()函数去除关键词首尾空白字符。
2、使用preg_replace()过滤掉连续空白符,将其统一替换为单个空格。
立即学习“PHP免费学习笔记(深入)”;
3、对关键词中的SQL敏感符号(如单引号、分号、--)执行转义或直接移除。
4、若框架支持,调用内置的escapeString()或quote()方法封装关键词。
5、将关键词按空格分割为词组数组,用于后续多字段模糊匹配或全文检索构造。
二、数据库层模糊查询构建
根据关键词数组生成动态WHERE条件,兼顾性能与匹配精度,避免全表扫描与低效LIKE通配符滥用。
1、对每个关键词词组,分别在标题、内容、标签等目标字段上构造LIKE '%关键词%' 条件。
2、使用OR连接同一关键词在不同字段的匹配条件,使用AND连接不同关键词的匹配条件。
3、若数据库为MySQL且字段已建FULLTEXT索引,改用MATCH ... AGAINST布尔模式查询提升效率。
4、在查询语句中显式添加ORDER BY相关度(如MATCH评分)或发布时间降序,增强结果合理性。
5、使用PDO预处理语句绑定参数,杜绝拼接SQL带来的安全风险。
三、Elasticsearch集成方案
当数据量较大或需支持拼音搜索、同义词、错别字容错时,可引入Elasticsearch作为独立搜索服务,PHP框架仅负责请求转发与响应解析。
1、安装elasticsearch-php官方客户端库,并配置连接集群地址与索引名称。
2、构建SearchRequest对象,设置query为multi_match,指定fields与type为best_fields。
3、启用fuzziness参数允许最多1个字符编辑距离,提升用户输入容错能力。
4、在request中添加highlight选项,使返回结果包含高亮的关键词HTML片段。
5、将ES返回的_source数据映射为框架模型实例,保持业务逻辑一致性。
四、结果集手动分页实现
在不依赖ORM自动分页功能的前提下,通过SQL LIMIT与OFFSET精确控制每页数据范围,适用于自定义复杂查询场景。
1、先执行COUNT(*)子查询,统计满足关键词条件的总记录数。
2、根据当前页码($page)与每页条数($perPage),计算OFFSET值:($page - 1) * $perPage。
3、主查询中添加LIMIT $perPage OFFSET $offset语句,获取当前页数据。
4、将总数、当前页、每页条数、总页数等信息封装为分页元数据数组。
5、在视图中遍历数据列表,并渲染分页控件链接,URL参数保留原始关键词与页码。
五、基于Laravel Scout的轻量级分页集成
若项目使用Laravel框架,可借助Scout扩展包对接Algolia、Meilisearch或数据库驱动,实现一行代码启用搜索与分页。
1、运行php artisan scout:install安装Scout并发布配置文件。
2、在对应Eloquent模型中添加Searchable接口及toSearchableArray()方法定义索引字段。
3、执行php artisan scout:import App\Models\Article同步已有数据至搜索引擎。
4、在控制器中调用Article::search('关键词')->paginate(15),自动返回LengthAwarePaginator实例。
5、在Blade模板中使用{{$articles->links()}}渲染分页导航,无需手动构造URL参数。











