【问题标题】:Processing dynamically generated text boxes which have variable names处理动态生成的具有变量名称的文本框
【发布时间】:2012-10-28 04:57:42
【问题描述】:

我正在编写一个基于上传的 CSV 文件写出表单的脚本。 CSV 文件包含由仅包含“,,,,”的行分隔的部分。每个块都包含有关将要启动的服务器的信息。它看起来像这样:

主机,tctivt2r6ra03,,, int,eth0,10.153.196.248,255.255.255.0,10.153.196.1 整数,eth1,10.153.157.113,255.255.255.128,10.153.157.1 int,eth2,10.153.157.241,255.255.255.128,10.153.157.129 int,eth3,00:50:56:ac:69:cb,, 部分,/家,10,, 部分,交换,10,, 部分,/opt,60,, 部分,/数据,30,, ,,,,

此输入被写入包含表格的 div。每行输入都是表中的唯一行。有些值会出现在文本框中。

脚本生成类似于this 的输出。

每个盒子都是动态生成的,由从0开始的主机ID和同样从0开始的盒子号组成。例如:

<tr><th>eth0: </th><td><input type="text" value="10.153.196.248" name="host0Box0" /></td><td><input type="text" value="255.255.255.0" name="host0Box1" /></td><td><input type="text" value="10.153.196.1" name="host0Box2" /></td></tr><tr>

我的问题是如何处理具有可变数量框的表单。具体来说,在处理输入的“部分”行时,可能有六个或更多框。

四个分区的例子:

<tr><th>Partition name:</th><td> /</td><td>10</td></tr>
<tr><th>Partition name:</th><td> /var</td><td><input type="text" value="10" name="host0Box9" /></td></tr>
<tr><th>Partition name:</th><td> /home</td><td><input type="text" value="10" name="host0Box10" /></td></tr>
<tr><th>Partition name:</th><td> swap</td><td><input type="text" value="10" name="host0Box11" /></td></tr>
<tr><th>Partition name:</th><td> /opt</td><td><input type="text" value="60" name="host0Box12" /></td></tr>
<tr><th>Partition name:</th><td><input type="text" value="/data" name="host0Box13" />/td><td><input type="text" value="30" name="host0Box14" /></td></tr>
<tr><th>Number of Disks: </th><td><input type="text" value="1" name="host0Disks" /></td></tr></table></div><span><br /><br /></span>

以六个分区为例:

<tr><th>Partition name:</th><td> /</td><td>10</td></tr>
<tr><th>Partition name:</th><td> /var</td><td><input type="text" value="10" name="host1Box9" /></td></tr>
<tr><th>Partition name:</th><td> /home</td><td><input type="text" value="10" name="host1Box10" /></td></tr>
<tr><th>Partition name:</th><td> swap</td><td><input type="text" value="10" name="host1Box11" /></td></tr>
<tr><th>Partition name:</th><td> /opt</td><td><input type="text" value="60" name="host1Box12" /></td></tr>
<tr><th>Partition name:</th><td><input type="text" value="/data" name="host1Box13" /></td><td><input type="text" value="30" name="host1Box14" /></td></tr>
<tr><th>Partition name:</th><td><input type="text" value="/test1" name="host1Box15" /></td><td><input type="text" value="30" name="host1Box16" /></td></tr>
<tr><th>Partition name:</th><td><input type="text" value="/test2" name="host1Box17" /></td><td><input type="text" value="20" name="host1Box18" /></td></tr>
<tr><th>Number of Disks: </th><td><input type="text" value="1" name="host0Disks" /></td></tr></table></div><span><br /><br /></span>

这是一项正在进行的工作,我知道我必须对其进行更改才能正确处理每个主机部分。与此同时,我正在尝试解决这一问题。

我现在的问题是,当我最终要处理表单时,当填充 $_POST 数组时,我应该使用什么方法来说明动态分配的项目名称?我是否将数组值拉出并将它们放在不同的数组中?我可以像普通数组一样迭代 $_POST 数组吗?还有其他我不知道的选择吗?

【问题讨论】:

    标签: php html


    【解决方案1】:

    您可以像遍历任何数组一样遍历超全局 $_POST 数组。试试 var_dump($_POST) 看看有什么可用的。

    由于发布的名称未知,如果这些名称包含unusual characters,您可能需要解析原始输入流。 Accepted answer to Question 813487 可能会有所帮助。

    【讨论】:

      【解决方案2】:

      看起来你在关注this?

      因此,假设您可以更改脚本输出,而不是 name="host0Box0" 使用 name="host[0][Box][]

      使用[]会自动填写一个数组所以例如

      <input type="text" name="foo[]" value="Hello" />
      <input type="text" name="foo[]" value="World" />
      

      会给你数组

      Array(
        [foo] => Array(
          [0] => Hello
          [1] => World
        )
      )
      

      我可能误解了这个问题。

      【讨论】:

      • 这看起来很有希望。我会玩弄它的。谢谢。
      • 我的代码调用了各种函数来输入表格的不同行。一个用于主机名,一个用于 IP 地址信息,另一个用于分区信息。这种函数的一个例子是function printHost($hostName, $hostID, $boxNum) { print '&lt;tr&gt;&lt;th&gt;Hostname: &lt;/th&gt;&lt;td&gt;&lt;input type="text" value="' . $hostName . '" name="host' . [$hostID] . 'Box[] /&gt;&lt;/td&gt;&lt;/tr&gt;'; print '&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;'; return $boxNum++; } 准确吗?我会将 $hostID 连接到“host”作为 [$hostID],然后将“Box[] 连接到那个?
      • 我选择了"host' . $hostID . 'Box[]"。这似乎比"host[' . $hostID . ']Box[]" 更合适。
      • 我建议使用 name="host[' . $hostID . ']Box[]",因为您可以使用 foreach($_POST['host'] as $hostId=&gt;$box) { ... } 轻松迭代它,其中 $box 将是所有输入的数组。
      • edit 您实际上并不需要 Box:name="host[' . $hostID . '][]" 可以正常工作。
      猜你喜欢
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 2012-10-28
      相关资源
      最近更新 更多