PHP中如何从foreach循环获取指定POST值而非最后索引
解决点击「Update Payment」按钮无法获取对应索引的问题
问题现状
通过foreach循环生成8张卡片,每张卡片包含隐藏输入框key_val和「Update Payment」按钮,但点击任意按钮后,输出的始终是最后一个索引(8),无法获取当前点击卡片对应的$key。
问题原因
所有卡片的隐藏输入框和按钮都共享同一个表单上下文(如果页面没有显式包裹表单,默认整个页面为一个表单),提交时浏览器会读取同名输入框的最后一个值,因此无论点击哪个按钮,$_POST['key_val']都会拿到最后一张卡片的$key。
解决方案
方法1:为每个卡片单独包裹表单
将每张卡片的内容放在独立的<form>标签内,确保每个按钮提交的是自身所在表单的隐藏输入值:
<?php foreach ($cards as $key=> $row): $items[] = $row; echo "<br>"; ?> <div class="card"> <div class="card-body"> <form method="post"> <h5 class="card-title"><?echo $row['Holder_Name'];?></h5> <input type="hidden" name="key_val" value="<?= $key ?>"> <p class="card-text">Visa ending in <?echo $row['Card_ends']?></p> <? if ($row['is_active']!=1){ echo'<button name="update_card" class="btn btn-warning ">Update Payment</button>'; ?> </form> </div> </div> <? endforeach; if(isset($_POST['update_card']) && isset($_POST['key_val'])) { $keyBuy = $_POST['key_val']; echo $keyBuy; } ?>
方法2:通过按钮的value属性直接传递索引
移除隐藏输入框,将$key赋值给按钮的value属性,提交时直接从$_POST['update_card']获取对应索引:
<?php foreach ($cards as $key=> $row): $items[] = $row; echo "<br>"; ?> <div class="card"> <div class="card-body"> <h5 class="card-title"><?echo $row['Holder_Name'];?></h5> <p class="card-text">Visa ending in <?echo $row['Card_ends']?></p> <? if ($row['is_active']!=1){ echo'<button name="update_card" class="btn btn-warning " value="'.$key.'">Update Payment</button>'; ?> </div> </div> <? endforeach; if(isset($_POST['update_card'])) { $keyBuy = $_POST['update_card']; echo $keyBuy; } ?>
注意事项
- 确保表单的
method属性设置为post,与后端接收逻辑匹配 - 方法1逻辑清晰,每个卡片的提交数据独立;方法2更简洁,减少冗余DOM元素
内容的提问来源于stack exchange,提问作者baraa
相关产品推荐
相关产品推荐

