我有一个大约70个输入字段的大表单,在表单中有可以创建额外输入字段的按钮。我的问题是,如果提交表单时服务器上出现问题,如数据库插入失败,我如何保留这些输入字段及其值?我有动态验证,但如果在提交时出现问题怎么办?
你有很多选择。
- 你可以使用ajax来发布你的表单,然后重定向到一个新的页面,如果成功,或者警告用户,如果没有(最简单的!)
- 你可以在服务器端通过post变量重新创建from(复杂的表单更难)
- 服务器可以在失败时发回表单值,你可以编写JS来重新创建表单(如果你已经有JS来管理表单可能很容易)。
- 你可以传递表单的实际HTML和表单值,并让服务器使用它来重新创建表单(你可能会失去JS事件取决于你如何连接它们,一般不是最好的选择)。
还有很多不太有用的选项。我推荐#1
对于一个真正简单的解决方案:
你可以将值存储在一个对象中,只有当你有一个确认的DB插入清除它。如果插入失败,可以重试几次,如果多次失败,可以将值写入CSV日志文件以手动处理。
更复杂的解
队列。使用Zend Jobserver、RabbitMQ或Gearman让所有插入请求进入一个作业队列。然后创建一个工作进程,在队列的另一端运行插入。这将允许您重新运行/重试失败的作业。
为什么一个页面上有这么多字段?我会重新考虑做这件事。无论如何,如果你有服务器端验证并且它失败了,你可以设置页面,让每个字段使用基于发送到服务器的post值的默认值…因此,只需将它们发送回同一个页面,并将输入字段的值设置为post值。
下面是一个例子。
$username = array(
'name' => 'username',
'id' => 'username',
'maxlength' => '255',
'size' => '28',
'title' => 'username is required.',
'class' => 'form-text required',
'value' => $this->input->post('username'),
);
<?php echo form_input($username); ?>
这里有两个函数,您可以使用它们在会话中存储表单值:
//save form inputs
function Hold_Form_Input()
{
$FormPost = array();
foreach ($_POST as $key => $entry)
{
$FormPost[''.$key.'']= $entry;
}
$_SESSION['post_form']= $FormPost;
}
//Clear form values upon success
function Clear_Form_Input()
{
if (isset($_SESSION['post_form']))
{
unset($_SESSION['post_form']);
return true;
}
return false;
}
//Reprint form values as needed
function Keep_on_error($fieldname)
{
if(isset($_SESSION['post_form']) && strlen($_SESSION['post_form'][$fieldname]) > 0)
{
$fill = $_SESSION['post_form'][$fieldname];
return $fill;
}
return false;
}