2

去年,当我刚开始成为一名程序员时,我建立了一个允许新成员加入组织的系统。这是一个跨多个页面的多步骤过程,在信用卡交易成功后结束。部分复杂性是对家庭成员身份的要求,它记录了家庭中每个人的详细信息,并为他们创建了记录。

最初,我使用会话变量中的数组跨步骤维护表单输入数据,并在信用卡付款完成后将数据提交到数据库。

我现在正在完全重建它,因为从那时起我学到了很多东西,而且它变得太乱而无法维护,但我仍然不知道管理这些数据的最佳方法是什么。

最初的理由是,因为有很多步骤,并且最后需要付款,所以在流程完成之前将数据提交到数据库似乎没有意义,特别是因为它涉及多个表中的记录和必须定期清除不完整记录的想法似乎是不必要且过于复杂的工作。第一次这样做后,会话变量中的数组变得非常混乱,并且在代码中涉及大量验证,因为它可能容易出错。我也浪费了很多时间来尝试纠正会话超时(这似乎比我在开发时所期望的要频繁得多)。

所以我问那些比我有更多知识和经验的人:通过多页注册过程维护临时数据的最佳方法是什么?

4

2 回答 2

4

一般来说,没有那么多不同的方法来处理这个问题。

所有数据都将保留在会话中,或者只是一个唯一标识符保留在会话中,它允许您在整个过程中查询数据库中的所有数据。

会话是易变的,所以数据库是一个更好的方法。

将部分数据的每一步保存到数据库中,但是每个相关表中的“已完成”或“已提交”之类的列默认为0,并且只有在流程完成时才将它们全部标记为1。

编写一个由 cron 每晚调用一次的 php 脚本来删除所有已提交 = 0 且最后修改时间大于 1 天的记录确实不是太麻烦(您确实有一个自动更新时间戳的列修改时对吗?)或类似的东西。或者更好的是,与其删除,不如将它们移动到另一个名为“warm_leads”的表中——那些对您的服务感兴趣但由于某种原因退出并让销售/客户服务跟进的人。

此外,将会话超时增加到 1 或 2 小时:

ini_set(’session.gc_maxlifetime’, 120*60); // 120 minutes

或者在每个页面上每 10 分钟触发一次 AJAX 请求,只要浏览器打开并且 javascript 没有损坏,该请求本质上就是执行会话保持活动以扩展会话。

The other good news is with the database persisting data, you only need to validate it once on the way in, and not on every step.

于 2011-09-24T04:33:28.953 回答
3

Here is my other idea. If you are not wanting to use SESSIONS at all you could use Javascript (Yeah hear me out on this). So basically you would load the whole form at once then hide parts of it, when someone clicks next to move on to the next steps in the processes it would show (you could even animate a slide) the hidden part and hide what they just completed.

So you wouldn't be loading different pages but 'sliding' content in and out of view of the user. You could verify that the user has entered data as well before moving on, but you would not be saving the data and you wouldn't need to.

Here would be an example in jQuery (Note it doesn't show fields but you get the idea.)

http://cssglobe.com/lab/easyslider/03.html

Click the down button.

于 2011-09-24T06:56:14.293 回答