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

PHP体育联盟系统:动态表单Radio输入致数据错误写入问题

问题原因分析
  1. Radio按钮分组错误:你设置的name="statusGoalie[]"会让所有动态添加的radio成为同一组,浏览器只会将选中的单个radio值以statusGoalie[0]的形式提交,导致PHP中$goalieresult数组的索引和$playerGoalie的索引无法对应——无论你选第几个守门员,$goalieresult[0]都会存在,遍历第一个球员时就会触发更新。
  2. Label关联错误:原代码中label的for属性值为"finish",和对应的radio的idgoaliemenufinish'+count+'不匹配,导致点击label无法选中radio,影响操作体验。
修复方案(针对单完赛守门员场景)

1. 修改JavaScript动态生成代码

将radio的name改为统一的statusGoalie,value设置为当前的计数器count(对应守门员的索引),同时修复label的for属性:

$(document).on('click', '.addgoalies', function(){     
 count++;      
 var html = '';
  
    html += '<div class="goal"><select name="teamGoalie[]" class="teamzGoalie" data-playerz="'+count+'" ><option value="">Team</option><?php echo fill_select_box($pdo, "0"); ?></select>'; 
    html += '<select class="goal" name="playerGoalie[]" id="playermenu'+count+'"><option value="">Player</option></select>'; 
    html += '<input type="number" name="goalsAgainst[]" placeholder="0" class="tendy" id="goaliemenu'+count+'">'; 
    // 修复后的radio和label
    html += '<input type="radio" name="statusGoalie" value="'+count+'" class="status" id="goaliemenufinish'+count+'"><label for="goaliemenufinish'+count+'">FINISH</label>'; 
    html += '<button type="button" name="remove" class="remove"><span class="glyphicon glyphicon-minus">REMOVE</span></button></div>';
 $('.wrapper3').append(html);
});

2. 修改PHP处理逻辑

不再遍历所有球员,直接根据提交的选中索引找到对应球员更新:

<?php
$playerGoalie = $_POST['playerGoalie'];
$goalsagainst = $_POST['goalsAgainst'];

// 处理goalsAgainst的更新(原有逻辑正常保留)
for($count = 0; $count < count($playerGoalie); $count++){
    $data1 = array(
        ':goalsagainst'=>$goalsagainst[$count],
        ':playerid'=>$playerGoalie[$count]
    );
    $sql1 = "UPDATE goalies SET                   
    goals_ag = goals_ag+:goalsagainst
    WHERE id = :playerid";
    $statement1 = $pdo->prepare($sql1);
    $statement1->execute($data1);
}

// 处理Wins的更新(修复后的逻辑)
if(isset($_POST['statusGoalie'])){
    // 注意count从1开始,数组索引从0开始,所以要减1
    $selectedIndex = (int)$_POST['statusGoalie'] - 1;
    // 检查索引是否有效,避免越界
    if(isset($playerGoalie[$selectedIndex])){
        $data2 = array(
            ':playerid'=>$playerGoalie[$selectedIndex]
        );
        $sql2 = "UPDATE goalies SET                   
        Wins = Wins+1
        WHERE id = :playerid";
        $statement2 = $pdo->prepare($sql2);
        $statement2->execute($data2);
    }
}
?>
补充说明

如果业务场景允许多个守门员标记为完赛,需将radio改为checkbox,并设置name="statusGoalie['+count+']",提交后$goalieresult数组的索引会和$playerGoalie一一对应,此时可保留遍历逻辑,但要判断isset($goalieresult[$count])(checkbox未选中时不会提交对应值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:30:17