2011-11-30 37 views
1

我有一个php/mysql应用程序,其中的一部分允许用户上传一个csv文件。在这个过程中的步骤如下:PHP解析CSV文件 - 它是否应该存储在数据库中

  1. 用户上传文件,它被解析的合法性进行检查
  2. 如果该文件是有效的,则显示该分析信息,以供用户选择沿从csv文件到数据库列
  3. 导入数据匹配列 - 最终阶段的CSV数据实际导入到数据库

所以,这个问题我有在这一点上是相同的csv文件在上述3个步骤中进行解析 - 这意味着3解析f或每个导入。

鉴于每个csv文件最多可以有500行,因此这不会让我感到特别高效。

我应该在步骤1之后临时将导入的信息存储在数据库表中吗?如果是这样,我显然会运行清理程序,以保持桌子尽可能干净。一个缺点是,CSV导入可以包含2到10列 - 所以我不得不建立一个至少有11列(带有ID字段)的数据库表......在大多数情况下这会有点多余。

或者我应该坚持使用csv解析?高达500行是相当小的...

或者还有另一种更好的选择?

+0

为什么不只是一个步骤:上传并放入数据库? – abcde123483

+0

@ulvund不能上传并直接放入数据库。如前所述,用户必须将csv文件(可以以任何顺序)的列与数据库列进行匹配。 – JonoB

回答

0

我只是坚持解析它3次。无论如何,PHP是缓慢的,因为使用数据库或向客户端发送信息的网络延迟。最重要的是你的代码是可维护可扩展。计算机程序中最慢的部分是开发人员。

http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize

http://ubiquity.acm.org/article.cfm?id=1147993

http://benchmarksgame.alioth.debian.org/u32/which-programs-are-fastest.html

希望帮助...

+0

“PHP在这个硬件上没有得到好的结果”!=“PHP很慢” –

+0

这对所有语言来说都是相同的硬件(和问题)。这就是为什么他们称之为基准。是的,PHP很慢;但我仍然使用它,因为编程速度很快。如果您想快速运行某些内容,请使用C或C++编写它。 – Homer6

+0

我的观点是,基准并不一定反映任何真正的应用程序将如何执行,因为应用程序可能不会执行与基准相同的任务。尽管这可能是一个合理的估计。 –

0

我不得不做类似的事情导入用户到数据库中。我落得这样做是这样的:(前<input type="hidden" name="data[]" value="thedata" />

  • 导入并解析CSV
  • 数据分配到一个数组
  • 下一页有一堆隐藏的表单字段的每个数据
  • 发布并将数据添加到数据库中

它结束了我的工作。您也可以将数据保存到会话变量。

+0

这几乎等同于在流程的每个步骤重新提交数据,并且看起来相当浪费。 –

+0

看看答案中的最后一句。 –

+0

错过了。但主要建议似乎仍然是重新提交。 –

2

在PHP中,您可以将数据存储到会话内存中供以后使用。这允许您仅解析CSV文件一次,将其保存在会话内存中,并在后面的所有步骤中使用此对象。

请参阅http://www.tizag.com/phpT/phpsessions.php的小教程。

让我再解释一下。 每次Web浏览器从服务器请求页面时,PHP都会执行与该Web页面关联的PHP脚本。然后它将输出发送给用户。这本质上是无状态的:用户请求一些东西,你返回一些东西 - >交易结束。

有时,您可能想记住您在PHP脚本中计算出的内容,并在下次请求页面时使用它。这是有状态,您希望跨不同的Web请求保存状态。

一种方法是将此结果保存在数据库或平面文件中。您甚至可以为当前连接的用户添加标识符,以便使用每个用户文件或将当前用户保存到数据库中。

您也可以使用隐藏表单并将所有数据保存为隐藏输入字段。当用户按下“下一步”时,隐藏的输入字段将被发送回PHP脚本。

这一切都很笨拙。有一个更好的方法:会话记忆。这是您可以访问的一段内存,它保存在不同的PHP调用中。这是保存这样的临时状态信息的完美之选。会话内存可以为每个应用程序用户建立索引。

请注意,有框架需要进一步研究。 Java SEAM有一个APPLICATION内存,一个SESSION内存,一个CONVERSATION内存,一个PAGE内存以及一个EVENT内存。

+0

我已经在我的应用中广泛使用会话。事实上,会话被加密并存储在数据库中以保证安全。所以,无论如何它都会使数据库翻转。 – JonoB

相关问题