【问题标题】:How to generate form fields based on specific table columns fields names only?如何仅基于特定表列字段名称生成表单字段?
【发布时间】:2018-08-26 21:32:38
【问题描述】:

我正在使用这个简单的代码根据表列字段名称生成动态表单输入:

<form id="generate-user-register-form" type="POST">
                <?php 
                $queryuser= "DESCRIBE users";
                $resultstmt_queryuser= $conn->query($queryuser); 

                $fields = array();

                while($row = $resultstmt_queryuser->fetch_assoc()) {
                    $fields[] = $row['Field'];
                }

                foreach($fields as $field): ?>
                   <div class="col-md-6">
                        <?php echo "$field: "; ?>
                        <input class="form-control" type="text" name="<?php echo $field; ?>" />
                   </div>
                <?php endforeach; ?>
                <input type="button" name="submit" value="submit"/>
            </form>

好的,这很好用,但前 10 个字段是不必要的,第一列 id 是自动增量的,因此绝对不需要它作为表单输入。有没有办法让我只生成特定字段而不必手动硬编码类似下面的代码 10 次?

 if($field !="id"){
//generate input
}

【问题讨论】:

  • 您如何知道要使用哪些列名?另一个表格列出应该是表单字段并查询的表格怎么样?
  • 而不是foreach 使用for 循环并从10 开始计数器?如果您正在构建一个隔离系统,只需按照它应该的外观构建表单并进行您想要的输入。如果您正在构建一个框架,也许将系统字段和用户可维护的字段保存在单独的相关表中?
  • 您可以在foreach() 中使用计数器,这不是一个非常强大的解决方案,如果您必须在表格中添加或删除,或者更改表格中的位置..
  • @IdontDownVote:我会将此作为答案。作品。我一定是太煎熬了,根本没想到。

标签: php forms mysqli


【解决方案1】:

我认为您正在尝试做的事情可能有不同的方法来考虑如何决定一个字段是否应该是输入。例如。

考虑一下您的表格应该是这样的:

+----+------------+-------------+-------------+------------+
| id | name_input | email_input | phone_input | created_at |
+----+------------+-------------+-------------+------------+
| 1  | John Smith | not@me.com  | 888 333 444 | 2018-08-26 |
| 2  | Lila White | not@us.com  | 412 322 555 | 2018-08-27 |
+----+------------+-------------+-------------+------------+

因此,使用此表,您可以轻松地在列中找到关键字 input 并将它们仅分配给表单:

while($row = $resultstmt_queryuser->fetch_assoc()) {
    if (strpos($row['Field'], '_input') === false) {
        continue;
    }
    $fields[] = $row['Field'];
}

或者,正如@IdontDownVote 在上面的 cmets 中指出的那样,您可以在循环内使用计数,并且仅在某个数字之后或之间或另一个数字之前添加字段,例如:

$count = 0;
while($row = $resultstmt_queryuser->fetch_assoc()) {
    if ($count < 1 /* adding extra clauses here as && $count > 5 */) {
        continue;
    }
    $fields[] = $row['Field'];
}someone

但我建议不要这样做。 为什么?你可能会问。

嗯,从本质上讲,每个领域都是不同的。机器肯定不知道特定字段的标签是什么,或者它应该有什么验证,或者它应该保存什么样的信息。

最常见的是,ids 是整数,但可能不是。但是date 字段呢?还是电话号码?还是邮政编码?

为它们中的每一个生成动态输入,您可能还必须将列的名称作为每个字段的标签来读取,但是,某些信息在某些时候还是会硬编码

电话号码验证、邮政编码、电子邮件、网站验证。

在此信息到达数据库之前,其中大部分都必须在后端进行硬编码。所以,如果你要为特定的字段写一些特定的规则,为什么不在表单中指定这些字段呢?

它让您在尝试追踪每个字段时更轻松,并且您不会完全依赖于创建忽略规则来显示某些字段,例如:created_atcreated_by。当这些字段通常由系统而不是由用户更新时(当然知道谁做了什么以及什么时候做的)。

不过,TL;博士;有时硬编码比相反的情况更清晰、更快(从长远来看)。

[编辑]

将计数添加到可见的答案中,如果@IdontDownVote 发布此答案,请选择他的答案。

【讨论】:

  • 这个答案使用硬编码的'if's OP 试图避免,仅在代码的不同部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多