带有$ _POST问题的iframe(PHP)

时间:2011-09-19 13:40:41

标签: php iframe

几个月前,我为我的一位客户构建了一个quiz - 应用程序。访问者必须回答“是”或“否”的一些问题。第一个屏幕将提供第一个问题,点击按钮yesno后,访问者将被重定向到第二个问题等。在回答完所有问题之后,他们会根据他们给出的答案得到结果。

该应用程序通过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和发布数据有什么已知问题吗?

3 个答案:

答案 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数据并仍继续处理请求。我猜到真正发生的事情是请求无法真正到达服务器(网络连接问题)或服务器无法处理请求(服务器配置问题),答案没有存储在数据库中,访问者得到无聊和重试因此提出了新的要求(没有答案),访客再次受到第一个问题的欢迎。

那么,从哪里开始?以下是我能想到的几点:

  1. 询问您的客户这种情况发生的频率,是在特定时间(例如早晨的高峰时段)发生的,还是某些人或某些浏览器发生的......或者......您明白了。
  2. 查看apache的access_log和error_log,了解除200以外的HTTP状态代码,php警告或错误。
  3. 查看mysql的error_log,slow_query_log是否有错误或警告。
  4. 当你在这里时,请查看/ var / log / messages
  5. 将调试代码添加到您的站点,例如当站点捕获该访问者没有回答第一个问题并将他/她重定向到第一个问题时,将一些关于它的数据记录到磁盘上的某个txt文件或数据库中的某个表中。 / LI>

    这些应该可以解释你所面临的问题的性质。

答案 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.n​​l”] [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有效,否则将其发送回上一页。