我正在试图弄清楚如何处理我今天早上发现的棘手的小情况。我在我的数据库中有一个条目表,我存储有关用户每月条目的详细信息(信息捕获的东西) - 我希望每月一次增加每个条目的数字(而不是ID)。我们的想法是使用“数字”字段来识别连续的每月条目,并忽略彼此非常接近的条目。
当用户访问该网站以开始新条目时,我会检查上一个条目的完成日期以查看它是否超过21天(有资格作为有效月份)然后我增加“数字”这个新条目。问题是我最终会得到一系列条目,这些条目相隔不到21天(因此都具有相同的数字),但总共超过21天!我需要能够找到一些逻辑来处理这个问题 - 任何人都有任何想法?
这个数据如何存储的例子,以及我遇到的问题,可以在下面看到。
+------+--------+------------+------------+----------------------------+
| id | number | initiated | updated | last_category_reached |
+------+--------+------------+------------+----------------------------+
| 4 | 1 | 1277914181 | 1277914320 | complete |
| 105 | 2 | 1282639343 | 1283444717 | complete |
| 397 | 3 | 1284999429 | 1285001298 | complete |
| 404 | 3 | 1287478550 | 1287478631 | complete |
| 636 | 3 | 1287479243 | 1287479377 | complete |
| 649 | 3 | 1287581361 | 1287581466 | complete |
| 652 | 3 | 1287585123 | 1287585365 | complete |
| 656 | 3 | 1290185205 | 1290424128 | complete |
| 1105 | 3 | 1292421193 | 1292426686 | complete |
| 1106 | 3 | 1292426769 | 1292426870 | complete |
+------+--------+------------+------------+----------------------------+
我的php逻辑低于......
public function update_entry($stage = NULL)
{
// Get last number entered for this user
$last_entry = $this->last_entry();
// If part one, user profile is calling the update (passing the next stage as a param)
if ($stage === 'user/profile/2?s=p_prof&p=2')
{
// Only at this stage do we ever create a new entry
$entry = ORM::factory('data_entry');
// If no previous sessions, start from 1
if ($last_entry === FALSE)
$num = 1;
//Here we need to check the time period elapsed since the last submission
else
{
// Check if time difference between last visit and current time is less than 49 days and more than 21 days
if (($last_entry->initiated > time() - 4233600) && ($last_entry->initiated < time() - 1814400))
{
// Within allowed timeframe, ok to increment by one as a new entry
$num = $last_entry->number + 1;
}
// More than 49 days since last visit
elseif (($last_entry->initiated < time() - 4233600))
{
// Increment by two to break consecutive entries
$num = $last_entry->number + 2;
}
// Entry is within the last 21 days - if user never finished stages, use last entry created instead of creating a new one
else
{
// If they are back at the start having completed a full entry the last time, ok to create a new entry - otherwise use the one created the last time
if ($last_entry->last_category_reached !== 'complete')
$entry = $last_entry;
$num = $last_entry->number;
}
}
// Save the rest of the data for a new entry
$entry->number = $num;
$entry->initiated = time();
$entry->updated = time();
$entry->last_category_reached = $stage;
$entry->user_id = $this->id;
$entry->save();
}
// If it's been more than 49 days since last part completion of an entry, user won't be given option to finish the entry, so no need for time check here
elseif ($stage !== NULL)
{
// This must be a continuation of a form, not the beginning of a new one
// Just update the stage reached and save
$last_entry->last_category_reached = $stage;
$last_entry->updated = time();
$last_entry->save();
// Assign to $entry for return
$entry = $last_entry;
}
return $entry;
}
/**
* Returns the the last data entry session
* @return
*/
public function last_entry()
{
return $this
->limit(1)
->data_entries
->current();
}
答案 0 :(得分:1)
我会在伪代码中做什么:
如果有前一个号码,请使用max(number)和min(id)输入。 计算此条目的时间与当前时间之间的延迟。 如果不到21天,我不会更改数字,如果更多,我会更改数字。
如果您申请,则不会获得超过21天的期限。