假设我有下表:
<form action="bla.php" method=post>
<table class="pv-data">
<tr>
<td><input type="text" name="id" size="2" value=1 /></td>
<td><input type="text" name="longitude" size="7"/></td>
<td><input type="text" name="latitude" size="7"/></td>
</tr>
<tr>
<td><input type="text" name="id" size="2" value=2 /></td>
<td><input type="text" name="longitude" size="7"/></td>
<td><input type="text" name="latitude" size="7"/></td>
</tr>
</table>
<input type="submit" name="submit" value="SUBMIT">
</form>
我想将此表中的值分配给php变量,因此在bla.php
如果我使用$id = $_REQUEST['id'];
,则仅使用最后一个值,因为有两个具有相同名称的输入标记。
那么我可以在php中请求这些具有相同名称的标签的2个值吗?
p.s不要告诉我更改输入标签的名称,因为该表比这更复杂,并且它具有动态添加行: 我的真实代码是:http://jsfiddle.net/CchES/9/
答案 0 :(得分:9)
当PHP填充$_POST
时,如果多个数据片段具有相同的名称,并且该名称未以[]
结尾,那么只有一个数据将存在以显示在$_POST
数组中。
重命名字段,使名称以[]
结尾。
不要告诉我更改输入标记的名称,因为表格比这更复杂,并且它有动态添加行
动态不应成为在名称末尾加[]
的障碍。
如果你真的无法更改名称,那么有可能完全绕过$_POST
并解析原始数据(via php://input
),但是当它填充{II}时,它会成为IIRC,PHP clobbers }。
答案 1 :(得分:7)
如果你有重复的名字,你必须给它们数组样式的名字:
<form action="bla.php" method=post>
<table class="pv-data">
<tr>
<td><input type="text" name="id[]" size="2" value=1 /></td>
<td><input type="text" name="longitude[]" size="7"/></td>
<td><input type="text" name="latitude[]" size="7"/></td>
</tr>
<tr>
<td><input type="text" name="id[]" size="2" value=2 /></td>
<td><input type="text" name="longitude[]" size="7"/></td>
<td><input type="text" name="latitude[]" size="7"/></td>
</tr>
</table>
<input type="submit" name="submit" value="SUBMIT">
</form>
执行此操作时,$_POST['id']
,$_POST['latitude']
和$_POST['longitude']
将是包含值的数组。
您的表单处理代码可以迭代这些:
for ($i = 0; $i < count($_POST['id']); $i++) {
if (isset($_POST['latitude'][$i], $_POST['longitude'][$i])) { // Make sure both are filled in
// Do stuff with this row of the form
}
}
答案 2 :(得分:0)
快速解决方案:
更改您拥有的代码中的输入标记名称并不复杂。试试这个:
<input type="text" name="id"'+counter+' size="2" value="'+counter+'"/>
这样,你会得到像id-1,id-2,id-3 ......
这样的名字答案 3 :(得分:0)
嗯,我知道有动态行生成。但这并不意味着您无法为每行中的文本框提供不同的名称。你绝对可以让它与众不同。我在jsfiddle中看到了你的代码。在附加时,您只需计算表格中的行数,相应地,您可以对其+1,并将其存储在变量中。并在文本框的名称中连接此变量。那么,每次都会点击添加单位,行中的文本框会有不同的名称。这是正确的解决方案。