За последние 24 часа нас посетили 64113 программистов и 3096 роботов. Сейчас ищут 1053 программиста ...

Не работает сумма данных столбца

Тема в разделе "PHP для новичков", создана пользователем кунжут, 12 фев 2022.

Метки:
  1. кунжут

    кунжут Новичок

    С нами с:
    1 фев 2022
    Сообщения:
    6
    Симпатии:
    0
    По задумке есть три тарифа услуг. В карточке каждого - название, стоимость и список услуг из бд.
    Для "Базового" создала отдельную таблицу, чтобы понять проблему. Таблица состоит из `id`(int), `name`(text) и `price`(int). Я хочу в заголовок стоимости вывести сумму услуг из этой таблицы.

    Как я понимаю, нужно SUM(price) написать в запросе. Уже перепробовала разные варианты, но он не считает, выдает ошибку "Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, bool given in" на строчке "$row = mysqli_fetch_array($result);". Но ведь дальше то же самое работает.

    Объясните, пожалуйста, что не так? Если можно другим способом посчитать сумму, то как?


    PHP:
    1. <div class="price-item">
    2.         <a href="#">
    3.           <div class="price-item-title"><h1>Базовый</h1></div>
    4.             <div class="price-item-title"><h4>
    5.             <?php
    6.             $sql = 'SELECT  `id`, SUM(price) FROM bazoviy';
    7.             $result = mysqli_query($link, $sql);
    8.             $row = mysqli_fetch_array($result);
    9.             $sum = $row;
    10.             echo $sum;
    11.             ?>
    12.             рублей</h4>
    13.           </div>
    14.               <div class="price-item-text-block">
    15.                 <div class="price-item-text">
    16.                   <ul>
    17.                   <?php
    18.                   $sql = 'SELECT  `id`, `name`, `price`  FROM bazoviy';
    19.                   $result = mysqli_query($link, $sql);
    20.                   while ($row = mysqli_fetch_array($result))    //всё выводит без проблем
    21.                   {
    22.                   echo "<li>" . $row['name'] . "</li>";
    23.                   }
    24.                   ?>
    25.                   </ul>
    26.                 </div>
    27.             </div>
    28.         </a>
    29.       </div>
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.496
    Симпатии:
    1.725
    Запрос неправильный. С одной стороны - поле айди, а с другой стороны групповая операция. При этом group by отсутствует, так нельзя
     
  3. кунжут

    кунжут Новичок

    С нами с:
    1 фев 2022
    Сообщения:
    6
    Симпатии:
    0
    Исправила. Выводит "Array рублей", сумму не выводит
     
  4. кунжут

    кунжут Новичок

    С нами с:
    1 фев 2022
    Сообщения:
    6
    Симпатии:
    0
    Сделала по-другому:

    PHP:
    1. $sql = 'SELECT  `id`, SUM(price) FROM bazoviy GROUP BY `id`';
    2.             $result = mysqli_query($link, $sql);
    3.             $row = mysqli_fetch_row($result);
    4.             $sum = $row;
    5.             // echo $sum;
    6.             if(empty($row['sum']))
    7.    echo 'Суммы нет';
    8. else {
    9.     echo 'В продаже на сумму <strong>', $row['price'],'</strong><br />';
    10. }
    Выводит "Суммы нет". Понятно, что пусто. Непонятно, почему
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.496
    Симпатии:
    1.725
    Ну ты добавила group by - а зачем? Что вообще в таблице с непонятным названием bazoviy хранится, и зачем что-то суммируется?
    В принципе есть понимание, зачем группируют данные? Вот яркий пример, когда это НАДО делать: например, мы делаем что-то вроде инсты. Одни пользователи накидывают картинки (это у нас images), другие пользователи их лайкают (это у нас таблица, к примеру, likes с полями user_id, image_id). И вот теперь мы хотим посчитать, сколько лайков у какой картинки. Тогда действительно
    Код (Text):
    1. select image_id, count(1) as likes_count from images group by image_id
    Или наоборот, хотим посчитать, сколько какой юзер поставил лайков.
    Код (Text):
    1. select user_id, count(1) as likes_count from images group by user_id
    А в твоём случае, ты зачем группируешь? Как я постоянно говорю молодым программистам, которые к нам приходят в конторку, любой код должен сначала пройти через сознание. Когда я в коде подчинённого вижу тонну бреда, я ему никогда не говорю: "ты написал тонну бреда". Я его прошу объяснить мне смысл, почему оно написано так или иначе. И все знают, что не ответить мне при этом - это нарваться на неприятности.
     
    сельский житель нравится это.
  6. кунжут

    кунжут Новичок

    С нами с:
    1 фев 2022
    Сообщения:
    6
    Симпатии:
    0
    Я поняла, что не поняла, как работать с SUM ни на примере документации, ни на примерах чьих-то кодов. Так что сделала циклом 0+значение

    PHP:
    1. $sql = 'SELECT * FROM bazoviy';
    2. $query_run = mysqli_query($link, $sql);
    3.  
    4. $sum= 0;
    5. while ($num = mysqli_fetch_assoc ($query_run)) {
    6.     $sum += $num['price'];
    7. }
    8. echo $sum;
    Теперь работает
     
  7. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.509
    Симпатии:
    283
    Код (Text):
    1. SELECT SUM(`price`) FROM `bazoviy`
    Посчитает всю колонку. Выдаст одну строку.
    Если сгруппируете по чем-то, то посчитает по отдельности для всего, что сгруппируете.
    То есть в выдаче будет более, чем одна строка.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.496
    Симпатии:
    1.725
    Смотри, есть всякие системы, которые позволяют выполнять запросы прямо в БД, а не из php-кода. Ну нам близка phpmyadmin, потому что она на пыхе написана. Есть ещё подобные штуки в IDE, есть HeidiSQL, adminer и т.п.

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