Datatables AJAX - передача массива - PullRequest
0 голосов
/ 15 февраля 2019

(Сообщение обновлено в соответствии с полученной мною справкой)

Я пытаюсь, чтобы моя таблица данных jQuery динамически заполнялась через Ajax (и th, и td).

Для этого я неукоснительно следую сценарию jsfiddle , который я нашел здесь и который, кажется, работает.

Разница в том, что человек, который написал этоСценарий просто жестко запрограммировал свою переменную «dataSet» перед использованием, в то время как мне нужно автоматически сгенерировать ее из php, а затем проанализировать в jQuery.

Когда я пытаюсь это сделать, все, что я получаю, это:

TypeError: e is not an Object. (evaluating '"length"in e').

Тем временем ислам очень помог мне в чате, и похоже, что форматирование и console.log (dataSet) теперь в порядке.

Вот моя (обновленная) попытка:

HTML:

<table id="example"></table> 

PHP:

<?php
    $dataset=array();
    ....
    while($row = mysqli_fetch_assoc($sql)) {
        .....
        $array_tmp = array();
        $array_tmp["Header1"] = $alias;
        $array_tmp["Header2"] = $chambres;
        $array_tmp["Header3"] = $adresse;
        $dataset[] = $array_tmp;
    }
    ....
    echo json_encode($dataset, JSON_UNESCAPED_UNICODE);
?>

jQuery:

var my_columns = [];
var dataSet =[];

$.ajax({
    type: "GET",
    url:  "myfile.php",
    data: 'value=1',
    datatype:'json',
    cache: false,
    success: function(response){
        dataSet=response;
        $.each( dataSet[0], function( key, value ) {
            var my_item = {};
            my_item.data = key;
            my_item.title = key;
            my_columns.push(my_item);
        });
    }
});

ислам jsFiddled код с некоторыми из моихпроизводственные данные, и это работает, но я все еще получаю сообщение об ошибке на моей стороне.Итак, это действительно загадка.

То, что я показываю вам здесь, это именно то, что у меня есть.Так что нет ничего другого, что меняет игру.

Я использую те же jQuery и dataTables, что и в Исламе jsFiddled .Оба установлены и работают, так как я успешно использую dataTables, за исключением этой конкретной попытки получения данных с сервера.Я не использую никакой другой библиотеки.

, когда я "console.log (dataSet)" на моей стороне, вот что я получаю (что, кажется, хорошо):

[
    {
        "Header1" : "tyurtyu",
        "Header2" : "zertzert",
        "Header3" : 123
    },
    {
        "Header1" : "sdfsdfsd" ,
        "Header2" : "dsfgsdfg",
        "Header3" : 456
    }
]

FYI,вот закомментированный вызов dataTables, который я еще не использую, потому что я уже получаю сообщение об ошибке при вызове Ajax.По крайней мере, он покажет, где мой массив dataSet должен использоваться впоследствии.

/*
var dataTable = $('#example').DataTable({
    'bInfo'  : false,
    'paging' : false,
    'scrollX': false,
    'processing':false,
    'sDom'   : 'ltipr',
    'data'   : dataSet,
    "columns": my_columns
});
*/

Если я раскомментирую этот вызов dataTable, я получу еще одно сообщение об ошибке поверх другого:

TypeError: e is not an Object. (evaluating '"length"in e')
TypeError: undefined is not an object (evaluating 'e[i].aDataSort')

Буду признателен за любую помощь.

ОБНОВЛЕНИЕ: Я избавился от первого сообщения об ошибке, изменив способ перехода от «ответа» к «dataSet», например так:

    success: function(response){

        dataSet = JSON.parse(response);
        //instead of "dataSet=response;"

        $.each(dataSet[0], function(key, value) {
            ...
        });
    }

Итак, теперь у меня появляется только второе сообщение об ошибке при попытке передать dataSet в dataTable.

Кажется, что это просто проблема области действия как console.log (dataSet) вне вызова ajax, как показано ниже, ничего не выводится

var my_columns = [];
var dataSet =[];

$.ajax({
    type: "GET",
    url:  "php/ajax/get_table_values.php",
    data: 'value1=1',
    datatype:'json',
    cache: false,
    success: function(response){
        dataSet = JSON.parse(response);
        //instead of "dataSet=response;"

        $.each(dataSet[0], function(key, value) {
            var my_item = {};
            my_item.data = key;
            my_item.title = key;
            my_columns.push(my_item);
        });
    }
});

console.log(dataSet);

var dataTable = $('#example').DataTable({
    'bInfo'  : false,
    'paging' : false,
    'scrollX': false,
    'processing':false,
    'sDom'   : 'ltipr',
    'data'   : dataSet,
    "columns": my_columns
});

ОБНОВЛЕНИЕ: проблема решена, см. мой другой пост ниже.Спасибо всем!

Ответы [ 5 ]

0 голосов
/ 15 февраля 2019

