DataTable с данными JSON из URL-адреса

У меня есть массив, который я генерирую из URL-адреса.

$url = 'https://www.datastro.eu/api/explore/v2.1/catalog/datasets/orbits-for-current-comets-in-the-mpc-database/records?order_by=h%20ASC' ;
$data = file_get_contents($url);
$comets = json_decode($data, true);
if ($comets === null) {
    die("Error decoding JSON data.");
}
//echo '<pre>'; print_r($comets); echo '</pre>';

Я заполнил таблицу:

<table class = "table table-dark table-striped display" id = "myTable">
<thead>
    <tr>
      <th scope = "col">designation_and_name</th>
      <th scope = "col">orbit_type</th>
      ...
    </tr>
  </thead>
  <tbody>
  <?php for ($i=0; $i<=$comete['total_count']; $i++) { ?>
    <tr>
      <th scope = "row"><?php echo($comete['results'][$i]['designation_and_name']); ?></th>
      <td><?php echo($comete['results'][$i]['orbit_type']); ?></td>
      ...
    </tr>
    <?php } ?>
  </tbody>
</table>

Пока все хорошо, но когда я вставляю скрипт DataTable, таблица становится пустой.

<script>
  new DataTable('#myTable');
</script>

Пожалуйста, помогите мне! Я хочу применить табуляцию к таблицам, которыми в противном случае было бы невозможно управлять.

Кажется, существует несоответствие в именах переменных между PHP и JavaScript. Обязательно используйте одно и то же имя переменной при декодировании данных JSON в PHP и инициализации DataTable в JavaScript.

Tec J 11.04.2024 18:01

Попробуйте следующее: [PHP code goes here] <table class = "table table-dark table-striped display" id = "myTable"> <!-- Table header goes here --> <tbody> <?php for ($i = 0; $i < count($comets['results']); $i++) { ?> <tr> <th scope = "row"><?php echo $comets['results'][$i]['designation_and_name']; ?></th> <td><?php echo $comets['results'][$i]['orbit_type']; ?></td> </tr> <?php } ?> </tbody> </table> <script> $(document).ready(function() { $('#myTable').DataTable(); }); </script>

Tec J 11.04.2024 18:01

Спасибо за ответ. На самом деле названия массивов не совпадали, но в моем коде они были правильными. Я просто неправильно написал в вопросе. Если я использую этот URL: datastro.eu/api/explore/v2.1/catalog/datasets/… с где, таблица данных о порядке и ограничении в порядке, но если я удалю ?where=h%3C%3D6&order_by=h %20ASC&limit=100 таблица пуста.

Stefano Forcina 11.04.2024 19:00
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

API возвращает только 10 записей из общего числа, и поскольку вы используете цикл for на основе значения total_count, когда индекс ссылается на строку вне диапазона, возвращается нулевое значение (генерируя подавленное предупреждение PHP), и соответствующее эхо создает пустое значение, поэтому в вашей таблице есть несколько пустых строк. Поскольку dataTables по умолчанию сортируется по возрастанию первой строки, вы получаете все пустые строки вверху: таблица не очищается, вы видите первые пустые строки.

Вот некоторые изменения кода, чтобы убедиться в этом:

<?php
$url = 'https://www.datastro.eu/api/explore/v2.1/catalog/datasets/orbits-for-current-comets-in-the-mpc-database/records?order_by=h%20ASC' ;
$data = file_get_contents($url);
$comets = json_decode($data, true);
if ($comets === null) {
    die("Error decoding JSON data.");
}

//--- Prints the total rows counter and the total rows really received

echo '<br>', 'Total rows:', $comets['total_count'], '<br>', 'Total received:', count($comets['results']), '<br><br>';

?>
<!DOCTYPE html>
<html>
<head>
    <link href = "https://cdn.datatables.net/2.0.3/css/dataTables.dataTables.css" rel = "stylesheet">
</head>

<body>

<table class = "table table-dark table-striped display" id = "myTable">

    <thead>
    <tr>
        <th scope = "col">designation_and_name</th>

        <th scope = "col">orbit_type</th>
        <th scope = "col">node</th>
        <th scope = "col">e</th>
        <th scope = "col">h</th>
        <th scope = "col">g</th>
    </tr>
    </thead>

    <tbody>

    <!-- Using foreach we traverse the real rows received (here in the alternative syntax for greater readability) -->

    <?php foreach ($comets['results'] as $row):?>

        <tr>

            <!-- php echo in shorthand format -->
            <th scope = "row"><?= $row['designation_and_name'] ?></th>

            <td><?= $row['orbit_type'] ?></td>
            <td><?= $row['node'] ?></td>
            <td><?= $row['e'] ?></td>
            <td><?= $row['h'] ?></td>
            <td><?= $row['g'] ?></td>
        </tr>

    <?php endforeach; ?>

    </tbody>

</table>

<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src = "https://cdn.datatables.net/2.0.3/js/dataTables.min.js"></script>

<script>

    document.addEventListener('DOMContentLoaded', () => {
        let dt = new DataTable('#myTable');

        // prints in the browser's console the default order set by DataTables
        console.info (dt.order());
    });

</script>

</body>

</html>

Я предполагаю, что API нужна авторизация для получения всех строк (проверьте здесь)

Редактировать

Читая документацию, я вижу, что вы можете использовать эту конечную точку для получения полных данных, формат немного другой, поэтому вы можете применить эти изменения к коду:

  • $url
$url = 'https://www.datastro.eu/api/explore/v2.1/catalog/datasets/orbits-for-current-comets-in-the-mpc-database/exports/json';
  • удалить распечатку общей записи

  • foreach() становится:

 <?php foreach ($comets as $row): ?>

Спасибо! В нем все правильно. API возвращает только 10 записей, если я не указываю ограничение в запросе и по факту они были в конце таблицы. Я считаю, что услуга по получению их всех платная. Однако я заметил, что если я введу в запрос ограничение 100, он вернет 100 записей + все остальные пустые строки, если я введу более 100, это выдаст мне ошибку чтения файла json. Я попробую использовать foreach, чтобы не отображать пустые строки. Вы были поучительны, спасибо!

Stefano Forcina 11.04.2024 20:07

Я отредактировал ответ, добавив дополнительную информацию

TUPKAP 11.04.2024 20:12

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

Stefano Forcina 11.04.2024 20:32

Другие вопросы по теме