Problem polega na tym, że wiążesz parametry za pomocą bindParam , który używa wiązania przez odwołanie. W twoim przypadku powinieneś użyć bindValue zamiast tego:
foreach( $binders as $key => $value ) {
$sql->bindValue( $key, $value );
}
Lub możesz przekazać swoją tablicę bezpośrednio do execute() metoda:
$sql->execute( $binders );
Jak opisano w instrukcji:
the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.
Więc kiedy pętla foreach kończy się $value ma wartość ostatniego elementu tablicy Apple . Więc kiedy execute działa, oba :ctid i :p1 wartości stają się równe Apple . Na pewno nie tego chcesz)