http://www.perlmonks.org?node_id=698889


in reply to Re^2: MySQL syntax error for ON DUPLICATE KEY UPDATE
in thread MySQL syntax error for ON DUPLICATE KEY UPDATE

Alternatively, you can refer to the values in the insert part with the values() function:
insert into foo (bar, baz) values (?, ?) on duplicate key update bar = values(bar) , baz = values(baz)
So your statement string would be:
my $stmt = 'INSERT INTO contact_form (' . join(',', keys %sql) . ') VALUES (' . join(',', ('?') x keys %sql) . ') ON DUPLICATE KEY UPDATE '. join(', ', map { "$_ = values($ +_)" } keys %sql);