Есть несколько вариантов. Я не эксперт (исключительно любитель), так что не утверждаю, что хотя бы один из них реально правильный.
Вариант 1. Создание сессии на стороне сервера, сохранение данных из формы в самой сессии.
Вариант 2. Создание сессии, но сохранение данных в БД. Присваиваем уникальный ID пользователю (как правило, это решает за нас атрибут AUTO_INCREMENT в бд) и в сессии храним лишь этот id. При повтором открытии формы пользователем берем из сессии его id, ищем в бд, и если есть уже заполненные им поля формы, то подставляем эти значения в форму.
Вариант 3. Без сервера и бд. Сохраняем все введенные данные с помощью js в LocalStorage. При повторном заходе клиента, просто смотрим, есть ли в хранилище введенные им данные, и если есть, подставляем в форму. Но если в форме есть поля с загрузкой файлов, то в этом случае, нужно будет их хранить, например, в base64.
В первом и третьем варианте подразумевается, что в после заполнения всех полей формы все данные всё равно будут записаны в БД.
UPD: тут зависит от конкретного случая. Если, например, на первом этапе пользователь воодит свой E-mail, и он вам понадобится, например, для рассылок, независимо от того, заполнил он форму полностью или нет - то лучше второй вариант. Если же вам не нужны данные пользователя, пока он не заполнит все поля - то третий вариант будет проще и лучше. Ну и первый вариант в этом случае тоже подойдет