SQL-запрос в цикле While не работает с использованием PHP и JS

#javascript #php #mysql #sql

#javascript #php #mysql #sql

Вопрос:

То, что я пытаюсь сделать, просто. У меня есть таблица базы данных MySQL для продаж мороженого под названием «ice_cream_sales». Столбцы, которые у меня есть для таблицы, — это «Вкус» мороженого и временная метка «DateTime». Я хочу отобразить количество продаж мороженого на вкус за каждый год. Итак, у меня есть цикл while, который выполняет SQL-запрос, который извлекает количество строк за каждый год, затем, в зависимости от вкуса мороженого для полученных строк, он добавляет его в соответствующую переменную PHP для этого вкуса мороженого, чтобы подсчитать продажи этого мороженого в текущем году. Затем я хочу использовать линейную диаграмму Google, которая использует массив JS для отображения продаж мороженого за год. Перейдите по этой ссылке, чтобы увидеть, как это работает:https://google-developers.appspot.com/chart/interactive/docs/gallery/linechart.

Однако сейчас я просто хочу убедиться, что я могу успешно перенести переменные PHP в переменные JS, а затем добавить эти переменные в массив JS. Поэтому я переношу переменные PHP в переменные JS с помощью операторов echo, поскольку PHP-код встроен в тег JS script. Затем я создаю массив, используя эти значения счетчиков для каждого ароматизированного мороженого за год, которые будут добавлены к массиву, используемому для линейной диаграммы Google. Когда я пытаюсь выполнить код, я получаю пустую страницу без сообщений об ошибках. Любые предложения и исправления будут высоко оценены.

Когда я комментирую блок кода оператора if в операторе while, чтобы проверить вкус мороженого, код работает хорошо, и я получаю выходной массив [2010, 0, 0, 0], [2011, 0, 0, 0] и так далее.

   <script>
      var toAdd = new Array();
      <?php

      $year = intval(2010);

      while ($year <= 2019) {
        include 'includes/dbh_cred.php';
        $sql = "SELECT * FROM ice_cream_sales WHERE myDate LIKE '$year%'";
        $chocolate = intval(0);
        $vanilla = intval(0);
        $strawberry = intval(0);
        $result = mysqli_query($connect, $sql);
       if (mysqli_rows($result) > 0) {
          while ($row = mysqli_fetch_assoc($result)) {
            if ($row['Flavor'] == 'Chocolate')
              $chocolate = $chocolate   1;
            else if ($row['Flavor'] == 'Vanilla')
                $vanilla = $vanilla   1;
            else  if ($row['Flavor'] == 'Strawberry')
                $strawberry = $strawberry   1; 
              }
            }
          //chocolate, vanilla, strawberry sales for that particular year
              echo "var chocolate = " . $chocolate . ";";
              echo "var vanilla = " . $vanilla . ";";
              echo "var strawberry = " . $strawberry . ";";
              echo "var year = " . $year . ";";
              //add these values to an array
              echo "toAdd.push([year, chocolate, vanilla, strawberry]);";
              $year = $year  1;
          }

           ?>



        var data = new Array(["Year", "Chocolate", "Vanilla", "Strawberry"]);
        console.log(data[0][0]   "t"   data[0][1]   "t"   data[0][2]   "t" 
                       data[0][3]);
        data.push(toAdd);
          for(var i = 1; i < data.length; i  ) {
            for(var j = 0; j < data[i].length; j  ) {
        console.log(data[i][j]);
  

Комментарии:

1. Почему бы вам просто не вывести весь массив непосредственно в свой JavaScript?

2. Просто получите итоговые значения в вашем запросе, тогда не будет необходимости в цикле.

Ответ №1:

Это могло бы быть намного проще.

 <?php
include 'includes/dbh_cred.php';
$sql = "SELECT
  YEAR(myDate) AS year,
  SUM(IF(Flavor = 'chocolate', 1, 0)) AS chocolate,
  SUM(IF(Flavor = 'strawberry', 1, 0)) AS strawberry,
  SUM(IF(Flavor = 'vanilla', 1, 0)) AS vanilla
FROM ice_cream_sales
GROUP BY YEAR(myDate)";
$result = $connect->query($sql);
if ($result->num_rows) {
    while ($row = mysqli_fetch_assoc($result)) {
        $data[] = $row;
    }
}
?>
<script>
var data = <?php echo json_encode($data);?>;
</script>
  

Вот демонстрация SQL:http://sqlfiddle.com /#!9/f7ca1b/3/0. В основном он поддерживает счетчик для каждого варианта, а затем группирует его по годам, поэтому все ваши данные компилируются как часть запроса к базе данных. Затем все, что вам нужно сделать в PHP, это поместить записи в массив и вывести их в формате JSON.

Я бы рекомендовал использовать PDO для доступа к базе данных, так как это намного проще в освоении и сделало бы этот код еще более кратким.

Ответ №2:

Попробуйте следовать SQL, может быть, это будет легко для вас?

выберите вкус, count(*) из ice_cream_sales, ГДЕ myDate, КАК ‘$ year%’, группируется по вкусу