You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Summernote编辑器时,如何对经htmlspecialchars编码的字段执行LIKE查询?

解决HTML编码字段的LIKE搜索问题

我之前也碰到过一模一样的场景——用htmlspecialchars存富文本内容,后来要做搜索功能踩了不少坑,这里给你两个实用的解决方案,结合PDO的写法一起说明:

方案1:对搜索关键词做相同编码后匹配

这是最推荐的方案,因为它能利用数据库的索引(如果字段建了索引的话),性能优势很明显。逻辑特别直接:既然数据库里存的是htmlspecialchars编码后的内容,那你把用户输入的搜索关键词也用同样的函数编码一遍,再用LIKE去匹配就行。

PDO查询示例:

// 获取用户输入的搜索关键词
$searchTerm = $_POST['search'];
// 对关键词做和存储时完全相同的编码
$encodedTerm = htmlspecialchars($searchTerm);
// 构造预处理SQL,用占位符彻底规避SQL注入
$stmt = $this->db->prepare("SELECT * FROM t_tasks WHERE a_text LIKE CONCAT('%', :term, '%')");
// 绑定参数,指定参数类型更安全
$stmt->bindParam(':term', $encodedTerm, PDO::PARAM_STR);
// 执行查询并获取结果
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

方案2:在SQL中解码字段后再匹配

要是你不想额外处理搜索关键词,也可以在查询时用SQL函数先把字段解码,再做LIKE匹配。以MySQL为例,html_entity_decode()函数就能识别htmlspecialchars生成的实体(比如把&lt;转回<),完美适配你的场景。

⚠️ 注意:这个方案的致命缺点是会导致字段上的索引失效,如果你的表数据量很大,查询速度会明显变慢,所以只适合小数据量的场景。

PDO查询示例:

$searchTerm = $_POST['search'];
// 预处理SQL,先解码字段再执行LIKE匹配
$stmt = $this->db->prepare("SELECT * FROM t_tasks WHERE html_entity_decode(a_text) LIKE CONCAT('%', :term, '%')");
$stmt->bindParam(':term', $searchTerm, PDO::PARAM_STR);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

额外提醒

  • 不管用哪个方案,一定要用PDO的预处理语句和参数绑定,绝对不能直接把用户输入拼进SQL里,这是防止SQL注入的底线。
  • 如果你的数据库是PostgreSQL,对应的解码函数是pg_decode_html_entities();SQL Server可以用CAST(a_text AS XML).value('.', 'NVARCHAR(MAX)')来实现解码,原理都是一样的。

内容的提问来源于stack exchange,提问作者Prophet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:34:58