O problema aqui é que você vincula parâmetros com
bindParam , que usa vinculação por referência. No seu caso, você deve usar bindValue em vez de:foreach( $binders as $key => $value ) {
$sql->bindValue( $key, $value );
}
Ou você pode passar seu array diretamente para
execute() método:$sql->execute( $binders );
Conforme descrito no manual:
the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called. Então, quando seu loop foreach termina
$value tem o valor do último item do array Apple . Então, quando execute roda, ambos :ctid e :p1 os valores estão se tornando iguais a Apple . Certamente, isso não é o que você quer)