Данные из JQUERY/AJAX в Morris.JS

Я пытаюсь экспортировать данные из AJAX/JQUERY в Morris.JS.

Переменная диаграмма данных возвращается с данными. но график morris.js не возвращает строку/полосу

            $("#diseaseselection").change(function(){
                $("#chart").empty();
                var diseaseselection = $("#diseaseselection").val();
                $.ajax({
                    url: "chart.php",
                    method: "POST",                   
                    data: {
                        diseaseselection: diseaseselection
                    },
                    success: function(data) {
                        Morris.Line({
                            element : 'chart',
                            data:[data],
                            xkey:'age',
                            ykeys:[ 'totalM', 'totalF'],
                            labels:['Total MALE', 'Total FEMALE'],
                            hideHover:'auto',
                            pointStrokeColors: ['white'],
                            lineWidth:'6px',
                            parseTime: false,
                            lineColors: ['Skyblue', 'Pink'],
                        });
                    }

                });
            });

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

$diseaseselection = $_REQUEST['diseaseselection'];

if (isset($diseaseselection)){ 
   $result = mysqli_query($con, "SELECT disease,age,SUM(CASE WHEN gender = 'm' THEN 1 ELSE 0 END) AS totalM, SUM(CASE WHEN gender = 'f' THEN 1 ELSE 0 END) AS totalF FROM mdr where disease = '$diseaseselection' GROUP BY disease , age"); 
   $chart_data = ''; 

while($row = mysqli_fetch_array($result)) { 
      $chart_data .= "{ age:'".$row["age"]."', totalM:".$row["totalM"].", totalF:".$row["totalF"]."}, "; 
} 
$chart_data = substr($chart_data, 0, -2); 
echo $chart_data; }

Вот мой образец вывода Это основано на моем журнале консоли console.info(data); Пожалуйста, помогите мне, как понять это, мне это очень нужно, спасибо, чувак. уже стараюсь изо всех сил

{ age:'0-1', totalM:2, totalF:1},

{ age:'1-4', totalM:1, totalF:0},

{ age:'10-14', totalM:0, totalF:1},

{ age:'15-19', totalM:0, totalF:1},

{ age:'5-9', totalM:0, totalF:3},

{ age:'55-59', totalM:6, totalF:0}

Вы, кажется, забыли закончить свое последнее предложение. В любом случае... как выглядит содержание datachart? Вы пробовали просто data: datachart (т.е. без переноса диаграммы данных в другой массив - я не знаю, но кажется, что это, вероятно, не нужно)?

ADyson 16.04.2019 00:27

я уже пробовал эти данные: [данные], не объявляя их в другой переменной, но все равно нет строки

user11308569 16.04.2019 00:30

{возраст:'0-1', всегоM:2, всегоF:1}, {возраст:'1-4', всегоM:1, всегоF:0}, {возраст:'10-14', всегоM:0, всегоF :1}, {возраст:'15-19', всегоM:0, всегоF:1}, {возраст:'5-9', всегоM:0, всегоF:3}, {возраст:'55-59', всегоM :6, totalF:0} вот пример выходных данных

user11308569 16.04.2019 00:32

Можете ли вы показать PHP, который его производит, пожалуйста?

ADyson 16.04.2019 01:00

Я спрашиваю, потому что ваш вывод недействителен JSON... это серия объектов, для которых нужна скобка массива вокруг них, чтобы они были действительными. А также, я думаю, вам нужно разобрать данные JSON (это просто текст, помните) в переменную Javascript, когда они поступают с сервера. Я думаю, что сейчас вы передаете MorrisJS массив, содержащий одну строку, а не список объектов. Но вы не сможете успешно проанализировать его, пока то, что вы предоставите с сервера, не будет действительно действительным JSON. Так что, если вы покажете мне свой код сервера, я надеюсь, что смогу исправить это для вас.

ADyson 16.04.2019 09:37

Пожалуйста, используйте функцию редактирования, чтобы добавить как код, так и образец данных в сам вопрос, а затем отформатируйте его соответствующим образом. Комментарии не место для кода - его трудно читать, и в любом случае он должен быть неотъемлемой частью самого вопроса. Спасибо

ADyson 16.04.2019 13:58

пожалуйста помоги. ниже мой пример кода

user11308569 16.04.2019 14:26

Нет, пожалуйста, добавьте это к самому вопросу. Вы разместили это как ответ, как если бы это было решением. Нажмите кнопку «Изменить» прямо под синими тегами «jQuery» и добавьте информацию к вопросу. Спасибо

ADyson 16.04.2019 14:32

И, пожалуйста, добавьте образцы данных в дополнение к коду PHP.

ADyson 16.04.2019 14:32

Спасибо, чувак, я уже отредактировал это выше

user11308569 16.04.2019 14:40

Спасибо. Сейчас работаю, скоро посмотрю

ADyson 16.04.2019 14:59

Спасибо за поддержку, чувак. надеюсь ты разберешься

