0

我正在创建一个用于提交报告的内部站点。有问题的部分应创建链接以填写过去 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 天潜在报告的链接。

使用上表,最后提交的日期是 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.
}

没什么大不了。但是,如果该报告在过去 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)

4

2 回答 2

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

我希望我接近你所需要的。

于 2013-07-23T06:25:53.637 回答
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;缺口

于 2013-07-23T06:00:06.250 回答