se ben ricordo, ON DUPLICATE KEY UPDATE ... si comporta in modo simile al REPLACE con la differenza che REPLACE cancella il record e scrive un id nuovo, mentre ON DUPLICATE KEY UPDATE cancella il record e lo riscrive con lo stesso id ma solo in caso di dati variati.

Quindi in questo caso troverai due record variati (1 cancellato + 1 riscritto) nel caso di differenze nel record. Mentre troverai 0 record variati se il contenuto e' identico (allo stesso id) e 1 record variato se inserito perche' manca l'id.

Recapitolando ... con mysql_affected_rows($link) troverai i valori:

0 = il record esiste ed e' identico al contenuto della query insert. Nessuna variazione
1 = il record NON esiste ed e' stato inserito. Trovi un nuovo record inserito
2 = il record esisteva ed il contenuto dell'UPDATE era diverso dall'esistente e quindi ha rimosso il presente e riscritto l'aggiornato con lo stesso id del rimosso. Trovi il record aggiornato.