DataTable 不接受来自数据库的 json

Posted

技术标签:

【中文标题】DataTable 不接受来自数据库的 json【英文标题】:DataTable not accepting json from database 【发布时间】:2018-09-27 19:16:01 【问题描述】:

我想在我的网站上设置一个数据表,我找到了一个我想使用的表here,我一直在尝试将它转换为我需要的。我在这项努力中没有取得太大的成功。我目前的情况是该表未填充数据库表中的行,并且我收到 json 响应错误。我可以打开检查器查看查询数据库返回json数据的php文件,我可以看到我正在以格式返回数据

    "data":[
"ssn":"100192686","dob":"1977-02-01","fn":"Latoyia","mi":"H","ln":"Herdon",
"ssn":"100263201","dob":"1962-06-15","fn":"Adena","mi":"M","ln":"Couch"
]

根据 json 验证器,它是有效的 json,但是当我重新加载页面时出现错误

 "table id=example - Invalid JSON response". 

如果 json 数据格式正确但没有正确返回,我该怎么办?这是该项目的gihub。我已经包含了我正在使用的 mysql 数据库文件以及一个包含 XHR 结果的文本文件。我觉得这行 $('#example').DataTable( javascript 是我的问题所在

<?php
    include_once 'header.php';
?>
<script src = 'https://code.jquery.com/jquery-1.12.4.js'></script>
<script src = 'https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js'></script>
<script src = 'https://cdn.datatables.net/buttons/1.5.1/js/dataTables.buttons.min.js'></script>
<script src = 'https://cdn.datatables.net/select/1.2.5/js/dataTables.select.min.js'></script>
<script src = 'JS/dataTables.editor.min.js'></script>
<link rel = "stylesheet" href = "https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css">
<link rel = "stylesheet" href = "https://cdn.datatables.net/buttons/1.5.1/css/buttons.dataTables.min.css">
<link rel = "stylesheet" href = "https://cdn.datatables.net/select/1.2.5/css/select.dataTables.min.css">
<link rel = "stylesheet" href = "https://editor.datatables.net/extensions/Editor/css/editor.dataTables.min.css">
<section class="main-container">
    <div class="main-wrapper">
        <h2>Home</h2>
        <?php
            if (isset($_SESSION['u_id'])) 
                $sql = "SELECT * FROM employee;";
                $result = mysqli_query($conn,$sql);
                $resultCheck = mysqli_num_rows($result);
                if($resultCheck > 0)
                    echo
                    "<table id='example' class='display' cellspacing='0' width='100%'>
                            <thead>
                                <tr>
                                    <th></th>
                                    <th>ssn</th>
                                    <th>dob</th>
                                    <th>first</th>
                                                    <th>MI</th>
                                                    <th>last</th>
                                </tr>
                            </thead>";
                
            
        ?>
    </div>
</section>

<script>

console.log("In the script open");


var editor; // use a global for the submit and return data rendering in the examples

$(document).ready(function() 


        editor = new $.fn.dataTable.Editor( 
            ajax: "infograb.php",
            table: "#example",
            fields: [ 
                    label: "Social#:",
                    name: "ssn",
                                    
                    label: "DOB:",
                    name: "dob",
                                    label: "First Name:",
                    name: "fn",
                                    
                    label: "Middle Initial:",
                    name: "mi",
                                    
                    label: "Last Name:",
                    name: "ln"
                        
            ]
     );


    $('#example').on( 'click', 'tbody td', function (e) 
        var index = $(this).index();

        if ( index === 1 ) 
            editor.bubble( this, ['fn', 'mi', 'ln'], 
                title: 'Edit name:'
             );
        
        else if ( index === 2 ) 
            editor.bubble( this, 
                buttons: false
             );
        
        else if ( index === 3 ) 
            editor.bubble( this );
        

     );

        var testData = [
                  "ssn": "98727748",
                  "dob": "2016-02-05",
                  "fn": "jake",
                                    "mi": "a",
                                    "ln": "butler"
                ];

    $('#example').DataTable( 
        dom: "Bfrtip",
        ajax:
                    url: 'infograb.php',
                    type: 'POST',
                    data: 
                    json: JSON.stringify( "data": testData )
                    ,
                    dataSrc: 'data'
                        ,
        columns: [
                        //sets the checkbox
                            data: null,
                            defaultContent: '',
                            className: 'select-checkbox',
                            orderable: false
                         ,
                         data: "dob" ,
             data: "ssn" ,
                         data: "fn" ,
                         data: "mi" ,
                         data: "ln" ,


        ],
        order: [ 1, 'asc' ],
        select: 
            style:    'os',
            selector: 'td:first-child'
        ,
        buttons: [
             extend: "create", editor: editor ,
             extend: "edit",   editor: editor ,
             extend: "remove", editor: editor 
        ]
     );
 );





console.log("End script");


</script>

<?php
    include_once 'footer.php';
?>

这是查询数据库并返回(据称)json数据的php文件

<?php
include_once 'dbconn.php';


 $rows = array();

 $sql = "SELECT * FROM employee";
 $result = $conn->query($sql) or die("cannot write");
 while($row = $result->fetch_assoc())
    $rows[] = $row;
 

 echo "<pre>";
 print json_encode(array('data'=>$rows));
 echo "</pre>";

 ?>

我已经在这里工作了大约 24 小时,我觉得我在这里犯了一个愚蠢的错误,我只是想不通。在这一点上,任何帮助都会让我跌落悬崖。

【问题讨论】:

【参考方案1】:

数据表可能会很痛苦,确保您尽可能多地阅读它们提供的文档是值得的。

我可以看到 2 个问题在您的代码上运行而无需运行测试。第一个是 infograb.php 不会保存发送给它的任何数据,因为它所做的只是在加载时返回数据。其次,您正在使用数据表的启动代码来尝试发送数据(可能是用于内联编辑,因为您似乎不需要为请求的数据发送任何变量)。我的第一步是退后一步:

ajax:
       url: 'infograb.php',
       type: 'POST',
       data: 
           json: JSON.stringify( "data": testData )
        ,
        dataSrc: 'data'
     ,

应该回到

ajax:
       url: 'infograb.php',
     ,

从 infograb.php 中删除 pre 标签,因为它们是不必要的。

这应该会为您将数据加载到表中。然后你就可以开始编辑工作了。

值得阅读和记录:

Ajax sourced data

PHP libraries

DataTables Editor 1.7.3 - PHP 5.3+ libraries

【讨论】:

当我说 pre 标签实际上有所帮助,出于某种原因,我只得到了表中的最后一行,pre 标签解决了它。但是随着您建议的更改,现在没有必要了。我现在正在填充表格,但是单击会导致行标识符错误 dataTables.editor.min.js:10 Uncaught Unable to find row identifier 有关更多信息,请参阅datatables.net/tn/14 但根据您在回答中所说的,我认为这是意料之中的,我现在正在寻找解决方案。感谢您的帮助。 没问题,我有很多关于数据表的问题,如果你能掌握它们,它们就很棒。假设 ssn 对于每一行都是唯一的(鉴于 ssn 的性质),您可以在编辑器部分进行更新 editor = new $.fn.dataTable.Editor( ajax: "infograb.php", table: "#example" , idSrc: 'ssn', 或者,您可以向 json 添加数据库标识符,例如自动增量 ID,并使用它来更具体地更新数据库,但由您决定。 我按照错误链接找到了 idSrc: 'what to use for id' 我正在使用它(你对文档的力量是正确的!)现在我正在处理编辑和删除按钮不起作用,添加不会添加新员工,但它会再次读取原来的 2500 名员工。如果我无法弄清楚我的按钮问题,我会将这个问题标记为已解决并询问另一个问题,再次感谢所有帮助和有用的资源! 它再次添加整个列表,因为您要求它。 editor = new $.fn.dataTable.Editor( ajax: "infograb.php", 然后在 "infograb.php" 你没有收到任何 $_POST 字段。

以上是关于DataTable 不接受来自数据库的 json的主要内容,如果未能解决你的问题,请参考以下文章

jstree做动态树,json格式传输,存储过程获得datatable之类,不知道如何把datatable转换为需要的json数据格式

将 JSON 数据显示到 DataTable Flutter

DataTable 不接受 MySQL 表中的 DateTime 字段

DataTable的MergeCOPYAcceptChange使用说明

仅接受来自 JSON 的属性的数字格式

使 WCF 服务接受来自 jQuery.AJAX() 的 JSON 数据