0

Нужна помощь. Эта задача вроде бы не сложная, хотелось бы разобраться))

Вот есть у меня форма, которая генерирует таблицу данных.

На данном этапе интересуют поля "Код" и "Сума".

Код своего рода классификатор товара, и нужно отслеживать, что-бы по данному коду сума товаров не была выше какого-то значения.

Классификатор 4-значный, под одним кодом могут быть разные товары.

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

введите сюда описание изображения

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>DK</title>
    <?php 
        require_once "function.php";
        $row = getLine(100);
     ?>
</head>
<body>
    <form method="POST" action="">
        <input name = "title" type="text" placeholder="Название">
        <input name = "kod" type="text" placeholder="Код ДК">
        <input name = "date" type="text" placeholder="Дата">
        <input name = "price" type="text" placeholder="Сума">
        <button type="submit" name="send">Send</button>
    </form>

    <?php 
        addLine();
     ?>
<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Название</th>
            <th>Дата</th>
            <th>Код</th>
            <th>Стоимость</th>
        </tr>
    </thead>
    <tbody>

    </tbody>
    <?php 
        for ($i = 0 ; $i < count($row); $i++) {
            echo "<tr><td>" . $row[$i]["id"]
        . "</td><td>" . $row[$i]["title"] 
        . "</td><td>" . $row[$i]["date"]
        . "</td><td>" . $row[$i]["kod"]
        . "</td><td>" . $row[$i]["price"]
        . "</td></tr>"; 
    } 
    echo "</tbody>";

     ?> 
</table>
</body>
</html>

Подключение к БД:

<?php
  $mysqli = false;

  $name = $_POST['title'];
  $kod = $_POST['kod'];
  $price = $_POST['price'];
  $date = $_POST['date'];



  function connectDB () {
    global $mysqli;
    $db_host = "localhost"; 
    $db_user = "root"; // Логин БД
    $db_password = ""; // Пароль БД
    $db_base = 'dk'; // Имя БД
    $db_table = "lines_dk"; // Имя Таблицы БД

    $mysqli = new mysqli($db_host, $db_user, $db_password, $db_base);

    if ($mysqli->connect_error) {
        die('Ошибка : ('. $mysqli->connect_errno .') '. $mysqli->connect_error);
    }

    $mysqli -> query("SET  NAMES 'utf-8'");
  }

  function closeDB () {
    global $mysqli;
    $mysqli -> close ();
  }
?>  

Функции

<?php 
    require_once "connect.php";

    function getLine ($limit) {
        global $mysqli;
        connectDB();
        $result = $mysqli -> query("SELECT * FROM `lines_dk` ORDER BY `id` DESC LIMIT $limit"); 
        closeDB();

        return resultToArray($result);
    }
    function resultToArray ($result) {
        $array = array ();
        while (($row = $result -> fetch_assoc()) != false)
            $array[] = $row;
        return $array;   
    }
    function addLine () {
        global $mysqli;
        connectDB();
        if (isset($_POST['send'])) {
            $result = $mysqli -> query(
                "INSERT INTO `lines_dk` 
                SET 
                    `title` = '".$_POST['title']."',
                    `date` = '".$_POST['date']."',
                    `price` = '".$_POST['price']."',
                    `kod` = '".$_POST['kod']."'
                "); 
        }
        print_r($_POST);
        closeDB();
    }
 ?>
  • а в чём вопрос? – n.osennij May 18 '20 at 14:10
  • @n.osennij вопрос в том, как реализовать?) Данные с базы достану, а как их отфильтровать не могу понять – Даша Новикова May 18 '20 at 14:39
  • 2
    То что вы описали текстом больше похоже на группировку и суммирование, а не на фильтрацию. Фильтрация предполагает что в результате участвует только часть. И в любом случае надо из БД доставать данные уже в том виде, который требуется. Если надо фильтровать - значит запрос должен выбрать уже отфильтрованное, если группировать и суммировать - то то же SQL-запрос должен все собрать и выдать только итоги. Если я правильно понял, что вы хотите - то буквально select kod, sum(price) from lines_dk group by kod – Mike May 18 '20 at 15:47
  • P.S. А зачем нужна resultToArray ? У mysqli есть готовая функция https://www.php.net/manual/ru/mysqli-result.fetch-all.php – Mike May 18 '20 at 15:50
  • 1
    Кроме того ваш код позволит злоумышленнику легко взломать ваш сервер, так как подставляет текст принятых полей прямо в запрос, а следовательно возможна SQL-инъекция. Используйте подготовленные выражения https://www.php.net/manual/ru/mysqli-stmt.bind-param.php (см. примеры внизу) – Mike May 18 '20 at 15:52
  • @Anastasia да, и так же по всем остальным кодам – Даша Новикова May 18 '20 at 17:31
  • @Mike я туповата)) а как теперь это вывести?) – Даша Новикова May 18 '20 at 17:46
  • Так же как вы выводите сейчас список записей из таблицы – Mike May 18 '20 at 18:01
  • @Mike kod получилось, а вот сумму нет( – Даша Новикова May 18 '20 at 18:05
  • 2
    а, ну это потому что у нее нормального названия нет. select kod, sum(price) as price from lines_dk group by kod – Mike May 18 '20 at 18:14
  • @Mike спасибо Вам! Можете написать в ответ? – Даша Новикова May 19 '20 at 12:42
  • Возможный дубликат вопроса: SUM SQL запрос, как правильно? – Mike May 19 '20 at 16:59

0 Answers0