PDOStatement::execute同时为WHERE和HAVING绑参报错如何解决
错误原因
- 命名占位符被包裹在单引号内:PDO不会解析单引号中的
:value0、:value1占位符,会将其识别为普通字符串,导致SQL中实际可绑定的参数令牌数量为0,和传入的2个参数数量不匹配,触发报错。 - LIKE通配符位置错误:
%需要和参数值拼接后再传入绑定,不能直接写在SQL语句的占位符两侧。
修正后代码
$MyRequetteRecords = " SELECT _md_currencies._fd_currency, ( SELECT GROUP_CONCAT( _md_tasks_level1._fd_name SEPARATOR ' + ') FROM _x_md_currencies_x_md_tasks LEFT JOIN _md_tasks AS _md_tasks_level1 ON _x_md_currencies_x_md_tasks.ID_md_tasks = _md_tasks_level1.ID WHERE _x_md_currencies_x_md_tasks.ID_md_currencies = _md_currencies.ID ) AS Many2Many_Currency From _md_currencies WHERE _md_currencies._fd_currency LIKE :value0 HAVING Many2Many_Currency LIKE :value1 "; $ValueRequette=[ 'value0' => '%Currency 1%', 'value1' => '%Task%' ]; $statement = $bdd_dataManger->prepare($MyRequetteRecords); $statement->execute($ValueRequette); $Record = $statement->fetchAll(\PDO::FETCH_ASSOC); $statement->closeCursor();
补充说明
PDO预处理参数的绑定规则对WHERE条件和HAVING条件完全一致,没有特殊差异,只要保证占位符不被引号包裹、参数数量和占位符数量一一对应,即可正常完成绑定。
内容的提问来源于stack exchange,提问作者Rezigdev.com
相关产品推荐
相关产品推荐

