El problema aquí es que vincula parámetros con bindParam , que utiliza el enlace por referencia. En tu caso deberías usar bindValue en cambio:
foreach( $binders as $key => $value ) {
$sql->bindValue( $key, $value );
}
O puede pasar su matriz directamente a execute() método:
$sql->execute( $binders );
Como se describe en el manual:
the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.
Entonces, cuando tu ciclo foreach finaliza $value tiene el valor del último elemento de la matriz Apple . Así que cuando execute se ejecuta, tanto :ctid y :p1 los valores se vuelven iguales a Apple . Seguramente, esto no es lo que quieres)