If you create a trigger on a table with BEFORE UPDATE you can reference the NEW.fieldname and OLD.fieldname to get the value before and after the UPDATE. You can INSERT the OLD.fieldname value to your audit table.
As for the user_id, is this an internal username or the username that you are connecting to the database with? If it is the latter then you can user CURRENT_USER(). If it is the internal identifier then you can always add this as part of the table so that during the UPDATE statement you also include this user_id. You can again reference the NEW.user_id and OLD.user_id in your trigger code.