bindParam Yêu cầu tham chiếu
Vấn đề là do cách bạn liên kết các tham số trong vòng lặp foreach.
foreach($bindings as $placeholder=>$bound){
echo $placeholder . " - " . $bound."<br/>";
$stmt->bindParam($placeholder, $bound);
}
bindParam
yêu cầu một tài liệu tham khảo. Nó liên kết biến, không phải giá trị, với câu lệnh. Vì biến trong vòng lặp foreach được đặt lại khi bắt đầu mỗi lần lặp nên chỉ tham chiếu cuối cùng đến $bound
được giữ nguyên và bạn kết thúc việc ràng buộc tất cả các trình giữ chỗ của mình với nó.
Đó là lý do tại sao mã của bạn hoạt động khi $query['where']
chỉ chứa một mục nhập, nhưng không thành công khi có nhiều mục nhập.
Bạn có thể giải quyết vấn đề theo 2 cách:
Chuyển qua tài liệu tham khảo
foreach($bindings as $placeholder => &$bound) { //pass $bound as a reference (&)
$stmt->bindParam($placeholder, $bound); // bind the variable to the statement
}
Chuyển theo giá trị
Sử dụng bindValue
thay vì bindParam
:
foreach($bindings as $placeholder => $bound) {
$stmt->bindValue($placeholder, $bound); // bind the value to the statement
}