0

レポートを提出するための内部サイトを作成しています。問題の部分には、過去 7 日間に提出されていないすべてのレポートへのリンクを作成する必要があります (リストが長くなりすぎないようにするため)。

説明のために、DB 内のいくつかのレポートの非常に単純化された例を次に示します。

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

1 日に提出できるレポートは 1 つだけであり、ユーザーは 7 日以内のレポートしか提出できません。ここでは、ユーザーがメニューに入ったときに何が起こる必要があるかを示します。

  1. 最新のタイムスタンプでレポートを取得します。
  2. レポートは過去 7 日間で 1 日提出されましたか?
    • はいの場合:最後のレポートから今日までのすべての日 (ただし、レポートを含まない) の潜在的なレポートへのリンクを作成します。
    • いいえの場合:過去 7 日間の潜在的なレポートへのリンクを作成します。

上記の表を使用すると、最後に送信された日付は 7 月 3 日 (1 週間以上前) で、今日は 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 の日付にプログラムで到達する方法を知る必要があります)

4

2 に答える 2

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

もちろん、スキップ配列に日時オブジェクトを入力するだけで、$date_numeric を気にする必要はありません。

また、最新のものだけでなく、過去 7 日間に提出されたすべての日を特定する必要があるかもしれませんが、それも非常に簡単なはずです。

(単独で動作するようにテストされたコード: http://phpfiddle.org/main/code/iex-wjp ) HTH; ニック

于 2013-07-23T06:00:06.250 に答える