Problém je v tom, že svážete parametry s bindParam , který používá vazbu odkazem. Ve vašem případě byste měli použít bindValue místo toho:
foreach( $binders as $key => $value ) {
$sql->bindValue( $key, $value );
}
Nebo můžete pole předat přímo execute() metoda:
$sql->execute( $binders );
Jak je popsáno v návodu:
the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.
Takže když vaše smyčka foreach skončí $value má hodnotu poslední položky pole Apple . Takže když execute běží, oba :ctid a :p1 hodnoty se stávají rovno Apple . Určitě to není to, co chcete)