使用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生成的实体(比如把<转回<),完美适配你的场景。
⚠️ 注意:这个方案的致命缺点是会导致字段上的索引失效,如果你的表数据量很大,查询速度会明显变慢,所以只适合小数据量的场景。
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
相关产品推荐
相关产品推荐

