bindParam Изисква препратка
Проблемът е причинен от начина, по който свързвате параметри в цикъла foreach.
foreach($bindings as $placeholder=>$bound){
echo $placeholder . " - " . $bound."<br/>";
$stmt->bindParam($placeholder, $bound);
}
bindParam
изисква справка. Той свързва променливата, а не стойността, с израза. Тъй като променливата в цикъл foreach се нулира в началото на всяка итерация, само последната препратка към $bound
е оставен непокътнат и в крайна сметка обвързвате всичките си заместители към него.
Ето защо кодът ви работи, когато $query['where']
съдържа само един запис, но не работи, когато съдържа повече от един.
Можете да решите проблема по 2 начина:
Предаване по препратка
foreach($bindings as $placeholder => &$bound) { //pass $bound as a reference (&)
$stmt->bindParam($placeholder, $bound); // bind the variable to the statement
}
Преминаване по стойност
Използвайте bindValue
вместо bindParam
:
foreach($bindings as $placeholder => $bound) {
$stmt->bindValue($placeholder, $bound); // bind the value to the statement
}