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

使用预准备语句防MySQL注入时出现参数数量不匹配错误

解决SQL预准备语句的参数不匹配问题

错误原因

  1. PDO的MySQL驱动默认不支持重复使用同一命名占位符,你在SQL里两次用了:term,但绑定变量时仅绑定一次,导致参数数量和令牌数量不匹配。
  2. 多词搜索时,原字符串拼接逻辑会直接把apple+lemon转为%apple+lemon%,但预准备语句中需要先处理搜索词格式再绑定,否则会导致匹配逻辑异常。

修复步骤

1. 修改SQL占位符

把重复的:term改成不同的命名占位符,避免参数绑定冲突:

return '(r.recipe_name LIKE :term1 OR (ri.ingredient_name IS NOT NULL AND ri.ingredient_name LIKE :term2))';

2. 处理搜索词并绑定参数

在绑定参数前,先给搜索词加上前后%,保持和原拼接逻辑一致:

// 处理搜索词,添加模糊匹配的前后通配符
$searchTerm = "%{$term}%";
// 两个占位符绑定同一个搜索值
$stmt->bindParam(':term1', $searchTerm, PDO::PARAM_STR);
$stmt->bindParam(':term2', $searchTerm, PDO::PARAM_STR);

如果需要实现多词分别匹配(比如apple+lemon要匹配同时包含apple和lemon的内容),可以先替换+为%:

// 将多词分隔符转为通配符
$processedTerm = str_replace('+', '%', $term);
$searchTerm = "%{$processedTerm}%";

可选方案:开启PDO模拟预处理

如果不想修改占位符名称,可以开启PDO的模拟预处理,允许重复使用同一占位符:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

不过这种方式不如使用不同占位符稳妥,建议优先采用第一种方法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:25:07