В этом подходе нет ничего плохого, хотя вы можете быть немного ограничены в том, что он работает не только для одной формы.Однако, если это всего лишь одно небольшое приложение, то не стоит беспокоиться.
Второй вопрос, я не уверен, что понимаю, но $ _SESSION может принять любой тип данных, включая массивы, поэтому просто заполните $ _SESSION с помощьюгде вы находитесь и что вы сделали в форме до сих пор;
$_SESSION['my_form'] = array (
'current_step' = 'step_2',
'step_1' = array ( // the form elements ),
'step_2' = array ( // the form elements ),
'step_3' = array ( // the form elements ),
'step_4' = array ( // the form elements ),
) ;
Далее вы проводите проверку в каждой точке как обычно.Вы также можете поставить небольшой флажок в каждой форме, независимо от того, были ли они заполнены или нет;
'step_2' = array (
'complete' = true,
// form elements / fields here
),
Еще один способ разрезать это - использовать одну из многих тысяч динамических форм.Например, используя JQuery, вы можете использовать плагин Accordion (из пользовательского интерфейса JQuery) для имитации всего этого всего лишь на одной HTML-странице.