几个月前,我为我的一位客户构建了一个quiz
- 应用程序。访问者必须回答“是”或“否”的一些问题。第一个屏幕将提供第一个问题,点击按钮yes
或no
后,访问者将被重定向到第二个问题等。在回答完所有问题之后,他们会根据他们给出的答案得到结果。
该应用程序通过iframe集成到客户的网站中。第一个问题的网址如http://www.domainname.com/quiz/1/。访问此页面时,PHP将生成一个ID,以标识访问者的会话。在回答问题1后,此ID将添加到URL中。以下问题的网址如http://www.domainname.com/quiz/2/wgbew9rbger9o/。
回答问题后,答案将存储在与URL中的ID对应的数据库记录中。问题的答案由$ _POST提交。如果您没有回答之前的5个问题,则无法通过示例问题6访问,PHP会将访问者重定向到最后回答的问题。
该应用程序工作正常,但是,我的客户抱怨一些无法通过第一个问题的访问者。他们可以回答这个问题,所以他们的答案会发布到服务器上,但不知何故,$ _POST-数据卡在某处,PHP认为'这个客户没有回答问题1,所以我必须把他送到问题1'。
这个问题只有一些访问者检测到,我尝试了一切,但我无法重现错误。如果你无法重现问题,很难解决问题......
iframe和发布数据有什么已知问题吗?
答案 0 :(得分:0)
当您说“PHP将生成ID”时,您可能正在讨论PHP会话和PHP会话ID。
默认情况下,PHP会话使用浏览器中的cookie来维护会话。您似乎依赖此功能。
如果用户因为没有启用Cookie而丢失会话,他们将失去进度。
您可以让PHP自动将会话ID添加到您的URL,从而通过使用PHP设置消除对cookie的需求:
session.use_cookies = 0
否则,请确保访问者已启用Cookie。
答案 1 :(得分:0)
我们一直在公司使用iframe,POST和php。我不知道这个设置的特殊问题。我建议你到别处寻找问题,因为iframe和post是非常基本的,标准的东西。
此外,php不会丢失POST数据并仍继续处理请求。我猜到真正发生的事情是请求无法真正到达服务器(网络连接问题)或服务器无法处理请求(服务器配置问题),答案没有存储在数据库中,访问者得到无聊和重试因此提出了新的要求(没有答案),访客再次受到第一个问题的欢迎。
那么,从哪里开始?以下是我能想到的几点:
这些应该可以解释你所面临的问题的性质。
答案 2 :(得分:0)
首先,感谢您的想法到目前为止。我们还没有解决问题,但我们确实有一些新的信息:
我们不使用php session-id,而是自己创建一个随机字符串。该字符串长度为255个字符。
在apache错误日志中有多个通知,如下所示:
[Thu Sep 22 08:58:57 2011] [错误] [client 212.121.99.2] mod_security:过滤请求的POST有效负载,但有效负载不可用[hostname“www.webfrog.nl”] [uri“/ application /客户/ 2 / 3BF9g3q9fRmqNkrsRakDimjfB46zrKUa3h0a0g96ZmntwEL5FXzN9ITrDGQW7sW1AM2qT1nydBRA6kwr7X6XlF5O2Lq0532lFTCfLQEO8c64nsca58XhuRXnk4e677itGKz9i5Ng7K1a44b03Z7dwJrHEvErjMLQe2PmXjtJUlKEfMk8r82OIjd3FHlOaXlfO1rr1L2MXt726iQegISOSWIfjTUkw7p2OHkG939Wm6E9ecdlLX1lypqI91SmZ8f /“] [UNIQUE_ID ”TnrcsS4RBNQAADTwB7wAAAAF“]
上述错误是否可能是因为某些浏览器无法处理iframe中的255+网址长度?
编辑:日志表明许多有此问题的用户使用IE7 + WinXP
的组合 Edit2:可能的解决方案:我们使用<button type="submit" name="answer" value="1">Yes</button><button type="submit" name="answer" value="2">No</button>
来提交数据。 IE中似乎存在一个缺陷,它不解析值数据,而是解析innerHTML。我们的重新路由脚本仅允许值1或2有效,否则将其发送回上一页。