由于{}而不是[]

时间:2017-08-31 08:35:15

标签: php json datatable

我正在尝试使用json源中的数据刷新数据表。 我在组合中选择一个类型,然后我提交,我的ajax函数获取数据,我在数据表上设置这些数据。

这是我的js:

$('#submit_search_type_client').on('click', function(e){
    var idType = $('#lst_type').val();
    var idclient = $('#frmTab_Client_type').val();
    var data = "idType=" + idType + "&idClient=" + idclient;
    $.ajax({
        type: "POST",
        url: root_url + "client/getTypes",
        data: data,
        dataType: 'JSON',
        success: function(data){
            if(data.success){
                var source = data.myreturn;
                $('#mydatatables').dataTable( {
                    "processing": true,
                    "serverSide": true,
                    "pageLength": 5,
                    language: {
                        url: 'views/js/plugins/datatables/french.json'
                    },
                    "ajax": source
                });
            }
        },
        error: function(data){

        }
    }); // End ajax
});

我的PHP函数返回我的数据:

if($myresult= $this->db->query($requete))
{
    $myresult->setFetchMode(PDO::FETCH_NUM);
    $line = $myresult->fetchAll();
}

$tab['data'] = json_encode($line);

echo json_encode(array('success'=>'true', 'myreturn'=>$tab));

如果我让PDO :: FETCH_NUM,我的json看起来像这样:

{"success":"true","myreturn":{"data":"[[\"6017\",\"Client Type TOTO\",\"01\\\/09\\\/2017 08:00\"],[\"6018\",\"Client Type TOTO\",\"01\\\/09\\\/2017 09:00\"],[\"6019\",\"Client Type TOTO\",\"01\\\/09\\\/2017 10:00\"],[\"6020\",\"Client Type TOTO\",\"01\\\/09\\\/2017 11:00\"],[\"6021\",\"Client Type TOTO\",\"01\\\/09\\\/2017 12:00\"],[\"6052\",\"Client Type TOTO\",\"05\\\/09\\\/2017 19:00\"],[\"6156\",\"Client Type TOTO\",\"21\\\/09\\\/2017 15:00\"],[\"6163\",\"Client Type TOTO\",\"22\\\/09\\\/2017 10:00\"],[\"6166\",\"Client Type TOTO\",\"22\\\/09\\\/2017 13:00\"],[\"6167\",\"Client Type TOTO\",\"22\\\/09\\\/2017 14:00\"],[\"6170\",\"Client Type TOTO\",\"22\\\/09\\\/2017 17:00\"],[\"6172\",\"Client Type TOTO\",\"22\\\/09\\\/2017 19:00\"],[\"6204\",\"Client Type TOTO\",\"28\\\/09\\\/2017 15:00\"],[\"6223\",\"Client Type TOTO\",\"02\\\/10\\\/2017 10:00\"],[\"6224\",\"Client Type TOTO\",\"02\\\/10\\\/2017 11:00\"],[\"6225\",\"Client Type TOTO\",\"02\\\/10\\\/2017 12:00\"],[\"6244\",\"Client Type TOTO\",\"03\\\/10\\\/2017 19:00\"],[\"6263\",\"Client Type TOTO\",\"06\\\/10\\\/2017 14:00\"],[\"6264\",\"Client Type TOTO\",\"06\\\/10\\\/2017 15:00\"],[\"6265\",\"Client Type TOTO\",\"06\\\/10\\\/2017 16:00\"],[\"6266\",\"Client Type TOTO\",\"06\\\/10\\\/2017 17:00\"],[\"6277\",\"Client Type TOTO\",\"09\\\/10\\\/2017 16:00\"],[\"6278\",\"Client Type TOTO\",\"09\\\/10\\\/2017 17:00\"],[\"6288\",\"Client Type TOTO\",\"10\\\/10\\\/2017 15:00\"],[\"6290\",\"Client Type TOTO\",\"10\\\/10\\\/2017 17:00\"]]"}}

我没有来自Datatables的错误,但我的数据表中没有数据。

如果在PHP中我替换

$tab['data'] = json_encode($ine);

by

$tab['data'] = $line;

我收到这个:“DataTables警告:table id = table_availabilities - JSON响应无效。有关此错误的详细信息,请参阅http://datatables.net/tn/1

如果在我的PDO SELECT中,我用PDO :: FETCH_ASSOC替换PDO :: FETCH_NUM

我收到此消息:“DataTables警告:table id = table_availabilities - 无效的JSON响应。有关此错误的详细信息,请参阅http://datatables.net/tn/1

我尝试了另一件事,在我的ajax中,我为源设置了一个类似的文本文件:

  

{     “数据”:[       [         “TOTO”         “你好你好你好”       ]       [         “TOTO”         “你好你好你好”       ]       [         “TOTO”         “你好你好你好”       ]       [         “TOTO”         “你好你好你好”       ]       [         “TOTO”         “你好你好你好”       ]       [         “TOTO”         “你好你好你好”       ]            [              “TOTO”              “你好你好你好”            ]     ]    }

它有效,所以我将我的json返回与这个文本文件进行比较,我看到我有:

{"data":"[[\"6017\",\"Client Type TOTO\",\"01\\\/09\\\/2017 08:00\"],[\"6018\",\"Client Type TOTO\",\"01\\\/09\\\/2017 09:00\"], ...

文本文件:

  {
  "data": [
    [
      "TOTO",
      "hihihi"
    ],
    [
      "TOTO",
      "hihihi"
    ], ...

不同之处在于“数据”之后:我有这样的说法:“看起来它是一个字符串,我可以纠正这个吗?

由于

1 个答案:

答案 0 :(得分:1)

让我们看一下手册,你会看到,ajax选项需要链接到脚本,它会返回一些数据。

在您的情况下data.myreturn不是脚本的链接,它是带有数据的字符串。另外我不明白为什么你做ajax-request然后在回调中另一个来自datatables的ajax请求被触发。我想这是因为对ajax财产的误解。

那么,你需要改变什么:

$('#submit_search_type_client').on('click', function(e){
    var idType = $('#lst_type').val();
    var idclient = $('#frmTab_Client_type').val();
    var data = "idType=" + idType + "&idClient=" + idclient;
    // Full url
    var url = root_url + "client/getTypes?" + data;

    $('#mydatatables').dataTable( {
        "processing": true,
        "serverSide": true,
        "pageLength": 5,
        language: {
            url: 'views/js/plugins/datatables/french.json'
        },
        // Full url is passed to ajax. URL, not data
        // Ajax request to this `url` should return data
        "ajax": url
    } );
});

在你的php中你可以这样做:

$line = [];
if($myresult= $this->db->query($requete))
{
    $myresult->setFetchMode(PDO::FETCH_NUM);
    $line = $myresult->fetchAll();
}
// Return data key only
echo json_encode(array('data' => $line));

最终警告。默认情况下,将数据传递到ajax选项值的方法是GET。因此,我使用GET参数创建了url作为网址。

您可以按照docs中的说法将方法更改为POST,但是您必须在后期请求中将数据作为参数传递。但是文档中描述了一切。