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

点击按钮通过Ajax获取MySQL数据到Bootstrap模态框表格的问题

解决Bootstrap模态框显示MySQL JSON数据的问题

看起来你已经走了大半流程,核心问题出在后端返回内容混合了HTML和JSON,导致前端没法正确解析渲染。我来帮你一步步修正这个问题:


问题根源分析

你的data.php同时输出了HTML表格结构和JSON数据,前端拿到的是混合内容,直接用$('#moreInfo').html(data)就会把JSON字符串当成纯文本显示,也就是你看到的"数组形式"。另外,前端点击按钮的AJAX请求没指定dataType: 'json',无法自动解析返回的JSON。


解决方案:拆分前后端职责

后端只负责返回纯JSON数据,前端负责生成表格结构并渲染数据。

1. 修复data.php:只返回纯JSON

把输出HTML的部分删掉,让后端专注于数据接口:

<?php
// 确保已有数据库连接$conn
$return_arr = [];
// 用null合并运算符避免未定义索引警告
$id = $_POST["data_id"] ?? null;

if ($conn && isset($id)) {
    $sql = $conn->prepare("SELECT table1.table1_id AS id1, table1.data AS table1, GROUP_CONCAT(DISTINCT(table2.data) SEPARATOR ', ') AS table2, GROUP_CONCAT(DISTINCT(table1_table2.connection) SEPARATOR ', ') AS conn FROM table1 LEFT JOIN table1_table2 ON table1.table1_id = table1_table2.table1_id LEFT JOIN table2 ON table2.table2_id = table1_table2.table2_id WHERE table1.table1_id=? GROUP BY table1.table1_id");
    $sql->bind_param('i', $id);
    $sql->execute();
    $result = $sql->get_result();
    $sql->close();
    
    while($row = mysqli_fetch_assoc($result)){
        $return_arr[] = [
            "id" => $row['id1'], 
            "table1" => $row['table1'], 
            "table2" => $row['table2'], 
            "conn" => $row['conn']
        ];
    }
}

// 明确告诉浏览器返回的是JSON格式
header('Content-Type: application/json');
echo json_encode($return_arr);
?>

2. 修改前端AJAX逻辑:正确解析并渲染数据

更新index.php里的点击事件代码,让前端自己生成表格:

<script>
$(document).ready(function(){
    $('.view_data').click(function(){
        var data_id = $(this).attr("id");
        $.ajax({
            url:"data.php",
            method:"post",
            data:{data_id:data_id},
            dataType: 'json', // 自动解析JSON为JS对象
            success:function(response){
                // 清空模态框旧内容
                $('#moreInfo .table-responsive').empty();
                
                // 生成表格结构
                let tableHtml = `
                    <table id="modalTable" class="table table-bordered">
                        <tr>
                            <td align="center"><label><b>Data</b></label></td>
                            <td align="center"><label><b>Connect to</b></label></td>
                            <td align="center"><label><b>Description</b></label></td>
                        </tr>
                `;
                
                // 遍历数据生成行
                if(response.length > 0){
                    response.forEach(item => {
                        tableHtml += `
                            <tr>
                                <td align='center'>${item.table1}</td>
                                <td align='center'>${item.table2}</td>
                                <td align='center'>${item.conn}</td>
                            </tr>
                        `;
                    });
                } else {
                    // 无数据时显示提示
                    tableHtml += '<tr><td colspan="3" align="center">No data found</td></tr>';
                }
                
                tableHtml += '</table>';
                
                // 插入表格并显示模态框
                $('#moreInfo .table-responsive').html(tableHtml);
                $('#myModalLabel').text(`Data Details (ID: ${data_id})`);
                $('#dataModal').modal("show");
            },
            error:function(xhr, status, error){
                // 处理请求失败情况
                $('#moreInfo .table-responsive').html(`<p class="text-danger">Failed to load data: ${error}</p>`);
                $('#dataModal').modal("show");
            }
        });
    });

    // 列表加载逻辑保持不变(确保每行的.view_data按钮带有正确ID)
    $.ajax({
        url: 'data.php',
        type: 'get',
        dataType: 'JSON',
        success: function(response){
            response.forEach(item => {
                let tr_str = `
                    <tr>
                        <td align='center'>${item.table1}</td>
                        <td align='center'>${item.table2}</td>
                        <td align='center'>${item.conn}</td>
                        <td align='center'><button class='view_data btn btn-info' id='${item.id}'>View Data</button></td>
                    </tr>
                `;
                $("#userTable").append(tr_str);
            });
        }
    });
});
</script>

3. 确保模态框HTML结构正确

你的模态框结构基本没问题,只需确认.table-responsive容器存在:

<div class="modal fade" id="dataModal" tabindex="-1" role="dialog" aria-labelledby="basicModal">
 <div class="modal-dialog">
 <div class="modal-content">
 <div class="modal-header">
 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
 <h4 class="modal-title" id="myModalLabel"></h4>
 </div>
 <div class="modal-body" id="moreInfo">
 <div class="table-responsive">
 <!-- 动态表格会插入到这里 -->
 </div>
 </div>
 <div class="modal-footer">
 <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
 </div>
 </div>
 </div>
 </div>

关键改动说明

  1. 后端只返回JSON数据,避免了HTML和JSON混合的问题
  2. 前端指定dataType: 'json',自动解析返回数据
  3. 用模板字符串动态生成表格,代码更易读
  4. 添加了错误处理和无数据提示,提升用户体验
  5. 模态框标题显示当前数据ID,更直观

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:08:48