PHP和mysql显示介于date_begin和date_end之间的每日收入

时间:2019-06-21 15:48:05

标签: php mysql datetime sum

我有一个看起来像这样的表:

$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

我真的首先尝试为自己解决问题,并正在寻找示例。但是我发现的每个对象要么比我所需的要复杂得多,要么对我来说太不同以至于无法正确采用它。

谢谢

编辑:

我尝试了回复中的建议之一。但是我得到的只是一个空白页。谁能告诉我我哪里错了?

<?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 :(得分:0)

查询的内容有点像您要描述的内容。您尚未显示任何代码或未指定MySQL API,因此请参见此处以查询How can I prevent SQL injection in 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')即可获取当天的文字表示。

答案 1 :(得分:0)

首先在SQL中运行以下代码: 问题是您的开始和结束日期。您分配了06个月,但是db包含具有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>