我正在创建一个用于归档报告的内部网站。有问题的部分应该创建链接,以填写过去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天或更小的报告。所以这是用户进入菜单时需要发生的事情。
使用上表,最后提交的日期是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)
答案 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)
将数组留空 跳过日期,只需填写日期,以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&date=$date_numeric'>".$date->format("l jS F Y")."</a><br/>";
}
}
}
当然,更简单的方法是使用datetime对象填充skips数组,而不是使用$ date_numeric。
此外,您可能需要确定在过去7天内提交的所有日期,而不仅仅是最近的日期,但这也应该非常简单。
(代码测试为独立工作:http://phpfiddle.org/main/code/iex-wjp) HTH; 尼克