在PHP和MySql中创建累积比较表
我有一个名为payments的数据库表,其中包含日期、金额字段。我想从amount字段中获取值,按日期汇总所有金额,并将结果放入html表,然后像在图像上一样输出它们 我已经动态地创建了日期,这样无论哪个月,例如1月1-31日和2月1-31日,它们都是相等的。如果有周末或日期无效,我希望值为零。我想要的是这张桌子[桌子][1][1]: 这就是我得到的[输出][1][1]: ******注****我认为我的解决方案不是解决我问题的最佳方案。如果可能的话,只需查看我想要的图片,并为我找到最佳解决方案。我希望在实现它的步骤或解决方案中得到帮助 我知道我正在使用一个去润滑的mysql synthax,请忽略这一点,并帮助解决我的问题在PHP和MySql中创建累积比较表,php,html,mysql,arrays,loops,Php,Html,Mysql,Arrays,Loops,我有一个名为payments的数据库表,其中包含日期、金额字段。我想从amount字段中获取值,按日期汇总所有金额,并将结果放入html表,然后像在图像上一样输出它们 我已经动态地创建了日期,这样无论哪个月,例如1月1-31日和2月1-31日,它们都是相等的。如果有周末或日期无效,我希望值为零。我想要的是这张桌子[桌子][1][1]: 这就是我得到的[输出][1][1]: ******注****我认为我的解决方案不是解决我问题的最佳方案。如果可能的话,只需查看我想要的图片,并为我找到最佳解决方案
<table border="1" align="center">
<?php
session_start();
include("connection/db_con.php");
$sym='-';
$d=array();
///Insert values of month for period selected into an array
$a = $_POST['dat'];
$b = $_POST['dat2'];
$mnth=array();
$m_nam=array();
$m_nm=array();
$m_nam[]="Day";
//////New way of getting months in format Y-m
$start = new DateTime($a);
$start->modify('first day of this month');
$end = new DateTime($b);
$end->modify('first day of next month');
$interval = DateInterval::createFromDateString('1 month');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $dt) {
$mnth[]=$dt->format("Y-m");
$m_nam[]=date('F-Y', strtotime($dt->format("Y-m")));
$m_nm[]=date('M', strtotime($dt->format("Y-m")));
}
///////End of New way
echo "<tr bgcolor='#999999'>";
foreach ($m_nam as $m)
{
echo"<td>".$m."</td>";
}
echo"</tr>";
/////////End insert////////////////////////
$day=0;
for($x=1; $x<=31; $x++)
{
$day=$day+1;
echo"<tr>";
echo"<td>".$day."</td>";
$d=$sym.$x;
foreach($mnth as $mon)
{
$dat=$mon.$d;
$qry=mysql_query("SELECT SUM(amount) AS total_disb FROM payments where dat='$dat'")or die(mysql_error());
$row=mysql_fetch_assoc($qry);
$sum = $row['total_disb']+0;
echo"<td>".$sum."</td>";
}
echo"</tr>";
}
?>
</table>
您刚刚把日期弄乱了一点,如果我了解您的问题所在,您可以直接从SQL执行,请尝试以下操作:
SELECT SUM(amount) AS total_disb , MONTH(DateTime) , DAY(DateTime)
FROM payments
GROUP BY DATE(DateTime), DAY(DateTime)
更改变量或列名的日期时间
如果您还想在表的末尾对月份总数求和,我建议您进行如下新查询:
SELECT SUM(amount) AS total_disb , MONTH(DateTime)
FROM payments
GROUP BY DATE(DateTime), MONTH(DateTime)
另一种选择是在循环打印值时增加一个变量,但我认为新的查询更简单
如果这不是您需要的,请留下评论,我将对其进行编辑。您刚刚把日期弄乱了一点,如果我了解您的问题所在,您可以直接从SQL中执行,请尝试以下操作:
SELECT SUM(amount) AS total_disb , MONTH(DateTime) , DAY(DateTime)
FROM payments
GROUP BY DATE(DateTime), DAY(DateTime)
更改变量或列名的日期时间
如果您还想在表的末尾对月份总数求和,我建议您进行如下新查询:
SELECT SUM(amount) AS total_disb , MONTH(DateTime)
FROM payments
GROUP BY DATE(DateTime), MONTH(DateTime)
另一种选择是在循环打印值时增加一个变量,但我认为新的查询更简单
如果这不是您需要的,请留下评论,我将对其进行编辑。要获得累积值,您必须存储上一个求和结果,并将其添加到循环中的当前迭代中,类似于:
$sumc = array();
foreach($mnth as $mon) {
$dat = $mon . $d;
$qry = mysql_query("SELECT SUM(amount) AS total_disb FROM payments where dat='$dat'") or die(mysql_error());
$row = mysql_fetch_assoc($qry);
$sum = $row['total_disb'];
if(isset($sumc[$mon])) {
$sumc[$mon] = (int)$sum + $sumc[$mon];
} else {
$sumc[$mon] = (int)$sum;
}
echo "<td>" . $sum . "</td>";
echo "<td>" . $sumc[$mon] . "</td>";
}
$sumc=array();
foreach($mnth作为$mon){
$dat=$mon.$d;
$qry=mysql\u query(“选择SUM(amount)作为总金额,其中dat='$dat'”)或die(mysql\u error());
$row=mysql\u fetch\u assoc($qry);
$sum=$row['total_disb'];
如果(isset($sumc[$mon])){
$sumc[$mon]=(int)$sum+$sumc[$mon];
}否则{
$sumc[$mon]=(int)$sum;
}
回声“$sum.”;
回显“$sumc[$mon]”;
}
应该行得通
(注意:“每日”和“累计”缺少第二行,一旦有了这一行,就需要使用
colspan
来跨越各个月的列)。参见colspan示例。要获得累积值,必须存储上一个求和结果并将其添加到循环中的当前迭代中,如下所示:
$sumc = array();
foreach($mnth as $mon) {
$dat = $mon . $d;
$qry = mysql_query("SELECT SUM(amount) AS total_disb FROM payments where dat='$dat'") or die(mysql_error());
$row = mysql_fetch_assoc($qry);
$sum = $row['total_disb'];
if(isset($sumc[$mon])) {
$sumc[$mon] = (int)$sum + $sumc[$mon];
} else {
$sumc[$mon] = (int)$sum;
}
echo "<td>" . $sum . "</td>";
echo "<td>" . $sumc[$mon] . "</td>";
}
$sumc=array();
foreach($mnth作为$mon){
$dat=$mon.$d;
$qry=mysql\u query(“选择SUM(amount)作为总金额,其中dat='$dat'”)或die(mysql\u error());
$row=mysql\u fetch\u assoc($qry);
$sum=$row['total_disb'];
如果(isset($sumc[$mon])){
$sumc[$mon]=(int)$sum+$sumc[$mon];
}否则{
$sumc[$mon]=(int)$sum;
}
回声“$sum.”;
回显“$sumc[$mon]”;
}
应该行得通
(注意:“每日”和“累计”缺少第二行,一旦有了这一行,就需要使用
colspan
来跨越各个月的列)。参见colspan示例。这里是对您提供的代码的重写,它使用虚拟随机数据而不是DB,POST变量没有逻辑,但您可以用代码替换
<?php
// session start, db connection goes here
echo '<table border="1" align="center">';
// Example of post vars
$start = new DateTime('2015-11-10');
$end = new DateTime('2016-02-28');
// Note: not sure why OP used modify here
$interval = new DateInterval('P1M');
$daterange = new DatePeriod($start, $interval, $end);
// Table Header row 1
echo '<tr><th>Day</th>';
foreach ($daterange as $date) {
echo '<th colspan="2">'.$date->format("F Y").'</th>';
}
echo '</tr>';
// Temporary month store
$months = array();
// Table Header row 2
echo '<tr style="background-color:#22bb22;"><th></th>';
foreach ($daterange as $date) {
$months[] = $date->format("F");
echo '<th>Daily</th>';
echo '<th>Cumulative</th>';
}
echo '</tr>';
// Table Body
$sumc = array();
for ($d = 1; $d <= 31; $d++) {
echo '<tr><td>'.$d.'</td>';
foreach ($months as $month) {
$db_date = $month.'-'.$d; // used for db query
// dummmy data (replace with db query result)
$sum = mt_rand(0, 999);
echo '<td>'.$sum.'</td>';
if(!array_key_exists($month, $sumc)) {
$sumc[$month] = 0;
}
$sumc[$month] = (int)$sum + $sumc[$month];
echo '<td>'.$sumc[$month].'</td>';
}
echo '</tr>';
}
echo '</table>';
?>
这里是对您提供的代码的重写,它使用伪随机数据而不是DB,POST变量没有逻辑,但您可以用代码替换
<?php
// session start, db connection goes here
echo '<table border="1" align="center">';
// Example of post vars
$start = new DateTime('2015-11-10');
$end = new DateTime('2016-02-28');
// Note: not sure why OP used modify here
$interval = new DateInterval('P1M');
$daterange = new DatePeriod($start, $interval, $end);
// Table Header row 1
echo '<tr><th>Day</th>';
foreach ($daterange as $date) {
echo '<th colspan="2">'.$date->format("F Y").'</th>';
}
echo '</tr>';
// Temporary month store
$months = array();
// Table Header row 2
echo '<tr style="background-color:#22bb22;"><th></th>';
foreach ($daterange as $date) {
$months[] = $date->format("F");
echo '<th>Daily</th>';
echo '<th>Cumulative</th>';
}
echo '</tr>';
// Table Body
$sumc = array();
for ($d = 1; $d <= 31; $d++) {
echo '<tr><td>'.$d.'</td>';
foreach ($months as $month) {
$db_date = $month.'-'.$d; // used for db query
// dummmy data (replace with db query result)
$sum = mt_rand(0, 999);
echo '<td>'.$sum.'</td>';
if(!array_key_exists($month, $sumc)) {
$sumc[$month] = 0;
}
$sumc[$month] = (int)$sum + $sumc[$month];
echo '<td>'.$sumc[$month].'</td>';
}
echo '</tr>';
}
echo '</table>';
?>
根据您提供的输出屏幕截图,假设您已成功输出每日金额,但缺少累计金额是否正确?是的,这非常正确。根据您提供的输出屏幕截图,假设您已成功输出每日金额,但缺少累计金额,这是否正确?是的,这是非常正确的。我认为日期问题不是问题,而是累计部分。@Leereal所以您要将某一段时间内的所有金额相加?我要将同一个月的所有金额总和相加,但它是累计金额不同月份的同一天。这是2015-11-01到2015-12-01的总和,这不是我想要的。我希望它将2015-11-01添加到2015-11-02。我认为有更好的方法可以做到这一点。但是我希望我的工作日是从1日到31日,无论是哪个月。要了解我的意思,你能忘记代码,看看我想要的图像,然后与我想要的图像进行比较吗have@Leereal好了,这将返回与所需表中的内容非常相似的内容。您只需要在查询结果中添加一些HTML标记,就可以得到您的表格。我认为日期问题不是问题,而是累积部分。@Leereal那么您想对某段时间内的所有金额进行合计吗?我想将同一个月的所有金额合计,但将不同月份同一天的金额相加。这是2015-11-01到2015-12-01的总和,这不是我想要的。我希望它将2015-11-01添加到2015-11-02。我认为有更好的方法可以做到这一点。但是我希望我的工作日是从1日到31日,无论是哪个月。要了解我的意思,你能忘记代码,看看我想要的图像,然后与我想要的图像进行比较吗have@Leereal好了,这将返回与所需表中的内容非常相似的内容。您只需要在查询结果中添加一些HTML标记,就可以得到您的表格您的想法是正确的,但我想将所有相同的总数相加