bindParam wymaga odniesienia
Problem jest spowodowany sposobem wiązania parametrów w pętli foreach.
foreach($bindings as $placeholder=>$bound){
echo $placeholder . " - " . $bound."<br/>";
$stmt->bindParam($placeholder, $bound);
}
bindParam
wymaga odniesienia. Wiąże zmienną, a nie wartość, z instrukcją. Ponieważ zmienna w pętli foreach jest resetowana na początku każdej iteracji, tylko ostatnie odwołanie do $bound
pozostaje nienaruszony i ostatecznie wiążesz z nim wszystkie swoje symbole zastępcze.
Dlatego Twój kod działa, gdy $query['where']
zawiera tylko jeden wpis, ale kończy się niepowodzeniem, gdy zawiera więcej niż jeden.
Możesz rozwiązać problem na 2 sposoby:
Przekaż przez odniesienie
foreach($bindings as $placeholder => &$bound) { //pass $bound as a reference (&)
$stmt->bindParam($placeholder, $bound); // bind the variable to the statement
}
Przekaż według wartości
Użyj bindValue
zamiast bindParam
:
foreach($bindings as $placeholder => $bound) {
$stmt->bindValue($placeholder, $bound); // bind the value to the statement
}