bindParamには参照が必要です
この問題は、foreachループでパラメーターをバインドする方法が原因で発生します。
foreach($bindings as $placeholder=>$bound){
echo $placeholder . " - " . $bound."<br/>";
$stmt->bindParam($placeholder, $bound);
}
bindParam
参照が必要です。値ではなく変数をステートメントにバインドします。 foreachループ内の変数は各反復の開始時にリセットされるため、$bound
への最後の参照のみ はそのまま残り、すべてのプレースホルダーをバインドすることになります。
これが、$query['where']
のときにコードが機能する理由です。 エントリは1つだけですが、複数含まれていると失敗します。
この問題は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
}