No hay forma (que yo conozca) para evitar enviar nombres de formularios todos iguales, SALVO en el caso de que generes un formulario distinto por cada fila de registros y, aún así, en tu cgi deberás saber qué formulario se ha activado, con lo que estamos en lo mismo: cada formulario tiene que tener un nombre distinto. Quizás sea la mejor solución, ya que simplifica mucho la generación del html.
De otra forma, tenemos que generar nombres de campos todos distintos.
Partiendo del bucle while tuyo, puedes incluir una variable contador para que nos ayude a ir numerando los registros o, mejor aún: si uno de los campos de tu base de datos es de tipo autonumérico -y por lo tanto es el id del registro, único e irrepetible-, lo utilizaremos. Como en tu base de datos veo que el campo 'registro' no lo usas para nada, creo que ese es el campo que se debe utilizar.
Modificamos entonces el código para que quede así:
- Código: Seleccionar todo
while (my $ref = $sth3->fetchrow_hashref()) {
$rec = $ref->{'registro'};
$cont = $ref->{'container'};
$fecha = $ref->{'indate'};
$llego = $ref->{'llego'};
$ubica = $ref->{'ubicacion'};
print qq(<td align="right">$cont</td>);
print qq(
<td align="center"><input type="text" name="fechain_$rec" size="10" value="$fecha"></td>
<td align="center"><select size="1" name="llego_$rec">
<option value="$llego">$llego</option>
<option value="SI">SI</option>
<option value="NO">NO</option>
</select></td>);
print qq(
<td align="center"><select size="1" name="ubicacion_$rec">
<option value="$ubica">$ubica</option>
<option value="Patios">Patios</option>
<option value="Almacen">Almacen</option>
<option value="Vacios">Vacios</option>
</select></td>\n);
}
Como ves, en el nombre de los campos editables hemos hecho un cambio: le agregamos el valor de $rec. De esa forma, cuando recibamos todos los campos de vuelta, como te ha indicado kidd, vamos leyendo uno a uno, lo pasamos por una expresión regular:
- Código: Seleccionar todo
($rec) = $campo =~ /_(.+)/;
y así sabemos a qué registro hace referencia ese campo. Lo ideal es agruparlos todos bajo el mismo registro para saber dónde hay que hacer el UPDATE.
Otra forma: si se trata de poner los registros uno por línea, agregar un botón submit a la derecha de todos los campos, con un nombre construído como se indica aquí. De esa manera, cuando tu cgi se llame, lo primero será saber qué botón se pulsó, y de ahí, sabes qué registro es el que el usuario quiere modificar. Es mucho más rápido (más feo porque hay en pantalla un montón de botones, pero...).