PHP MVC开发商品搜索分页功能时出现PDO参数绑定数量不匹配错误
错误原因
- 核心问题出在模型层
obtenerProductos方法的SQL语句写法:你把LIKE条件的占位符:search写在了单引号内部,PDO不会识别单引号包裹的内容作为参数占位符,只会将其视为普通字符串。这就导致SQL中实际可识别的占位符只有:startFrom和:numPerPage两个,而你传入了3个参数,参数数量不匹配触发HY093错误。 - 额外性能问题:
obtenerNumeroProductos方法查询全表所有字段再循环计数,数据量大时性能极差,建议直接用聚合函数统计总数。
修复方案
1. 修正模型层代码
<?php namespace Dao\test; use Dao\Table; class Productos extends Table { public static function obtenerProductos($list, $search, $numPerPage) { $startFrom = (intval($list)-1)*$numPerPage; // 去掉LIKE条件里占位符外层的单引号和%,%直接拼到参数值里 $sqlStr = "SELECT * FROM productos WHERE name LIKE :search LIMIT :startFrom,:numPerPage;"; $parametros = array( // 把%拼在search参数值上 "search" => "%".$search."%", "startFrom" => $startFrom, "numPerPage" => $numPerPage ); return self::obtenerRegistros($sqlStr, $parametros); } public static function obtenerNumeroProductos() { // 用COUNT(*)直接统计总数,不用查全表数据 $sqlStr = "SELECT COUNT(*) as total FROM productos;"; $res = self::obtenerRegistros($sqlStr, array()); return $res[0]['total'] ?? 0; } } ?>
2. 对应修正控制器层计数逻辑
因为修改了obtenerNumeroProductos直接返回总数量,不需要再循环计数:
// 把原来的这几行 $viewData["lista"] = \Dao\test\Productos::obtenerNumeroProductos(); foreach ($viewData["lista"] as $producto) { $viewData["totalProductos"] = $viewData["totalProductos"] + 1; } // 替换成 $viewData["totalProductos"] = \Dao\test\Productos::obtenerNumeroProductos();
额外注意
如果修改后仍然报LIMIT相关的参数错误,说明你封装的obtenerRegistros方法没有自动处理数字参数的类型,需要在绑定参数时为:startFrom和:numPerPage指定PDO::PARAM_INT类型,你可以自行修改封装的参数绑定逻辑,或者直接将LIMIT的两个值直接拼入SQL(因为都是经过intval处理的数字,不存在SQL注入风险)。
内容的提问来源于stack exchange,提问作者Zerfergoth
相关产品推荐
相关产品推荐

