You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键改动说明

  1. 将<form>的开启代码移到请求遍历循环内部,确保每个请求对应独立表单;
  2. 在每个请求的循环结束处添加</form>,闭合当前表单;
  3. 点击某条请求的按钮时,只会提交该表单内的solicitudId和对应的animales[]数组,不会和其他请求的字段混淆。

内容的提问来源于stack exchange,提问作者santurron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:10:30