PHP体育联盟系统:动态表单Radio输入致数据错误写入问题
问题原因分析
- Radio按钮分组错误:你设置的
name="statusGoalie[]"会让所有动态添加的radio成为同一组,浏览器只会将选中的单个radio值以statusGoalie[0]的形式提交,导致PHP中$goalieresult数组的索引和$playerGoalie的索引无法对应——无论你选第几个守门员,$goalieresult[0]都会存在,遍历第一个球员时就会触发更新。 - 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
相关产品推荐
相关产品推荐

