首页  >  问答  >  正文

大规模动态填充HTML表单:通过PHP中的SQL值实现

这个问题更多与我希望在“SCALE”方面实现的过程/逻辑相关,而不是如何编写代码。

在WordPress中,我有几个以HTML形式加载的表单,当用户创建一个自定义文章(对于不熟悉CMS的人来说,实际上是一个新的数据库条目)来记录一个新的“事件”时加载。我不想手动映射所有内容,因为这是使用update_post_meta()来设置数据库条目/文章的名称和值 - 所以当提交表单时,我使用php循环foreach ($_POST as $name => $value) {来填充此事件的所有数据库表。

这个方法很好,但是现在,如果用户保存表单并稍后回来编辑它,我希望如果存在值,像这样回显:

<label for="reported_by">报告人(全名)</label>
<?php $reported_by = get_post_meta($incident_id, 'reported_by', true); ?>
<input type="text" name="reported_by" value="<?php echo $reported_by; ?>">

同样,这个方法也很好,但是我在这个页面上有近500个字段,所以为每个字段手动设置唯一变量(在这种情况下是$reported_by)将花费我很长时间,而且基本上会增加代码库近50%,使其难以维护且效率低下。

对于如何解决这个问题有什么想法吗?可以理解的是,我可以通过php构建表单并在HTML中回显,但是这也感觉像一个非常手动的过程。PHP是服务器端的,所以我不能轻松地在客户端获取标签/输入的名称值,除非使用AJAX,但我觉得这也会变得相当手动。

所以无论如何,我都面临着很多重复劳动,除非有一种方法可以使这个过程更容易扩展到所有500个字段,而不需要我手动设置变量名。

谢谢您的时间!

P粉765570115P粉765570115375 天前561

全部回复(1)我来回复

  • P粉308089080

    P粉3080890802023-09-11 11:38:54

    首先要注意的是,你实际上并不需要为每个表单输入项创建一个不同命名的局部变量。也就是说,不需要这样写:

    <label for="reported_by">报告人(全名)</label>
    <?php $reported_by = get_post_meta($incident_id, 'reported_by', true); ?>
    <input type="text" name="reported_by" value="<?php echo $reported_by; ?>">

    你可以这样写:

    <label for="reported_by">报告人(全名)</label>
    <?php $current_value = get_post_meta($incident_id, 'reported_by', true); ?>
    <input type="text" name="reported_by" value="<?php echo $current_value; ?>">

    为什么这样有帮助呢?因为现在只有两个与输入项相关的内容:

    • 标签“报告人(全名)”
    • 字段名“reported_by”,在多个地方使用

    这两个都只是字符串,所以很容易提取到PHP变量中:

    <?php
    $field_name = 'reported_by';
    $label = '报告人(全名)';
    ?>
    <label for="<?php echo $field_name; ?>"><?php echo htmlspecialchars($label); ?></label>
    <?php $current_value = get_post_meta($incident_id, $field_name, true); ?>
    <input type="text" name="<?php echo $field_name; ?>" value="<?php echo $current_value; ?>">

    这些看起来很像参数,所以让我们把它变成一个函数,同时记得也传入$incident_id

    <?php
    function display_input($incident_id, $field_name, $label) {
        ?>
    <label for="<?php echo $field_name; ?>"><?php echo htmlspecialchars($label); ?></label>
    <?php $current_value = get_post_meta($incident_id, $field_name, true); ?>
    <input type="text" name="<?php echo $field_name; ?>" value="<?php echo $current_value; ?>">
        <?php
    }
    display_input($incident_id, 'reported_by', '报告人(全名)');

    现在,你只需要调用display_input函数500次就可以显示500个输入项。为了避免这样,可以使用一个数组和foreach循环:

    $fields = [
        'reported_by' => '报告人(全名)',
    ];
    foreach ( $fields as $field_name => $label ) {
        display_input($incident_id, $field_name, $label);
    }

    然后,你可以从配置文件或数据库表中获取数组,而不是硬编码。你已经自动化了重复的部分(渲染HTML的细节),只剩下“有趣”的部分:定义要显示的字段列表。

    如果某些字段需要稍微不同,你可以向函数(和配置数组)添加一些额外选项,但只要变化不多,代码应该保持相当简单明了。

    回复
    0
  • 取消回复