http://qs321.pair.com?node_id=698862

bradcathey has asked for the wisdom of the Perl Monks concerning the following question:

Fellow Monasterians,

I'm new to the INSERT ... ON DUPLICATE KEY UPDATE concept and now have been staring at this for an hour and not seeing the problem. Here's the code:

my $stmt = 'INSERT INTO contact_form (' . join(',', keys %sql) . ') VA +LUES (' . join(',', ('?') x keys %sql) . ') ON DUPLICATE KEY UPDATE ' +. join(' = ?, ', keys %sql) . ' = ?';

Data::Dumper gives me:

$VAR1 = 'INSERT INTO contact_form (more_info,city,name,address,comment +s) VALUES (?,?,?,?,?) ON DUPLICATE KEY UPDATE more_info = ?, city = ? +, name = ?, address = ?, comments = ?';

Run-time error message

...for the right syntax to use near ' city = , name = , address = , co +mments ='

What am I missing? (BTW, it works fine if I leave off the

ON DUPLICATE KEY UPDATE ' +. join(' = ?, ', keys %sql) . ' = ?'
)

—Brad
"The important work of moving the world forward does not wait to be done by perfect men." George Eliot

Replies are listed 'Best First'.
Re: MySQL syntax error for ON DUPLICATE KEY UPDATE
by dvergin (Monsignor) on Jul 20, 2008 at 01:48 UTC
    It seems that your SQL statement is failing because the placeholders in your "ON DUPLICATE KEY..." clause lack bind values when you invoke your SQL with "execute".

    I suspect you are passing only five values when you "execute". Your statement requires ten values, i.e. TWO copies of your variable set -- one after the other.

    HTH

      That was it! Made perfect sense. Thanks!

      my $stmt = 'INSERT INTO contact_form (' . join(',', keys %sql) . ') VALUES (' . join(',', ('?') x keys %sql) . ') ON DUPLICATE KEY UPDATE '. join(' = ?, ', keys %sql) . ' = + ?'; $self->dbh->do( $stmt, undef, (values %sql, values %sql));
      —Brad
      "The important work of moving the world forward does not wait to be done by perfect men." George Eliot
        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);
Re: MySQL syntax error for ON DUPLICATE KEY UPDATE
by pc88mxer (Vicar) on Jul 20, 2008 at 00:08 UTC
    I would examine what SQL is actually being sent to the server. Check your server logs or see the section on "TRACING" in the DBI documentation.