不要将客户端逻辑与服务器逻辑混为一谈。完全相同的脚本可以输出表单并将其作为输入。如果输入成功验证,它会继续。如果没有,它将再次显示表单,这次显示错误消息和已输入的数据。
下次用户提交表单时,会再次开始验证,直到成功通过为止。
因此,您首先使用输入值和错误消息扩展表单,但仅在标记/设置时才显示它们。
这可以通过 $_POST 旁边的附加变量来完成 - 或者如果你喜欢它 - 通过使用框架的完整表单抽象来完成,比如 zend 框架(这可能是你喜欢做的事情的开销)或者只是使用像流行的 HTML_QuickForm2 这样的库/组件。
编辑:
这是一些非常简单的代码来演示整体方法,如果您使用库,它会更好(而且您不必编写代码,而是可以专注于实际形式,如顶部的定义)。这段代码更多的是用于阅读和理解流程而不是用于使用,我快速输入了它,所以它(肯定有)语法错误,并且对于完整的表单来说它的功能并不完整。这一个只有一个电子邮件字段,甚至缺少提交按钮:
/* setup the request */
$request->isSubmit = isset($_POST['submit']);
/* define the form */
$form->fields = array
(
'email' => array
(
'validate' => function($value) {return filter_var($value, FILTER_VALIDATE_EMAIL);},
'output' => function($value, $name) {return sprintf('<input type="text" value="%s" id="%s">', htmlspecialchars($value), htmlspecialchars($name)},
'default' => 'info@example.com',
),
);
/**
* Import form data from post request
*
* @return array data with keys as field names and values as the input strings
* or default form values.
*/
function get_form_post_data($form, $request)
{
$data = array();
foreach($form->fields as $name => $field)
{
$data[$name] = $field->default;
if ($request->isSubmit && isset($_POST[$name]))
{
$data[$name] = $_POST[$name];
}
}
return $data;
}
/**
* Validate form data
*/
function validate_form_data($form, $data)
{
foreach($form->fields as $name => $field)
{
$value = $data[$name];
$valid = $field['validate']($value);
if (!$valid)
{
$form->errors[$name] = true;
}
}
}
function display_form($form, $data)
{
foreach($form->fields as $name => $field)
{
$value = isset($data[$name]) ? $data[$name] : '';
$hasError = isset($form->errors[$name]);
$input = $field['output']($name, $value);
$mask = '%s';
if ($hasError)
{
$mask = '<div class="error"><div class="message">Please Check:</div>%s</div>';
}
printf($mask, $input);
}
}
// give it a run:
# populate form with default values -or- with submitted values:
$form->data = get_form_post_data($form, $request);
# validate form if there is actually a submit:
if ($request->isSubmit)
{
validate_form_data($form, $form->data);
}
# finally display the form (that can be within your HTML/template part), works like echo:
display_form($form, $form->data)