Il problema qui è che stai vincolando i parametri con bindParam , che utilizza l'associazione per riferimento. Nel tuo caso dovresti usare bindValue invece:
foreach( $binders as $key => $value ) {
$sql->bindValue( $key, $value );
}
Oppure puoi passare il tuo array direttamente a execute() metodo:
$sql->execute( $binders );
Come descritto nel manuale:
the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.
Quindi, quando il tuo ciclo foreach termina $value ha il valore dell'ultimo elemento dell'array Apple . Quindi, quando execute viene eseguito, entrambi :ctid e :p1 i valori stanno diventando uguali a Apple . Sicuramente, questo non è quello che vuoi)