关于flash:为什么使用PHP的表单会缺少一些$ _POST变量?

Why would some $_POST variables go missing for a form with PHP?

有时,实际上一天一次,我的Web应用程序的用户正在提交某种表单,该表单具有大约十二个表单字段,其中一半是隐藏字段,而一半的$ _POST数据根本不存在于处理脚本中。请注意,不存在的字段位于表单的最底部。我知道这是因为这会引发致命错误,并且会向我发送一封包含帖子数据的电子邮件。

当然,我和团队中的任何开发人员都无法重现该问题。

我正在使用一个名为Uploadify的库来显示进度表,因此Flash参与了该过程。这就是流程...没有人有任何想法,为什么一些帖子数据会被清除掉?

  • 用户访问我正在使用的CMS中页面的编辑屏幕。
  • 页面的记录ID被作为隐藏值放入表单中。
  • 用户单击Uploadify浏览按钮并选择一个文件(仅允许单个文件选择)。
  • 用户单击我的表单的Submit按钮。
  • jQuery截获表单提交操作,触发Uploadify开始上载,并为提交操作返回false(手动取消表单提交事件,以便Uploadify可以接管)。
  • Uploadify上传到自定义流程脚本。
  • Uploadify完成上传并触发Javascript完成回调。
  • Javascript回调调用$('#myForm')。submit()提交表单。

在多种浏览器(Firefox 3.5、3.6,Safari,Internet Explorer 7、8)和多种平台(Mac OS 10.5、10.6和Windows XP,7)上会发生这种情况。


我的第一个想法是无效的html。您最后说了隐藏的字段。也许嵌入其中的某些数据没有正确准备或转义。

由于您确实获得了一些数据,因此我可能会开始使用jquery创建某种形式的其知道的表单元素和值的校验和,并将此聚合校验和与表单发布一起发送。取决于您是否遇到问题,这可能很容易说明您的问题。

您也可以尝试找出浏览器发送的http请求的内容长度。也许更改网络服务器日志配置。它可能正在发送数据,并且服务器/脚本处理不正确。


您是否正在使用javascript对数据做任何事情?如果是这样,则某些用户可能未启用js,并可能导致了问题。尝试在禁用javascript的情况下运行表单。

编辑:有助于阅读整个帖子。是的,很有可能人们正在运行未启用JavaScript的表单。


文件上载(Uploadify)的目标脚本是否与

相同的脚本?如果是这样,除非您在scriptData配置选项中明确指定,Uploadify不会随文件上传一起发送任何信息(即其他表单字段)。可能是由于这些上传文件点击了页面导致了错误,导致请求缺少某些字段。


这似乎是一个愚蠢的答案,但是您是否考虑过某些用户双击?可能是第二次点击导致了问题?


如果未通过的字段以相同的形式在文件上传字段之后定义,则很可能是您的问题。

在这种情况下,您将必须分别使用自己的操作拆分上传表单和数据表单(最佳解决方案),或者在"上传表单之前"指定所有字段(第二选择)


我认为您的流程可能不正确。你不应该在做什么

1>浏览文件
2>选择文件后,将自动开始上传。
3>用户选择提交按钮

这样,您可以避免拦截事物的复杂性。

这是我的流程的片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var fname = '';
$(document).ready(function() {
    $('#upload').hide();
    $('#submit_btn').hide();

    if($('#id').val()) {
        $('#upload').show();
    }
    $('#upload').uploadify({
        uploader:   'js/uploadify/uploadify.swf',
        script:     'upload.php',
        folder:     '_holder',
        auto:       true,
        cancelImg:  'images/cancel.png',
        buttonText: 'Upload File',
        width:      '120',
        onComplete: function(event, queueID, fileObj, reponse, data) {
            fname = fileObj.name;
            $("#status_msg").html( 'File Is Uploaded.' );
            $('#submit_btn').show();
       }
    });
});

然后,当然我要对submit_btn中的文件进行其他处理。