9.2.3. Discussion
During the early days of the Web, when people created forms, they
made two pages: a static HTML page with the form and a script that
processed the form and returned a dynamically generated response to
the user. This was a little unwieldy, because
form.html led to form.cgi
and if you changed one page, you needed to also remember to edit the
other, or your script might break.
Forms are easier to maintain when all parts live in the same file and
context dictates which sections to display. Use a hidden form field
named stage to track your position in the flow of
the form process; it acts as a trigger for the steps that return the
proper HTML to the user. Sometimes, however, it's
not possible to design your code to do this; for example, when your
form is processed by a script on someone else's
server.
When writing the HTML for your form, however, don't
hardcode the path to your page directly into the
action. This makes it impossible to rename or
relocate your page without also editing it. Instead, PHP supplies a
helpful variable:
$_SERVER['PHP_SELF']
This variable is an alias to the URL of the current page. So, set the
value of the action attribute to that value, and
your form always resubmits, even if you've moved the
file to a new place on the server.
So, the example in the introduction of this chapter is now:
if (isset($_POST['stage']) && ('process' == $_POST['stage'])) {
process_form();
} else {
print_form();
}
function print_form() {
echo <<<END
<form action="$_SERVER[PHP_SELF]" method="post">
What is your first name?
<input type="text" name="first_name">
<input type="hidden" name="stage" value="process">
<input type="submit" value="Say Hello">
</form>
END;
}
function process_form() {
echo 'Hello ' . $_POST['first_name'] . '!';
}
If your form has more than one step, just set
stage to a new value for each step.