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

JS函数如何获取PHP while循环动态生成表格的对应主键ID

实现方法

你现在的问题核心是触发事件时没有定位到当前操作的DOM行,硬编码固定ID自然只能拿到第一行数据,两种可直接落地的方案如下:


方案1:改造内联事件,直接传入当前行主键

PHP循环输出行的时候,直接把当前行的主键值作为参数传给UpdateRun函数,不需要靠ID后缀反推ID,改造成本最低:

第一步:调整PHP循环输出的HTML结构

你原来写在textarea上的value属性是无效的(textarea没有value属性,取值直接取标签包裹的文本即可),可以删掉,onkeyup调用时直接传当前行主键:

<?php
// 假设你循环读取查询结果的变量是$row
while ($row = $result->fetch_assoc()) {
    $id = (int)$row['iD_Orsyp']; // 主键转整数,过滤非法参数
?>
<tr>
  <td><textarea name="iD_Orsyp<?= $id ?>" id="iD_Orsyp<?= $id ?>"><?= $id ?></textarea></td>
  <td><textarea name="Sistema<?= $id ?>" id="Sistema<?= $id ?>"><?= htmlspecialchars($row['Sistema']) ?></textarea></td>
  <td><textarea name="Azione_Intrapresa<?= $id ?>" id="Azione_Intrapresa<?= $id ?>" onkeyup="UpdateRun(<?= $id ?>)"></textarea></td>
</tr>
<?php } ?>

第二步:修改JS函数接收传入的ID参数

function UpdateRun(id){
  // 直接用传进来的当前行ID拼接选择器取值
  var Sistema = $('#Sistema'+id).val();
  var Azione_Intrapresa = $('#Azione_Intrapresa'+id).val();
  $.ajax({
   type: 'POST',
   url:'UpdateRunbook.php',
   data: {ajax: 1,Azione_Intrapresa: Azione_Intrapresa, iD_Orsyp: id,Sistema:Sistema},
   success: function(response){
    console.log('更新行ID:', id, '提交内容:', Azione_Intrapresa, '系统:', Sistema);
   }
  });
}

方案2(推荐):用jQuery事件委托,抛弃内联事件

内联写on事件不好维护,后续新增行还要重复绑定,用事件委托可以一劳永逸,不需要给每个元素单独绑事件,也不用依赖ID后缀匹配:

第一步:调整PHP输出的HTML结构,加标识类和data属性

给行和输入框加统一类名,主键存在行的data-id属性上,不用靠ID拼后缀找元素:

<?php
while ($row = $result->fetch_assoc()) {
    $id = (int)$row['iD_Orsyp'];
?>
<!-- 给tr加data-id存主键,加类名标识是可编辑行 -->
<tr class="edit-row" data-id="<?= $id ?>">
  <td><textarea class="id-orsyp" name="iD_Orsyp<?= $id ?>" id="iD_Orsyp<?= $id ?>"><?= $id ?></textarea></td>
  <td><textarea class="sistema-input" name="Sistema<?= $id ?>" id="Sistema<?= $id ?>"><?= htmlspecialchars($row['Sistema']) ?></textarea></td>
  <!-- 给输入框加统一类名,不需要写onkeyup内联事件 -->
  <td><textarea class="azione-input" name="Azione_Intrapresa<?= $id ?>" id="Azione_Intrapresa<?= $id ?>"></textarea></td>
</tr>
<?php } ?>

第二步:写统一的事件监听代码

$(function(){
  // 监听所有.azione-input的keyup事件,动态生成的元素也能触发
  $(document).on('keyup', '.azione-input', function(){
    // 先找到当前输入框所在的行
    var $currentRow = $(this).closest('.edit-row');
    // 从行上取主键ID
    var id = $currentRow.data('id');
    // 从当前行里找对应的输入框取值
    var Sistema = $currentRow.find('.sistema-input').val();
    var Azione_Intrapresa = $(this).val();

    // 建议加防抖,用户输入停顿300毫秒再发请求,避免每按一个键就发一次请求压垮服务器
    clearTimeout(window.updateTimer);
    window.updateTimer = setTimeout(function(){
      $.ajax({
        type: 'POST',
        url:'UpdateRunbook.php',
        data: {ajax: 1,Azione_Intrapresa: Azione_Intrapresa, iD_Orsyp: id,Sistema:Sistema},
        success: function(response){
          console.log('更新成功,行ID:', id);
        }
      });
    }, 300);
  })
})

注意事项

  • 后端接收iD_Orsyp参数时必须做整数类型校验,避免SQL注入风险
  • textarea标签没有value属性,不要在标签上写value属性存值,默认值直接写在textarea开闭标签中间即可
  • 如果表格后续会动态新增行,必须用方案2的事件委托,方案1需要给新行重新绑内联事件,维护成本高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:24:30