I suggest you put in error conditions in case the prepare_cached or the execute fails. You can get the database error message using $dbh->errstr - it's often very helpful.
Are you sure that you're finishing both of the statement handles? In the larger chunk of code above, there's only one finish.
You could try doing bind_param separately from execute, in case the problem's there
In answer to someone's question below, 'clockwork'. ;)