user11308569 16.04.2019 15:21
Поведение ключевого слова "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) для оценки ваших знаний,...
2
12
2 750
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Здесь есть ряд небольших проблем, которые связаны с одной и той же ключевой проблемой - то, что ваш PHP создает, не является допустимыми данными JSON.

Если вы скопируете и вставите свои образцы данных в валидатор, такой как JSONLint, вы обнаружите, что он не работает по нескольким причинам:

1) У вас есть список объектов, но чтобы он был действительным списком (или множество, как его обычно называют), элементы должны быть заключены в квадратные скобки ([ и ]) в начале и в конце.

2) Имена свойств (например, age, totalM и totalF) должны быть заключены в двойные кавычки (").

3) Строковые значения (например, 0-1, 1-4 и т. д.) должны быть заключены в кавычки двойной, а не в одинарные кавычки.

Действительная версия вашего примера JSON будет выглядеть так:

[
  { "age": "0-1", "totalM": 2, "totalF": 1 }, 
  { "age": "1-4", "totalM": 1, "totalF": 0 }, 
  { "age": "10-14", "totalM": 0, "totalF": 1 }, 
  { "age": "15-19", "totalM": 0, "totalF": 1 }, 
  { "age": "5-9", "totalM": 0, "totalF": 3 }, 
  { "age": "55-59", "totalM": 6, "totalF": 0 }
]

Вы можете найти этот учебник полезным для быстрого изучения синтаксиса.

Однако, как ни полезно знать синтаксис, на самом деле вам не нужно создавать его вручную с помощью вашего PHP, как вы делаете сейчас. На самом деле это довольно плохая идея, потому что это оставляет вас уязвимыми для глупых ошибок (например, не добавление квадратных скобок) и риску случайных синтаксических ошибок в JSON (например, представьте, что одно из ваших строковых значений само содержит двойной -кавычка: если вы не использовали перед ним подходящий escape-символ, то в JSON это будет выглядеть как конец свойства, а то, что следует за ним, будет недействительным).

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

Гораздо лучше просто создать обычный массив в PHP, а затем использовать встроенную функцию json_encode(), чтобы позаботиться о преобразовании этого объекта в действительный JSON. Обычно это считается лучшей практикой, и если вы будете следовать любому вводному руководству по PHP/JSON, оно покажет вам эту функцию.

Чтобы добавить к проблемам с созданием JSON на стороне сервера, есть проблема и на стороне клиента: даже если вы сделал возвращаете действительный JSON, в этот момент это все еще строка - для того, чтобы ее можно было использовать в вашей диаграмме, у вас будет чтобы разобрать его в переменную JavaScript. Если вы укажете dataType: "json" в параметрах $.ajax, jQuery автоматически выполнит синтаксический анализ за вас. В противном случае вы бы сделали вызов JSON.parse(), чтобы сделать это.

Надеюсь, теперь вы видите общий шаблон — вы берете переменную PHP и превращаете ее в JSON, который является текстовым представлением данных. Это позволяет отправить его через Интернет. Затем, когда он достигает места назначения, вы снова превращаете его в переменную (JavaScript) для использования в коде.

Вот пример PHP, который будет генерировать действительный JSON рекомендуемым способом. Я добавил комментарии к важным строкам:

$diseaseselection = $_REQUEST['diseaseselection'];

if (isset($diseaseselection)){ 
   $result = mysqli_query($con, "SELECT disease,age,SUM(CASE WHEN gender = 'm' THEN 1 ELSE 0 END) AS totalM, SUM(CASE WHEN gender = 'f' THEN 1 ELSE 0 END) AS totalF FROM mdr where disease = '$diseaseselection' GROUP BY disease , age"); 
   $chart_data = array(); //declare an array, not a string. This will become the outer array of the JSON.

  while($row = mysqli_fetch_array($result)) { 
      //add a new item to the array
      //each new item is an associative array with key-value pairs - this will become an object in the JSON
      $chart_data [] = array(
        "age" => $row["age"], 
        "totalM" => $row["totalM"], 
        "totalF" => $row["totalF"]
      ); 
  } 

  $json = json_encode($chart_data);  //encode the array into a valid JSON object
  echo $json; //output the JSON
}

И вот соответствующая часть кода JavaScript для его получения

$.ajax({
  url: "chart.php",
  method: "POST",
  data: {
    diseaseselection: diseaseselection
  },
  dataType: "json", //parse the response data as JSON automatically
  success: function(data) {
    Morris.Line({
      element: 'chart',
      data: data, //supply the response data (which is now a JS variable) directly, no extra brackets
      xkey: 'age',
      ykeys: ['totalM', 'totalF'],
      labels: ['Total MALE', 'Total FEMALE'],
      hideHover: 'auto',
      pointStrokeColors: ['white'],
      lineWidth: '6px',
      parseTime: false,
      lineColors: ['Skyblue', 'Pink'],
    });
  }
});

Вот рабочая демонстрация только части AJAX и диаграммы (с использованием фиктивного сервера для предоставления JSON): https://jsfiddle.net/7o9ptajr/1/

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