Alternative. Use session variables.
On each form start off the script with
session_start();
Then as the form details come in, store them in $SESSION['name of field'];. Once that has been done they'll be available (as $SESSION['name of field']) on any other page which starts with session_start().
No hidden fields are needed in the form, and there is no need to decorate the URL for the back link.
When you go to display a form, check the appropriate session variables to see if they're set, and if so, write the data back into the appropriate spaces.
That handles backing up.
For preventing double-posting: On page 1 of the form, start the session, and generate a unique string (md5(uniqid("")) should do the trick) and store that in a session variable. When the form details are stored in the database, this and the session id (session_id()) will be stored in the database as well.
Before doing the insertion, check to make sure that there is not already an entry with the same session id and the same unique string. If there are, then this is a duplicate submission. (The unique id is needed if there is the possibility of two separate form posts in the course of the same session.)
After the insertion has been made, unset all the session variables, so that future form-fillings can go ahead unhindered.