【问题标题】:Duplicated data when reloading view重新加载视图时重复数据
【发布时间】:2017-01-11 02:51:05
【问题描述】:

我正在尝试从文本文件中获取数据并将数据传递到数据库。问题是,每次我重新加载视图时,都会发送数据,这意味着我会收到重复的数据,有没有办法防止这种情况发生?可能是截断文件或保存处理的最后一行的行号?

另外,文本文件的生成方式是我每天都会得到一个新的文本文件,文件名上带有日期,所以我想的另一种方法可能是创建一个新的数据库表,我会在其中标记每个我将文件处理为“已处理”,因此该函数不会多次处理同一文件。

这是文本文件的示例:

1618 0002 9    9  505   04129284134    4141191269    4141191269 56984 4      002 001 4

1606 0000 9                    1159    4169191388    4169191388       4      012     0

1607 0009 7    9  505   04129284134          1245          1245 56984 4         

1619 0000 9    6               1172    2129922686    2129922686       4      013     0

1606 0000 9                    1159    4169191388    4169191388       4      012     0

1607 0009 7    9  505   04129284134          1245          1245 56984 4        

1619 0000 7    6  521         1188#          1172          1172       0          001 4

1606 0000 9                    1159    4169191388    4169191388       4      012     0

1607 0009 7    9  505   04129284134          1245          1245 56984 4         

这是我在路由文件中使用的函数:

Route::get('calls', function () {
    foreach (file(public_path() . "/calls.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
        $calls                 = new Calls();
        $calls->time           = trim(substr($line, 0, 4));
        $calls->duration       = trim(substr($line, 5, 4));
        $calls->cond_code      = trim(substr($line, 10, 1));
        $calls->code_dial      = trim(substr($line, 15, 1));
        $calls->code_used      = trim(substr($line, 18, 3));
        $calls->dialed_num     = trim(substr($line, 24, 11));
        $calls->calling_num    = trim(substr($line, 39, 11));
        $calls->clg_num_in_tac = trim(substr($line, 53, 11));
        $calls->auth_code      = trim(substr($line, 64, 5));
        $calls->frl            = trim(substr($line, 70, 1));
        $calls->ixc_code       = trim(substr($line, 77, 3));
        $calls->in_crt_id      = trim(substr($line, 85, 3));
        $calls->save();
    }
    return View::make('test')
        ->with('calls', Calls::all());

});

【问题讨论】:

  • 是 txt 文件还是制表符分隔的 csv?
  • 通过get 路由处理您的表单请求是一种不好的做法。试试看下面我的解决方案,看看它是否适合你。
  • @Jeff 这是一个具有固定宽度列的文本文件。

标签: php laravel


【解决方案1】:

问题在于实现。

在当前实现中,如果您需要限制重复项,则需要将每个输入与数据库记录进行匹配。

但这是一个非常糟糕的设计并且非常不受欢迎。

您要做的是在表单中添加 file input 字段并在表单中添加 POST。然后像这样处理表单。

Route::post('calls', function () {
    // your code goes here...
});

完成后,您可以重定向到另一条路线。

【讨论】:

  • 问题是我没有使用表单。我从目录中获取文件,解析里面的信息,然后在表格中显示数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多