【问题标题】:Why would some $_POST variables go missing for a form with PHP?为什么使用 PHP 的表单会丢失一些 $_POST 变量?
【发布时间】:2010-04-21 18:46:59
【问题描述】:

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

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

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

  • 用户访问我正在使用的 CMS 中某个页面的编辑屏幕。
  • 页面的记录 ID 作为隐藏值放入表单中。
  • 用户单击 Uploadify 浏览按钮并选择一个文件(仅允许选择单个文件)。
  • 用户点击我的表单的提交按钮。
  • 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)上。

【问题讨论】:

  • 可以发一下表单和服务器代码sn-ps吗?
  • 你说你在表单底部有隐藏的输入。也许你有未关闭的 HTML 标签,浏览器会自动将它们从表单标签中抛出?这有点不可能,但请尝试验证您的页面。
  • 我不认为这是由于未封闭的 HTML 标签造成的,因为此表单适用于包括我自己在内的许多用户。
  • @Chad Johnson:你在所有主流浏览器上都试过了吗?或者至少在 IE6、IE8 和 Firefox 3.5 中?
  • 是的,我尝试在 IE7、IE8、FF3.5.8、FF3.6、Safari 4 和 Chrome 中重现。我的错误电子邮件显示,除了 Chrome 之外,所有这些浏览器都发生了错误。

标签: php flash post


【解决方案1】:

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

【讨论】:

  • 否定;该表单的操作与我发送给 Uploadify 的“脚本”参数不同。而且我肯定会通过 scriptData 传递上传脚本进行上传所需的必要信息。
【解决方案2】:

您是否使用 javascript 处理数据?如果是这样,一些用户可能没有启用 js 并且可能导致问题。尝试在禁用 javascript 的情况下运行表单。

编辑:有助于阅读整篇文章。是的,很可能人们在没有启用 javascript 的情况下运行表单。

【讨论】:

  • 问得好,但不幸的是,禁用Javascript时不会发生错误,并且仍然会发生上传。
【解决方案3】:

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

既然您确实获得了 一些 数据,我可能会开始使用 jquery 创建某种类型的表单元素和它所知道的值的校验和,并将此聚合校验和与形成帖子。取决于您是否无法正常工作,这可能会非常暴露您的问题。

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

【讨论】:

  • 好主意,但到目前为止我还没有发现代码中可能出现这种情况。
【解决方案4】:

我认为您的流程可能是错误的。你不应该这样做吗

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

这样你就避免了拦截东西的复杂性。

这是我的流程的 sn-p:

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的文件进行其他处理。

【讨论】:

  • 我看不出以这种方式改变流程将如何解决问题。不过感谢您的发帖。
  • @chad 在检查 $_POST['data'] 时使用 isset 还是 array_key_exists 示例 #2 array_key_exists() 与 isset() php.net/manual/en/function.array-key-exists.php 可能以某种方式将隐藏值设置为 null
【解决方案5】:

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

如果是这种情况,您将不得不使用自己的操作拆分上传表单和数据表单(最佳解决方案),或者在上传表单“之前”指定所有字段(第二选择)

【讨论】:

    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2011-07-25
      • 2014-08-23
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2016-08-10
      相关资源
      最近更新 更多