【问题标题】:DataTable not accepting json from databaseDataTable 不接受来自数据库的 json
【发布时间】: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 小时,我觉得我在这里犯了一个愚蠢的错误,我只是想不通。在这一点上,任何帮助都会让我跌落悬崖。

【问题讨论】:

    标签: javascript php json ajax database


    【解决方案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 字段。
    猜你喜欢
    • 2018-11-08
    • 2015-09-07
    • 2021-04-06
    • 1970-01-01
    • 2013-03-09
    • 2016-02-11
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多