如果数据库失败,如何保留动态创建的输入字段值


How to retain dynamically created input fields values if database fails?

我有一个大约70个输入字段的大表单,在表单中有可以创建额外输入字段的按钮。我的问题是,如果提交表单时服务器上出现问题,如数据库插入失败,我如何保留这些输入字段及其值?我有动态验证,但如果在提交时出现问题怎么办?

你有很多选择。

  1. 你可以使用ajax来发布你的表单,然后重定向到一个新的页面,如果成功,或者警告用户,如果没有(最简单的!)
  2. 你可以在服务器端通过post变量重新创建from(复杂的表单更难)
  3. 服务器可以在失败时发回表单值,你可以编写JS来重新创建表单(如果你已经有JS来管理表单可能很容易)。
  4. 你可以传递表单的实际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;
        }