在PHP中创建最近7天(或更短)天的潜在条目

时间:2013-07-23 05:33:02

标签: php

我正在创建一个用于归档报告的内部网站。有问题的部分应该创建链接,以填写过去7天内所有未提交的报告(以防止列表过长)。

为了便于说明,以下是数据库中某些报告的极其简化的示例:

id  ||  date
1   || 2013-7-1 00:00:01
2   || 2013-7-2 00:00:01
3   || 2013-7-3 00:00:01

每天只能提交一份报告,用户只能提交7天或更小的报告。所以这是用户进入菜单时需要发生的事情。

  1. 抓取最近时间戳的报告。
  2. 报告是否在过去7天内提交了一天?
    • 如果是:为上次报告与今天之间(但不包括)之间的所有日期创建指向潜在报告的链接。
    • 如果否:在过去7天内创建指向潜在报告的链接。
  3. 使用上表,最后提交的日期是7月3日(一周前) - 今天是7月23日 - 所以我想为7月16日 - 7月22日的报告创建链接。我编写的代码可以帮助我做到这一点。

    报告类

    class Report {
        public $id;
        public $location;
        public $user;
        public $date;
        public $problems_encountered;
        public $problems_resolved;
        public $problems_description;
    
        public function __construct($location, $user, $date, $problems_encountered, $problems_resolved, $problems_description, $id=0) {
            $this->location = $location;
            $this->user = $user;
            $this->date = $date;
            $this->problems_encountered = $problems_encountered;
            $this->problems_resolved = $problems_resolved;
            $this->problems_description = $problems_description;
            $this->id = $id;
        }
    
        public static function GetMostRecent() {
            $m = getMyConnection();
            $q = "SELECT * FROM `uptime_tickets` ORDER BY `date` DESC LIMIT 1";
            $r = $m->query($q);
            $row = $r->fetch_assoc();
            if (is_array($row)) {
                $report = new Report(
                    $row['location'],
                    $row['user'],
                    $row['date'],
                    $row['problems_encountered'],
                    $row['problems_resolved'],
                    $row['problems_description'],
                    $row['id']          
                );
    
                $m->close();
                return $report;
            }
    
            $m->close();
            return false;
        }
    
        public function was_submitted_in_last_7_days($report) {
            $start = strtotime("-1 week");
            $end = strtotime("today");
    
            return ((strtotime($report->date) >= $start) && (strtotime($report->date) <= $end)); 
        }
    }
    

    使用我已经定义的2个函数,确定报告是否在上周提交的内容非常简单:

    $report = Report::GetMostRecent();
    if (!$report->was_submitted_in_last_7_days()) {
        // Create links for the last 7 days.
    }
    

    没什么大不了的。但是,如果报告DID在过去7天内出现下降,我将无法确定要执行的操作。让我们假设前面提到的表格中有第4行:

    id  ||  date
    4   || 2013-7-19 00:00:01
    

    如何以编程方式创建7月20日,21日和22日新报告的链接?

    澄清:

    我所指的链接只是HTTP GET个请求 - 它们看起来像是:

    <a href="new-report.php?location=3&date=2013-7-20">Saturday, July 20th</a>

    如果我在这里详细说明,我很抱歉,但我害怕不能覆盖我想要完成的整个范围(这相对简单 - 但很难解释)。

    编辑#1 我提供了太多的背景,而且问题不够 - 这是一个更相关的描述:

    我能做什么 目前,我可以确定上次提交的报告是否是过去7天内的日期。

    我需要做什么 如果报告是在过去7天内提交的日期(如上面的例子),我需要以编程方式确定上次提交日期和昨天之间的日期。 (在上面的例子中,我需要知道如何以编程方式到达日期2013-7-20,2013-7-21和2013-7-22)

2 个答案:

答案 0 :(得分:1)

好的,我不确定我是否正确,但我会尝试, 首先,我们需要一种新方法来获取过去7天的报告,

public function getLastWeekReports($user_id)
{
    $query = "SELECT * FROM `uptime_tickets` WHERE `user` = '$user_id' AND
    `date` > CURDATE() - INTERVAL 1 WEEK ORDER BY `date` DESC";
     # rest of processing to return report array
}

然后获取缺少的报告日期

public function getMissingDates($reports)
{
    $missing_dates = array();
    foreach(range(-1, -7) as $diff) {
        $missing_dates[] = new DateTime($diff." days");
    }
    foreach($reports as $report) {
        $key = array_search($report->date, $missing_dates);
        if($key!==false){
            unset($missing_dates[$key]);
        }
    }

    return $missing_dates;
}

那将返回没有报告的日期,我们需要将它们变成链接

public function createLink($date)
{
    $timestamp = strtotime($date);
    $url = "<a href='new-report.php?location=3&date=".
           date("Y-j-d", $timestamp).
           "'>".
           date("l, F jS",$timestamp).
           "</a>";

    return $url;
}

您可以使用日期数组轻松执行foreach并调用createLink()

我希望我接近你需要的东西。

答案 1 :(得分:0)

所有7天

将数组留空 跳过日期,只需填写日期,以2013-7-20格式跳过

function create_links_for_last_7_days($skips=array()) {
    $i = -7;
    while ($i < 0) {
        $i++;
          $date = date_create("$i days");
          $date_numeric = $date->format("Y-m-d");
          if (!in_array($date_numeric,$skips)){
              echo "<a href='new-report.php?location=3&amp;date=$date_numeric'>".$date->format("l jS F Y")."</a><br/>";
              }
          }
       }

当然,更简单的方法是使用datetime对象填充skips数组,而不是使用$ date_numeric。

此外,您可能需要确定在过去7天内提交的所有日期,而不仅仅是最近的日期,但这也应该非常简单。

(代码测试为独立工作:http://phpfiddle.org/main/code/iex-wjp) HTH; 尼克