bindParam Requiere una referencia
El problema se debe a la forma en que enlazas los parámetros en el ciclo foreach.
foreach($bindings as $placeholder=>$bound){
echo $placeholder . " - " . $bound."<br/>";
$stmt->bindParam($placeholder, $bound);
}
bindParam
requiere una referencia. Vincula la variable, no el valor, a la declaración. Dado que la variable en un bucle foreach se restablece al comienzo de cada iteración, solo la última referencia a $bound
se deja intacto, y termina vinculando todos sus marcadores de posición a él.
Es por eso que su código funciona cuando $query['where']
contiene solo una entrada, pero falla cuando contiene más de una.
Puedes resolver el problema de 2 maneras:
Pasar por referencia
foreach($bindings as $placeholder => &$bound) { //pass $bound as a reference (&)
$stmt->bindParam($placeholder, $bound); // bind the variable to the statement
}
Pasar por valor
Usa bindValue
en lugar de bindParam
:
foreach($bindings as $placeholder => $bound) {
$stmt->bindValue($placeholder, $bound); // bind the value to the statement
}