в вашем php-файле сделайте что-то вроде этого:

 if ($_POST["action"] == "SLC" && isset($_POST["categoryId"])) {
         $category= $_POST["categoryId"];
         //do your query here btw use PDO is better
         //fill your data here and then return it
         $result = $command->fetchAll(PDO::FETCH_ASSOC)
         $return["data"] = $result;
         echo json_encode($return,JSON_UNESCAPED_UNICODE);
    }

, затем в вашем javascript вызовите это так:

var tableTypeOfClientInfo = $('#tableTypeOfClientInfo ').DataTable({
                       "destroy": true,
                       "responsive":{
                         "details": {
                         renderer: function ( api, rowIdx, columns ) {
                           var data = $.map( columns, function ( col, i ) {
                             return col.hidden ?
                               '<tr data-dt-row="'+col.rowIndex+'" data-dt-column="'+col.columnIndex+'">'+
                                 '<td>'+col.title+':'+'</td> '+
                                 '<td>'+col.data+'</td>'+
                               '</tr>' :
                               '';
                           } ).join('');

                           return data ?$('<table/>').append( data ) :false;
                         }
                       }
                     },
                       "autoWidth": false,
                             "ajax": {
                                 "url": 'some.php',
                                 "method": 'POST',
                                 data:{action:"SLC", categoryId:id}
                             },
                             "columns": [
                                 {"data": "identification_number"},
                                 {"data": "address"},
                                 {"data": "birthday"},
                                 {"data": "phone"},
                                 {"data": "mail"}
                             ],
                             "language":{"url": "//cdn.datatables.net/plug-ins/1.10.15/i18n/Spanish.json"},
                               "columnDefs": [
                                 {
                                   "className": "dt-center", "targets": "_all"
                                  }
                               ]
                         });
0 голосов
/ 15 февраля 2019

Проблема решена!

Хорошо, в конце концов, я получил ее на работу, с ценной помощью ислама и руководством Shafeeque TP.Все люди, которые опубликовали, очень помогли мне.Спасибо всем.

Во-первых, PHP должен был быть прав:

<?php
    $dataset=array();
    ....
    while($row = mysqli_fetch_assoc($sql)) {
        .....
        $array_tmp = array();
        $array_tmp["Header1"] = $alias;
        $array_tmp["Header2"] = $chambres;
        $array_tmp["Header3"] = $adresse;
        $dataset[] = $array_tmp;
    }
    ....
    echo json_encode($dataset, JSON_UNESCAPED_UNICODE);
?>

Это форматировало массив dataSet, как и должно быть.

Затем данные передавались из ответа.to dataSet в jQuery ajax-вызов должен был быть сделан правильно:

success: function(response){

    dataSet = JSON.parse(response);
    //instead of "dataSet=response;"

    $.each(dataSet[0], function(key, value) {
        ...
    });
}

Теперь первое сообщение об ошибке исчезло.

А затем мне пришлось получить доступ к массивам dataSet и my_columns вне вызова Ajax:

var my_columns = [];
var dataSet =[];

$.ajax({
    ...
    async: false,
    ...
    success: function(response){
        ...
    }
}); 

А теперь все работает.Два рабочих jsfiddle в исходном вопросе не помогли точно, потому что они не содержали массив для преобразования, и это было проблемой.К счастью, в конце концов я туда попал.

Спасибо всем за руководство.Очень ценится!

0 голосов
/ 15 февраля 2019

Вам не нужно создавать строку, а массив в правильном формате:

$dataset=array();
...
while($row = mysqli_fetch_assoc($sql)) {
    ....
    $array_tmp = array();
    $array_tmp["Header1"] = $string_val1;
    $array_tmp["Header2"] = $string_val1;
    $array_tmp["Header3"] = $numval3;

    $dataset[] = $array_tmp;
}
0 голосов
/ 15 февраля 2019
<?php

 $dataset='';
 ...
while($row = mysqli_fetch_assoc($sql)) {
 ....
  $dataset[]=array(
     "Header1" : $string_val1,
     "Header2" : $string_val1,
     "Header3" : $string_val1
  );
}
...

echo json_encode($dataset);

использовать $ dataset в качестве массива и просто повторить кодированный в json массив, чтобы получить объект json в сценарии

0 голосов
/ 15 февраля 2019

Вы используете $.each для этого нужен объект.Попробуйте в вашем php изменить файл $dataset = json_encode($dataset);

И я думаю, что набор данных $ должен быть массивом

И это

 $dataset=json_encode($dataset, Json_force_object); 

И попробуйте код из ислама, я думаю, что этоправильный код, введите

<?php

 $dataset=array();
 ...
while($row = mysqli_fetch_assoc($sql)) {
 ....
  $dataset[]=array(
     "Header1" : $string_val1,
     "Header2" : $string_val1,
     "Header3" : $string_val1
  );
}

... здесь

...