我有一个模糊的问题,你们很适合回答。我曾经多次遇到过一个问题,我已经为我的用户填写了一个表单,用于填写由许多不同页面组成的页面。到目前为止,我一直在将它们保存在一个会话中,但我对这种做法有点担心,因为会话可能会过期,而且这似乎是一种相当不稳定的方式。
我可以看到,例如,在SQL中有一个临时表单表,您可以在每页末尾保存它们。我可以看到到目前为止将所有数据发布到下一页。事情就是这样。你们是怎么做到的?这些情况有什么好的做法?
答案 0 :(得分:1)
我会坚持将数据保存在会话中,因为在此阶段或多或少是暂时的:如果用户没有填写表单,您会怎么做?您必须定期检查SQL表中未完成的数据,以使整个应用程序更加复杂。
顺便说一下,会话过期的原因就是安全性。您可以在会话到期时定义自己。
答案 1 :(得分:1)
是的,您绝对可以将中间数据保存在数据库中,然后翻转一些以指示当用户提交最终结果时记录已完成。根据您分割数据集的方式,每个页面可能会在不同的表中创建一行(将某些键绑定在一起)。
您可能还需要考虑以更自由格式的方式保存数据,例如单列中的XML。这将允许您在简单的数据模式中维护复杂的数据结构,但它将使查询数据变得困难(除非您的数据库支持xml列类型,大多数现代企业数据库都这样做。)
将临时数据存储在数据库中的另一个好处是,如果用户希望,用户可以稍后返回。只需在用户启动时向其发送电子邮件,并提供指向其工作项的链接。当然,您可能需要在其上添加任何安全层,以确保其他人不会返回其工作项。
将临时数据存储在数据库中还允许用户从一个页面跳到另一个页面,并重新访问过去的页面。
隐藏字段也是一种很好的方法,但它们不允许用户稍后返回。
我会避免在会话中存储大型数据结构,因为如果用户没有明确地使会话无效,并且如果您没有良好的机制来清理旧会话,那么这些过期的会话可能会长时间存在时间。
最后,它实际上取决于您的具体业务需求,但希望这能为您提供一些思考。
答案 2 :(得分:0)
为什么不直接在隐藏参数中传递内容?
答案 3 :(得分:0)
啊,好问题。
我发现这是处理这种情况的好方法(如果它是线性的)。如果您将不同的内容(页面)包含在一个PHP页面(例如MVC)中,以下内容将特别有效。但是,如果您需要从URL转到URL,则可能很困难,因为您无法通过重定向进行POST(嗯,您可以,但没有浏览器支持它)。
您可以填写详细信息。
$data = array();
//or//
$data = unserialize(base64_decode($_POST['data']));
// add keys to data
// serialize
$data = base64_encode(serialize($data));
<input type="hidden" name="data" value="<?= htmlspecialchars($data, ENT_QUOTES); ?>" />