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

Posted

技术标签:

【中文标题】如果数据库失败,如何保留动态创建的输入字段值?【英文标题】:How to retain dynamically created input fields values if database fails? 【发布时间】:2012-12-16 07:53:46 【问题描述】:

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

【问题讨论】:

嗯,只有你最了解你的形式,你怎么看?可以做些什么来解决这个问题?如果您在数据库操作成功之前不首先销毁表单怎么办?允许用户在失败的情况下重试提交数据? 那么,您是想说使用 ajax 帖子? 我确实阅读了您使用 javascript 动态构建表单的问题。将其转换为 ajax 请求然后使用 jquery 提交是最简单的,我只是认为你会这样做。如果您还没有这样做,我建议您更改它,因为这是一种非常简单的处理方法。 【参考方案1】:

你有很多选择。

    您可以使用 ajax 发布表单,如果成功则重定向到新页面,如果失败则提醒用户(最简单!) 您可以在服务器端从 post 变量重新创建 from(复杂形式更难) 服务器可以在失败时发回表单值,您可以编写 JS 来重新创建表单(如果您已经有 JS 来管理表单,可能会很容易)。 您可以将表单的实际 html 与表单值一起传递,并让服务器使用它来重新创建表单(您可能会丢失 JS 事件,具体取决于您连接它们的方式,通常不是最佳选择)。

还有很多不太有用的选项。我会推荐#1。

【讨论】:

我也在考虑做一个 ajax 帖子。我认为这是最好和最简单的方法。【参考方案2】:

对于一个非常简单的解决方案:

您可以将值存储在对象中,并且只有在您获得确认的数据库插入后才能将其清除。如果插入失败,您可以重试几次,如果反复失败,您可以将值写入 CSV 日志文件以手动处理。

更复杂的解决方案

队列。使用 Zend Jobserver、RabbitMQ 或 Gearman 让所有插入请求进入作业队列。然后创建一个工作进程以在队列的另一端运行插入。这将允许您重新运行/重试失败的作业。

【讨论】:

您认为这是最好的方法吗? @u54r 您是否需要这些值在用户体验之后立即可用,或者表单只是线索/数据收集(您不需要绝对实时访问)? 如果您的数据库提交失败,在大多数情况下,使用完全相同的数据重试不太可能修复它。 99% 的时间它将是无效输入。 @levi 我同意,但提出的问题明确指出'如果数据库失败' @Ray,作为一种可能性。以我的经验,生产过程中的数据库插入失败更有可能是无效输入(例如,唯一值列的非唯一值,或者没有打开截断功能的字符串太长,或者最近删除的外键)【参考方案3】:

为什么一个页面上有这么多字段?我会重新考虑这样做。无论如何,如果您有服务器端验证并且它失败了,您可以设置页面以让每个字段使用基于发送到服务器的帖子值的默认值......所以只需将它们发送回同一页面并将输入字段值设置为 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); ?>

【讨论】:

该表单用于创建提案。向客户推荐的产品有很多变量。我不认为你的方法是最好的解决方案,因为有多维数组,要弄清楚哪个是麻烦和压倒性的。 如果您要发布表单并且所有内容都有名称,您所要做的就是获取同名的表单值并设置值。如果它存在,它会被设置。如果不存在,则为空字符串。我能看到的唯一更好的解决方案是 ajaxForm。但这需要对您的后端代码进行相当大的更改。 正如我所说,有动态创建的表单元素意味着例如 name[] 可以在表单中一遍又一遍地创建。你的方法效率低。【参考方案4】:

这里有几个函数可以用来在会话中存储表单值:

    //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;
        

【讨论】:

以上是关于如果数据库失败,如何保留动态创建的输入字段值?的主要内容,如果未能解决你的问题,请参考以下文章

在动态创建的输入上使用laravels {{old}}

在 PHP 中提交表单时如何保留输入字段中的值?

如何在 VueJS 中动态创建输入字段

PayPal:如何清理动态创建的加密网站付款按钮的字段值?

动态生成的字段和数据在提交后保留

如何循环动态生成的按钮并相应地创建输入字段