我有一个看起来像这样的表:
$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>
请暂时不要担心安全性。以后我会解决的。
答案 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>