2010-12-22 27 views
0

我想弄清楚如何处理今天早上我发现自己的一个棘手的小局面。我在我的数据库中有一个条目表,用于存储有关用户每月条目的详细信息(信息捕获的东西) - 我想每月增加一个月的数量(不是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

增加你的时间戳4233600不会考虑日光时间的变化,尝试类似`time() - (time() - strtotime(' - 49 days'))' – acm 2010-12-22 10:36:43

+2

这太抽象了。正确的逻辑取决于我们没有的关于此应用程序的真实业务需求的信息。原始目标与您提出的解决方案之间存在潜在的巨大脱节,我们无法测量这些解决方案,以便了解基于您当前方案的建议是否符合要求或远离其偏离。如果你迫使我抛出一个想法,那就是唯一标识一组条目,而不是重复使用递增数字。确定最新的条目是否应该是最后一个组的一部分。 – 2010-12-22 10:40:27

回答

1

我会在伪代码做什么:

如果有以前的数量,采取与最大的条目(数量)和min(id)。 计算此条目与当前时间之间的延迟时间。 如果小于21天,我不更改数字,如果更多,我更改数字。

如果您应用此选项,则不会获得超过21天的期限。