PHP循环表单提交异常:隐藏域仅传递最后一行数据
问题解决:PHP循环生成表单提交错误的字段值
问题根源
核心问题是表单作用域错误:你将<form>标签写在了遍历请求的foreach循环外部,所有请求的隐藏输入框都属于同一个表单:
- 对于同名普通输入框
solicitudId,浏览器提交时只会保留最后一个渲染的值; - 对于数组输入框
animales[],会收集表单内所有该名称的输入值,自然会包含所有行的动物ID。
解决方案
将表单的开启和闭合逻辑移到foreach($solis as $solicitud)循环内部,让每一条请求对应一个独立的表单,确保提交时只传递当前请求的相关数据。
修改后的完整代码
<?php if (isset($solis) && !empty($solis)) { ?> <thead> <th>Opcion</th> <th>Nombre Dueño</th> <th>Nombre Guardian</th> <th>Desde</th> <th>Hasta</th> <th>Direccion de guarda</th> <th>Nombre de mascota</th> <th>Especie</th> <th>Raza</th> <th>Observaciones</th> </thead> <tbody> <?php foreach ($solis as $solicitud) { $count = 0; // 关键改动:每个请求对应独立表单 if ($_SESSION['tipo'] == 'g') { ?> <form action="<?php echo FRONT_ROOT ?>Guardian/operarSolicitud" method="POST"> <?php } else { ?> <form action="<?php echo FRONT_ROOT ?>Dueno/cancelarSolicitud" method="POST"> <?php } ?> <?php foreach ($mascXsoli as $tabla) { if ($tabla->getIdSolicitud() == $solicitud->getId()) { $idMascotaX = $tabla->getIdMascota(); foreach ($mascotas as $masc) { if ($masc->getId() == $idMascotaX) { $count++; } } } } ?> <tr> <td rowspan="<?php echo $count; ?>"> <input type="hidden" name="solicitudId" value="<?php echo $solicitud->getId(); ?>"> <?php if ($_SESSION['tipo'] == 'g') { ?> <button type="submit" name="operacion" value="aceptar" class="btn btn-danger"> Aceptar </button> <button type="submit" name="operacion" value="rechazar" class="btn btn-danger"> Rechazar </button> <?php } else { ?> <button type="submit" class="btn btn-danger"> Cancelar </button> <?php } ?> </td> <td rowspan="<?php echo $count; ?>"><?php echo $solicitud->getNombreDueno(); ?></td> <td rowspan="<?php echo $count; ?>"><?php echo $solicitud->getNombreGuardian(); ?></td> <td rowspan="<?php echo $count; ?>"><?php echo $solicitud->getFechaInicio(); ?></td> <td rowspan="<?php echo $count; ?>"><?php echo $solicitud->getFechaFin(); ?></td> <td rowspan="<?php echo $count; ?>"><?php echo $solicitud->getDireccionGuardian(); ?></td> <?php foreach ($mascXsoli as $tabla) { if ($tabla->getIdSolicitud() == $solicitud->getId()) { $idMascotaX = $tabla->getIdMascota(); foreach ($mascotas as $masc) { if ($masc->getId() == $idMascotaX) { ?> <td><?php echo $masc->getNombre(); ?></td> <td><?php echo $masc->getEspecie(); ?></td> <td><?php echo $masc->getRaza(); ?></td> <td><?php echo $masc->getObservaciones(); ?></td> <?php if ($_SESSION['tipo'] == 'g') { ?> <input type="hidden" name="animales[]" value="<?php echo $masc->getId(); ?>"> <?php } ?> </tr> <?php } } } } ?> </form> <!-- 闭合当前请求的表单 --> <?php } ?> </tbody> <?php } else { ?> <h4>NO HAY SOLICITUDES ENVIADAS!</h4> Si ha enviado una solicitud anteriormente, puede que esta haya sido aceptada y deba pagar su confirmacion. <?php } ?>
关键改动说明
- 将
<form>的开启代码移到请求遍历循环内部,确保每个请求对应独立表单; - 在每个请求的循环结束处添加
</form>,闭合当前表单; - 点击某条请求的按钮时,只会提交该表单内的
solicitudId和对应的animales[]数组,不会和其他请求的字段混淆。
内容的提问来源于stack exchange,提问作者santurron
相关产品推荐
相关产品推荐

