I have had to do a lot of this exact type of thing recently. Here's what I came up with.
When I query the database, I use that data in the form AND I also put the data into a session variable. (I used an array (something like $db_data) where the key is the same as the table field name, value is the data for that field.)
Client sees a form, with the data (from database) already filled in. When they submit the form, I step through the post variables and compare them with the appropriate elements of $db_data array. If there are differences, you'll have to update the database.
One note of caution: Only checked checkboxes are passed as post variables. If you have 10 checkboxes, but only two are checked . . . only two variables will be sent. What this means is that when you use checkboxes, you'll also have to step through $db_data and compare all the checkbox data with the post variables to see if the client has removed any checkmarks in the form.
You don't have to use session variables to do this, but I think that's probably easiest. It also means fewer database queries. Another alternative would be to use hidden form objects in addition to your visible form objects. For example, <input type="hidden" name="db_street_address" value="123 Main Street">.
--Donnie