php и mysql отображают ежедневный доход между date_begin и date_end - PullRequest
0 голосов
/ 21 июня 2019

У меня есть таблица, которая выглядит примерно так:

$table_name = 'transactions';

+---------------------+--------+
| date                | amount |
+---------------------+--------+
| 2019-05-01 03:11:34 | 5      |
| 2019-05-01 04:26:26 | 10     |
| 2019-05-01 07:27:34 | 10     |
| 2019-05-01 19:22:47 | 20     |
| 2019-05-02 00:42:10 | 5      |
| 2019-05-02 04:27:31 | 10     |
| 2019-05-02 05:14:03 | 5      |
| 2019-05-02 08:39:24 | 5      |
| 2019-05-03 12:45:29 | 15     |
| 2019-05-03 12:48:23 | 15     |
| 2019-05-03 13:50:14 | 5      |
| 2019-05-03 16:58:08 | 20     |
| 2019-05-04 01:27:28 | 10     |
| 2019-05-04 11:53:15 | 20     |
| 2019-05-04 15:48:51 | 5      |
| 2019-05-04 15:59:48 | 5      |
| 2019-05-05 01:55:40 | 10     |
| 2019-05-05 05:32:53 | 15     |
| 2019-05-05 11:56:56 | 15     |
| 2019-05-05 12:09:26 | 10     |
+---------------------+--------+

Для этого примера в таблице ровно 4 записи в день. Но реальная таблица может иметь больше или меньше в день, конечно.

Мне нужен список всех дней между определенным промежутком времени и суммой суммы, то есть дохода на каждый день.

Пример:

Введите:

$date_begin = '2019-05-02 00:00:00';
$date_end = '2019-05-04 23:59:59';

Для этих параметров скрипт должен вывести следующее:

2019-05-02
25

2019-05-03
55

2019-05-04
40

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

Итак, это будет выглядеть так:

2019-05-02
Thursday
25

2019-05-03
Friday
55

2019-05-04
Saturday
40

Я действительно сначала попытался решить это для себя и искал примеры. Но каждый найденный мной был либо более сложным, чем мне нужно, либо слишком разным, чтобы я мог принять его должным образом.

Спасибо

EDIT:

Я попробовал одно из предложений в ответах. Но все, что я получаю, это пустая страница. Может кто-нибудь сказать мне, где я не прав?

<?php

$conn = mysqli_connect($dbserver, $dbuser, $dbpw, $dbname) or die("Connection failed: " . mysqli_connect_error());
$conn->query("SET NAMES 'utf8'");
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }  

$table_name = 'transactions';

$date_begin = '2019-05-02 00:00:00';
$date_end = '2019-05-05 23:59:59';

$sql = "SELECT DATE(`date`), SUM(`amount`) FROM $table_name WHERE `date` BETWEEN '$date_begin' AND '$date_end' GROUP BY DATE(`date`) ORDER BY `date`";

$rs_result = mysqli_query($conn, $sql);

?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Income daily</title>
<meta name="robots" content="noindex, nofollow">
</head>

<body>

<?php

while ($row = mysqli_fetch_assoc($rs_result)) {

echo '
'.$row['date'].'

<br>

'.$row['amount'].'

<br><br>

';

}

?>


</body>
</html>

Пожалуйста, пока не беспокойтесь о безопасности. Я позабочусь об этом потом.

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Сначала запустите следующий код в SQL: Проблемой была ваша дата начала и окончания.Вы назначаете месяц 06, но БД содержит даты с месяцем 05.

set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Теперь поместите этот код в ваш файл:

<?php
    $conn = mysqli_connect($dbserver, $dbuser, $dbpw, $dbname) or die("Connection failed: " . mysqli_connect_error());
    $conn->query("SET NAMES 'utf8'");
        if (mysqli_connect_errno()) {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }  

    $table_name = 'transactions';

    $date_begin = '2019-05-01 00:00:00';
    $date_end = '2019-05-02 23:59:59';

    $sql = "SELECT DATE(`date`) as date, SUM(`amount`) as amount FROM transaction WHERE (date > '$date_begin' AND date < '$date_end') GROUP BY `date`; ";


    $rs_result = mysqli_query($conn, $sql);

    ?>

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Income daily</title>
    <meta name="robots" content="noindex, nofollow">
    </head>

    <body>

    <?php

    while ($row = mysqli_fetch_assoc($rs_result)) {

    echo ''.$row['date']."<br>".date("l", strtotime($row['date'])).'<br>'.$row['amount'].'<br><br>';

    }

    ?>


    </body>
    </html>
0 голосов
/ 21 июня 2019

Запрос выглядит примерно так, как вы бы описали, что вы хотите.Вы не показали никакого кода или не указали MySQL API, поэтому посмотрите здесь безопасные способы запроса Как я могу предотвратить внедрение SQL в PHP? :

SELECT DATE(`date`), SUM(`amount`) FROM $table_name
    WHERE `date` BETWEEN '$date_begin' AND '$date_end'
    GROUP BY DATE(`date`) ORDER BY `date`

Затем при извлечении строк идля вывода просто используйте date('l'), чтобы получить текстовое представление дня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...