
本文详解如何在基于 echo 的分页产品列表页中集成搜索框,通过 url 查询参数传递关键词、动态构建 sql like 查询,并安全处理用户输入,实现搜索与分页无缝联动。
在使用 Echo 实现分页(如 /product/1)的基础上添加搜索功能,关键在于将搜索条件从路径参数(:page)解耦,转为可选的查询参数(如 ?q=keyword),并确保 SQL 查询能安全支持模糊匹配。原代码中硬编码的 LIKE '%%%s%%' 存在 SQL 注入风险且无法动态接收用户输入,必须重构。
✅ 正确做法:使用查询参数 + 参数化 LIKE 拼接
首先,修改路由以支持可选搜索参数(保持分页路径不变):
// 路由保持不变(支持 /product/1、/product/2 等) e.GET(PATH_PAGINATE_PRODUCT, handlers.Product) // 同时允许带搜索的请求,如 /product/1?q=laptop
然后,在 Handler 中解析 q 查询参数,并安全构造搜索关键词:
// 获取搜索关键词(默认为空字符串)
q := c.QueryParam("q")
q = strings.TrimSpace(q)
// 构造带通配符的模糊匹配值(在 Go 层拼接,非 SQL 字符串拼接)
searchPrefix := "%"
searchUsage := "%"
if q != "" {
searchPrefix = "%" + q + "%"
searchUsage = "%" + q + "%"
}
// 注意:SQL 中不再写 '%%%' 字符串,而是用占位符 $3, $4
// 更新你的 SQL 查询(推荐使用命名参数或顺序参数,此处以顺序为例):
// Q_GET_PAGINATION_FROM_PRODUCT =
// `SELECT * FROM PRODUCT WHERE (prefix ILIKE $3 OR usage ILIKE $4) LIMIT $1 OFFSET $2`⚠️ 重要提醒:绝不要在 SQL 字符串中直接拼接用户输入(如 "... LIKE '%" + q + "%'"),这会导致严重 SQL 注入漏洞。应始终由数据库驱动(如 pq 或 pgx)通过参数绑定处理。
? 更新数据库查询调用
将原来的两参数查询升级为四参数(pageSize, offset, searchPrefix, searchUsage):
rows, err := database.WrapQuery(
dbconnections.DBPool,
ctx,
"GetFromProductPaginatedByOffset",
pageSize,
offset,
searchPrefix, // ← 绑定到 $3
searchUsage, // ← 绑定到 $4
)同时,更新总条目数查询,使其同样支持搜索过滤:
v4.5更新说明:修改店铺自定义分类为一级重新整合bbsxp论坛,修正了一致的所有错误。如分页,搜索,通行密码,选项等错误修改添加会员认证功能。认证后可以再次升级认证.增加虚拟币使用功能。可使用虚拟币购买收费店铺时间,站长可以在后台控制价格。订单管理中添加付款连接,使买家下订单后可以选择是否马上付款。增加首页两侧广告条增加在后台可以更改9大主题的名称增加修改后台的求购管理增加会员申请收费店铺及收费
var totalItems int
err := database.WrapQueryRow(
dbconnections.DBPool,
ctx,
"GetTotalSizeFromProduct",
searchPrefix, // ← 与分页查询一致的搜索条件
searchUsage,
).Scan(&totalItems)? 提示:GetTotalSizeFromProduct 对应的 SQL 应为:
SELECT COUNT(*) FROM PRODUCT WHERE (prefix ILIKE $1 OR usage ILIKE $2)
?️ 前端模板(HTML + Go Template)示例
在 product.html 模板中添加搜索表单,保持当前页码并追加/更新 q 参数:
并在 Go handler 中将 q 传入模板:
templateDataMap["SearchQuery"] = q // 用于回显搜索词
✅ 最终效果与注意事项
- ✅ 支持 GET /product/1?q=gaming → 搜索第 1 页含 “gaming” 的商品
- ✅ 分页控件(上一页/下一页)自动携带当前 q 参数(需在模板中为分页链接添加 ?q={{.SearchQuery}})
- ✅ 使用 ILIKE(PostgreSQL)或 LIKE + 小写转换(MySQL)提升兼容性与大小写不敏感体验
- ❌ 避免在 SQL 中使用字符串格式化拼接用户输入
- ✅ 建议为 prefix 和 usage 字段建立 GIN 或 FULLTEXT 索引以优化搜索性能
通过以上改造,你就能在 Echo 分页应用中安全、高效地集成搜索功能,兼顾用户体验与系统健壮性。









