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

PHP数据获取故障:点击按钮仅表格首行数据显示至#datacontainer

解决表格仅第一行按钮能触发数据展示的问题

这个问题其实很常见——你在循环生成表格行的时候重复使用了相同的ID,而HTML规范里ID必须是唯一的,这就导致你的JS只能拿到页面上第一个匹配该ID的元素,所以只有第一行能正常工作。下面是一步步的修复方案:

1. 修正HTML表格的重复ID问题

把循环里的重复ID改成类名,同时给点击按钮传递当前元素的引用,这样就能定位到对应行的ID:

<table>
  <tr>
    <th width="15%;">Image</th>
    <th width="0">ID</th>
    <th width="50%;">Name</th>
    <th>Action</th>
  </tr>
  <?php while ($row = mysqli_fetch_array($accounts)) { ?>
  <tr>
    <td><img src="images/<?php echo $row['image']; ?>"></td>
    <td>
      <?php echo $row['id']; ?>
      <!-- 把id改成class,同时隐藏输入框(不需要显示) -->
      <input type="text" class="text_id" value="<?php echo $row['id']; ?>" style="display:none;">
    </td>
    <td><?php echo $row['lastname']; ?>, <?php echo $row['firstname']; ?></td>
    <td>
      <!-- 去掉重复id,把当前按钮作为参数传给chk函数 -->
      <i class="fab fa-reddit-alien" onclick="chk(this)"></i>
      <i class="far fa-edit" style="margin: 0 7% 0 7%;"></i>
      <i class="fas fa-trash"></i>
    </td>
  </tr>
  <?php } ?>
</table>
<div id="datacontainer"></div>

2. 更新JS函数,通过按钮定位对应行的ID

修改chk函数,利用传入的按钮元素找到它所在的表格行,再获取该行的ID值:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
function chk(btn) {
  $("#datacontainer").slideToggle(300);
  // 通过按钮找到所在行,再获取该行的ID输入框值
  var id = $(btn).closest('tr').find('.text_id').val();
  var dataString = 'id='+ id;
  
  $.ajax({
    type: "post",
    url: "showdata.php",
    data: dataString,
    cache: false,
    success: function(data){
      $("#datacontainer").html(data);
    }
  });
  return false;
}
</script>

3. 修复PHP的SQL注入风险(必做!)

你的showdata.php直接把用户传入的ID拼到SQL里,存在严重的注入漏洞,改用预处理语句修复:

<?php
$db = mysqli_connect('localhost', 'root', '', 'psbr');
if (isset($_POST['id'])) {
  $id = $_POST['id'];
  // 使用预处理语句防止SQL注入
  $stmt = $db->prepare("SELECT * from accounts where id = ?");
  $stmt->bind_param("i", $id); // "i"表示参数是整数类型
  $stmt->execute();
  $accounts = $stmt->get_result();
}
?>
<table>
  <?php while ($row = mysqli_fetch_array($accounts)) { ?>
  <tr>
    <td class="w"><h1>Name</h1></td>
  </tr>
  <tr>
    <td><?php echo $row['lastname']; ?></td>
  </tr>
  <?php } ?>
</table>
<style type="text/css">
.w { font-size: 12vh; }
</style>

这样修改后,点击每一行的按钮都会获取到对应行的ID,AJAX请求就能正确拉取并展示对应的数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:44:58