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


in reply to DBD::mysql "Column count doesn't match value count"

Shouldn't this:

INSERT into monica.event (msg, source, situation, version, date, hostn +ame, last_uid, sub_origin, component, guid, severity, adapter_host) v +alues (????????????)

actually be:

INSERT into monica.event (msg, source, situation, version, date, hostn +ame, last_uid, sub_origin, component, guid, severity, adapter_host) v +alues (?,?,?,?,?,?,?,?,?,?,?,?)
Replace the line:
my $places = join ', ', ('?' x scalar keys %slots);
with
my $places = join ', ', (('?') x scalar keys %slots);

Replies are listed 'Best First'.
Re^2: DBD::mysql "Column count doesn't match value count"
by Random_Walk (Prior) on Nov 28, 2006 at 18:40 UTC

    Yes it should ! thank you so much, this is the first time I have used placeholders so I completely missed that. Those two brackets have cost me half my hair today.

    Cheers,
    R.

    Pereant, qui ante nos nostra dixerunt!
Re^2: DBD::mysql "Column count doesn't match value count"
by bart (Canon) on Nov 29, 2006 at 12:19 UTC
    I take the opportunity to point to DBIx::Simple, which provides means to insert this kind of stuff automatically, if you use a double question mark.
    $db->query('INSERT into monica.event (msg, source, situation, version, + date, hostname, last_uid, sub_origin, component, guid, severity, ada +pter_host) values (??)', 'this is a test event, ignore', 'Testing', ' +START', '0.1', '2006-11-28 19:13:18', 'test', '', 'SelectDocument', ' +IT_SERVICE', '623375574', 'CRITICAL', 'this_box');
    Or even, using the SQL::Abstract mode:
    $db->insert('monica.event' => { 'msg' => 'this is a test event, ignore', 'source' => 'Testing', 'situation' => 'START', 'version' => '0.1', 'date' => '2006-11-28 19:13:18', 'hostname' => 'test', 'last_uid' => '', 'sub_origin' => 'SelectDocument', 'component' => 'IT_SERVICE', 'guid' => '623375574', 'severity' => 'CRITICAL', 'adapter_host' => 'this_box' });
    which I like very much.

    DBIxSimple will build the proper SQL statement, and cache the statement handle for you, for if you use it more than once. Which is very neat.