Get the values of 2 HTML input tags having the same name using PHP

Suppose I have the following table:

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

I want to assign the values in this table to php variables, so in bla.php

if I used $id = $_REQUEST['id']; only the last value is taken because there are two input tags that have the same name.

So can I request the 2 values of these tags having the same name into php?

p.s don't tell me to change the name of the input tags, because the table is bit more complicated than that and it has dynamic add rows: My real code is: http://jsfiddle.net/CchES/9/


Solution 1:

When PHP populates $_POST, if multiple pieces of data have the same name, and that name does not end in [] then only one will survive to appear in the $_POST array.

Rename the fields so the names ends in [].

don't tell me to change the name of the input tags, because the table is bit more complicated than that and it has dynamic add rows

Being dynamic shouldn't be a barrier to having [] on the end of the name.

If you really can't change the name then it might be possible to bypass $_POST entirely and parse the raw data (via php://input) but IIRC, PHP clobbers that when it populates $_POST.

Solution 2:

When you have repeated names, you have to give them array-style names:

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

When you do this, $_POST['id'], $_POST['latitude'], and $_POST['longitude'] will be arrays containing the values.

Your form processing code can then iterate over these:

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
  }
}