苦苦于用于检查连续数据条目的逻辑

时间:2010-12-22 10:26:27

标签: php

我正在试图弄清楚如何处理我今天早上发现的棘手的小情况。我在我的数据库中有一个条目表,我存储有关用户每月条目的详细信息(信息捕获的东西) - 我希望每月一次增加每个条目的数字(而不是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();
    }

1 个答案:

答案 0 :(得分:1)

我会在伪代码中做什么:

如果有前一个号码,请使用max(number)和min(id)输入。 计算此条目的时间与当前时间之间的延迟。 如果不到21天,我不会更改数字,如果更多,我会更改数字。

如果您申请,则不会获得超过21天的期限。