bindParam Requer uma referência
O problema é causado pela maneira como você vincula os parâmetros no loop foreach.
foreach($bindings as $placeholder=>$bound){
echo $placeholder . " - " . $bound."<br/>";
$stmt->bindParam($placeholder, $bound);
}
bindParam
requer uma referência. Ele liga a variável, não o valor, à instrução. Como a variável em um loop foreach é redefinida no início de cada iteração, apenas a última referência a $bound
é deixado intacto e você acaba vinculando todos os seus espaços reservados a ele. É por isso que seu código funciona quando
$query['where']
contém apenas uma entrada, mas falha quando contém mais de uma. Você pode resolver o problema de 2 maneiras:
Passe por referência
foreach($bindings as $placeholder => &$bound) { //pass $bound as a reference (&)
$stmt->bindParam($placeholder, $bound); // bind the variable to the statement
}
Passar por valor
Use
bindValue
em vez de bindParam
:foreach($bindings as $placeholder => $bound) {
$stmt->bindValue($placeholder, $bound); // bind the value to the statement
}