php搜索需分场景:数组用array_filter+strpos/stripos/preg_grep;数据库优先fulltext索引(innodb+alter table add fulltext),慎用like;用户搜索须校验输入、限制输出、防注入,中文推荐elasticsearch。

strpos() 和 LIKE 是入门最常踩坑的两个点——前者只管字符串内查找,后者一不留神就拖垮数据库。学 PHP 搜索功能,不是先背函数,而是分清场景:数组里找词、数据库里找记录、还是用户要搜文章? 三类问题对应三套解法,混用必出错。
数组里搜关键字,别用 array_search()
很多人一上来就试 array_search(),发现搜不到含关键词的字符串,比如在 ['apple pie', 'banana smoothie'] 里搜 'apple',它直接返回 false——因为 array_search() 只做全等匹配,不支持子串查找。
- 要用
array_filter()配strpos():array_filter($arr, fn($v) => strpos($v, $keyword) !== false) - 注意
strpos()返回0是合法位置,必须用!== false判断,写成!= false或直接if (strpos(...))会漏掉开头匹配 - 大小写敏感?加
stripos()替代strpos() - 要正则?直接上
preg_grep('/apple/i', $arr),比写回调干净
数据库搜索,LIKE 和 MATCH AGAINST 别乱切
LIKE '%关键词%' 在几千条数据里还能凑合,但一旦表里有 10 万行文章,每次搜索都全表扫描,CPU 瞬间拉满。而 MATCH(title, content) AGAINST('关键词') 要求字段提前建了 FULLTEXT 索引,没建索引直接报错或退化成慢查询。
- 建索引语句必须执行:
ALTER TABLE articles ADD FULLTEXT(title, content),且表引擎得是InnoDB(MyISAM 已淘汰) - 自然语言模式下,
AGAINST('php tutorial')会自动忽略停用词,但不会拆词;布尔模式加IN BOOLEAN MODE才支持+-*,比如AGAINST('+php -laravel' IN BOOLEAN MODE) - 用 PDO 预处理时,
AGAINST(?)不支持参数绑定,必须拼接字符串——但拼接前务必用htmlspecialchars()和正则过滤掉+->等控制符,否则布尔模式被注入
用户搜索页面,GET 表单 + $_GET['q'] 是默认起点
前端用 method="GET" 不是偷懒,是让 URL 可收藏、可分享、能被浏览器历史记录,也方便后续加缓存。但 $_GET['q'] 直接进 SQL 就是高危操作,哪怕加了 mysqli_real_escape_string() 也防不住布尔盲注。
- 第一步永远是清理输入:
$q = trim($_GET['q'] ?? ''),空值或纯空白直接return,避免全表扫 - 第二步决定走哪条路:长度
字且数据量小?走 <code>LIKE;否则优先推FULLTEXT;中文多?跳过 MySQL 原生,直连 Elasticsearch 或加ik分词器 - 第三步限制输出:
LIMIT 20必须写死在 SQL 末尾,不然用户改 URL 参数刷出全部数据,服务器扛不住 - 高亮显示关键词不能靠前端 JS 替换——PHP 里用
str_replace($q, "<mark>$q</mark>", $content)更可控,但记得先htmlspecialchars($content)再替换,否则 XSS
别碰“自己写倒排索引”这种事
看到教程里说“建 keywords 表 + article_keywords 关联表”,就以为这是进阶标志,其实这是早期 MySQL 没 FULLTEXT 或权限受限时的妥协方案。现在硬搞这套,你要手动维护索引一致性、处理更新/删除同步、实现 TF-IDF 排序……还没上线,代码量就超过业务本身。
- 小项目:老老实实用
FULLTEXT,够快够稳 - 中型内容站(日活 > 1 万):上 Elasticsearch,用官方
elasticsearch/elasticsearch包,DSL 查询比写 SQL 还直观 - 真要自研索引?先确认你已压测过
SELECT ... MATCH AGAINST在峰值 QPS 下的延迟,再谈优化
LIKE 能跑通不代表该用,FULLTEXT 建了不代表不用调参,Elasticsearch 装上了也不代表中文能搜对——每个环节的边界条件,比函数名难记十倍。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











