【问题标题】:Create a cumulative comparison table in PHP and MySql在 PHP 和 MySql 中创建累积比较表
【发布时间】:2016-02-27 09:50:09
【问题描述】:

我有一个名为 Payments 的数据库表,其中包含日期、金额字段。我想从金额字段中获取值并按日期对所有金额求和,然后将结果保存到 html 表中,然后像在图像上一样输出它们。

我动态地创建了日期,以便它们在哪个月份都相同,例如 1 月的 1-31 月和 2 月的 1-31 月。如果有周末或日期无效,我希望该值为零。我想要的是这样的表[table][1][1]:http://i.stack.imgur.com/iMOl3.jpg

这就是我得到的 [输出][1][1]:http://i.stack.imgur.com/MJpyT.jpg

******注意***** 我认为我的解决方案不是解决我的问题的最佳解决方案。如果可能的话,请查看我想要的图片并为我找到最佳解决方案。我希望在实现它的步骤或解决方案方面得到帮助

我知道我正在使用一个废弃的 mysql 合成器,请忽略它并帮助解决我的问题。

<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>

【问题讨论】:

  • 从您提供的输出屏幕截图中,假设您已成功输出每日金额并且缺少累积金额是否正确?
  • 是的,非常正确。

标签: php html mysql arrays loops


【解决方案1】:

这是您提供的代码的重写,它使用虚拟随机数据而不是 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 查询将返回 0,因此假设这些都被注意是否正确?或者,即使数据库查询从 total_disb 返回的金额 >0,您是否也必须检查周末的代码?

【讨论】:

  • flacle 你是最棒的,这正是我所需要的。我想对这个答案投赞成票,但由于我的声誉,我无法这样做。非常感谢您的努力。
  • 你的假设是正确的@flacle。这很有效,我只是将 $months[] 更改为以 $date->format("Y-m") 格式保存日期
  • @Leeral 很高兴它成功了 :) 也许你有幸接受这个作为答案?
【解决方案2】:

您刚刚搞砸了日期,如果我了解您的问题出在哪里,您可以直接从 SQL 中执行,尝试类似:

SELECT SUM(amount) AS total_disb , MONTH(DateTime) , DAY(DateTime)
FROM payments   
GROUP BY DATE(DateTime), DAY(DateTime)

更改变量或列名称的 DateTime。

如果您还想对表末尾的月份总数进行求和,我建议您进行一个新查询,例如:

SELECT SUM(amount) AS total_disb , MONTH(DateTime)
FROM payments   
GROUP BY DATE(DateTime), MONTH(DateTime)  

另一种选择是在循环打印值时增加一个变量,但我认为新查询更简单。

如果这不是您需要的,请发表评论,我会编辑它。

【讨论】:

  • 我认为日期问题不是问题,而是累积部分。
  • @Leeral 所以你想对某个时间段内的所有金额求和?
  • 我想将同一个月的所有总金额相加,但将不同月份同一天的金额相加。那就是将 2015-11-01 加到 2015-12-01 这不是我想要的。我希望它将 2015-11-01 添加到 2015-11-02。我认为有更好的方法可以做到这一点。但我希望我的日子从 1 到 31 不分月份。
  • 要明白我的意思,你能忘记代码并查看我想要的图像与我拥有的图像相比
  • @Leeral 好了,这应该返回与您在所需表中的内容非常相似的内容。您只需在该查询结果中添加一些 HTML 标记,您将拥有您的表格
【解决方案3】:

要获得累积,您必须存储先前的求和结果并将其添加到循环中的当前迭代中,例如:

$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>";
}

应该可以工作。

(注意:您缺少“每日”和“累积”的第二行,一旦有了该行,您需要使用 colspan 来跨越月份的列)。查看 colspan here 的示例。

【讨论】:

  • 你的想法是对的,但我想把同一个月的所有金额加起来,但它加起来不同月份同一天的金额。那就是将 2015-11-01 加到 2015-12-01 这不是我想要的。我希望它将 2015-11-01 添加到 2015-11-02
  • 我认为有比我更好的方法。
  • @Leeral 对,你的月份是水平的,我在想什么是保持简单的方法,假设你需要水平对齐月份。我有个主意,让我更新代码。
  • 是的,我希望月份根据我选择的日期是水平的,并且天数从 1-31 垂直固定检查我的图像,我认为我做错了。给我最好的方法。但是考虑一下我从 1 到 31 的日期总是以月份为准
  • 好的,猜想还没有批准@Leeral 这个想法是在 for 循环之外声明一个数组,并在每次迭代中使用一个月作为键填充这个数组。所以$sumc[$mon] = (int)$sum + $sumc[$mon]; 您必须测试是否使用if(isset($sumc[$mon])) 为第一行设置了键,否则您可能会收到未定义索引的 PHP 通知。
猜你喜欢
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 2012-02-24
相关资源
最近更新 更多