MySQL PDO bindParam命名变量绑定不匹配:如何正确绑定?
PDO绑定IN子句参数时重复值的解决办法
问题根源
你遇到的问题是bindParam的特性导致的:它绑定的是变量的引用,而非当前值。循环迭代时,$v会被不断更新为数组下一个元素的引用,当循环结束后,所有通过bindParam绑定的tenant0和tenant1参数,实际上都指向同一个$v变量,也就是数组最后一个元素的值e95df930。
解决方法
有两种简单的修复方式:
1. 替换bindParam为bindValue
bindValue直接绑定的是当前变量的值,不会受后续变量变化的影响,适合这种固定值的绑定场景:
$conditions_values = [ 'tenant0' => "ae75d056", 'tenant1' => "e95df930" ]; $this->statement->bindParam('limitstart', $params['start'], PDO::PARAM_INT); $this->statement->bindParam('limitlength', $params['length'], PDO::PARAM_INT); foreach ($conditions_values as $k => $v) { $this->statement->bindValue($k, $v); }
2. 循环内使用临时变量
如果一定要用bindParam,可以在循环内部创建临时变量存储当前值,再绑定这个临时变量(每个迭代的临时变量都是独立的,不会被后续迭代覆盖):
$conditions_values = [ 'tenant0' => "ae75d056", 'tenant1' => "e95df930" ]; $this->statement->bindParam('limitstart', $params['start'], PDO::PARAM_INT); $this->statement->bindParam('limitlength', $params['length'], PDO::PARAM_INT); foreach ($conditions_values as $k => $v) { $temp_val = $v; $this->statement->bindParam($k, $temp_val); }
补充说明
对于LIMIT的limitstart和limitlength参数,你用bindParam并指定PDO::PARAM_INT是正确的,因为这类参数通常需要确保类型为整数,bindParam的引用特性在这里不会造成问题。
内容的提问来源于stack exchange,提问作者Sarah K
相关产品推荐
相关产品推荐

