Вы также можете передавать переменные со скрытыми полями, но с помощью таких инструментов, как firebug, эти поля могут быть изменены, и это не очень хорошая идея. Я думаю, что сеанс - лучший способ хранить данные этого типа.
В любом случае, в коде php я всегда храню переменную, которая указывает, какая форма должна быть показана:
switch($_SESSION['step'])
{
case 1: echo "<form name='first'...";
break;
case 2: echo "<form name='second'...";
break;
....
}