代码之家  ›  专栏  ›  技术社区  ›  mike

提交表单时php$_POST数组为空

  •  83
  • mike  · 技术社区  · 17 年前

    我有一个定制的CMS,我已经建立了完美的工作在我的开发框(Ubuntu/PHP5+/MySQL5+)。

    我刚刚把它移到我的客户机的生产框中,现在所有表单提交都显示为空的$u POST数组。

    我发现了一个验证数据是否通过的技巧 file_get_contents('php://input'); $_POST / $_REQUEST 数组总是空的。

    我还通过firebug验证了内容类型头的正确性( application/x-www-form-urlencoded; charset=utf-8

    无论表单是通过AJAX提交还是通过常规表单提交,都会发生此问题。

    非常感谢您的帮助!

    25 回复  |  直到 15 年前
        1
  •  174
  •   tiltem    13 年前

    我知道这个问题是关于通过表单发布的,但是当使用JSON内容类型发布时,我来到这里寻找类似问题的答案。找到了答案,想和大家分享,因为这花了我很多时间。

    以下是解决问题的方法:

    $rest_json = file_get_contents("php://input");
    $_POST = json_decode($rest_json, true);
    

        2
  •  83
  •   icesar icesar    16 年前

    这是另一个可能的原因——我的表单提交到domain.com时没有WWW。所以要解决这个问题我只需要提交到www.domain.com

        3
  •  22
  •   Randy Kilwag    13 年前

    我也有类似的问题。结果是一个简单的解决办法。以我的形式

    <form action=“directory”method=“post”>

    在我动作的结尾加上斜杠就成功了-

    <form action=“directory/”method=“post”>

    我的$POST数组又满了!

        4
  •  12
  •   MrMage    15 年前

    • track_vars (它只在非常旧的PHP版本上可用)设置为 On
    • variables_order 包含字母 P
    • post_max_size
    • (如果使用suhosin补丁) suhosin.post.max_vars suhosin.request.max_vars 足够大。

        5
  •  7
  •   Fluffeh    13 年前

    我发现当从HTTP发布到HTTPS时 $_POST 空了。 这是在测试表单时发生的,但我花了一段时间才意识到这一点。

        6
  •  5
  •   GUIR    12 年前

    我遇到了一个相似但略有不同的问题,花了两天时间才理解这个问题。

    • 然后使用文件“get”内容(“php://input”)进行检查,也就是 空的。

    后来我发现,如果我刷新提交后加载的页面,浏览器不会要求确认是否重新提交表单数据。它直接刷新了页面。但当我将表单URL改为另一个时,它会正确地传递POST,并在尝试刷新页面时要求重新提交数据。

    然后我检查了实际的URL有什么问题。URL没有问题,但是它指向的是URL中没有index.php的文件夹,我正在index.php上查看POST。

    在这里,我怀疑从/到/index.php的重定向会导致POST数据丢失,并通过将index.php附加到URL来测试URL。

    很有效。

    把它贴在这里,这样有人会觉得有帮助。

        7
  •  4
  •   Mike D Mike D    17 年前

    php_value post_max_size xxMB
    php_value upload_max_filesize xxMB
    

    我添加了额外的变量,希望能提高所有suhosin.post.xxx/suhosin.upload.xxx变量的限制,但不幸的是,这些变量对这个问题没有任何影响。

    总之,我不能真正解释这里的“为什么”,但已经确定了根本原因。我的感觉是,这最终是一个suhosin/htaccess问题,但不幸的是,除了删除上面2个php重写的值之外,我无法解决这个问题。

        8
  •  4
  •   RudeUrm    15 年前

    我可以使用enctype=“application/x-www-form-urlencoded”解决这个问题,因为默认值是“text/plain”。签入$DATA时,分隔符是“text/plain”的空格和“urlencoded”的特殊字符。

    亲切的问候

        9
  •  4
  •   Luke A. Leber    10 年前

    拥有 enable_post_data_reading 禁用设置将导致此问题。根据文件:

    禁用此选项将导致不填充$u POST和$u文件。读取postdata的唯一方法就是通过php://input stream包装器。这对于代理请求或以节省内存的方式处理POST数据非常有用。

        10
  •  4
  •   Sunday G Akinsete    10 年前

    如果要发布到index.php文件的目录中,例如/api/index.php,请确保在表单中指定文件的完整目录,例如

    <form method="post" action="/api/index.php"> 
    </form>
    

    或者

    <form method="post" action="/api/"> 
    </form>
    

    作品。

    但这失败了

    <form method="post" action="/api"> 
    </form>
    
        11
  •  3
  •   Bram Vanroy    9 年前
    <form action="test.php" method="post">
                            ^^^^^^^^^^^^^
    

    好吧,这太愚蠢了,我会在公共场合让自己难堪,但是我在PHP中为一些东西编写了一个小测试脚本,当我 $_POST 数组是空的,StackOverflow是我查找的第一个地方,我没有找到所需的答案。

    <form action="test.php">
    

    忘了把方法指定为 POST !

        12
  •  2
  •   Chandu    15 年前

    参考: http://www.openjs.com/articles/ajax_xmlhttp_using_post.php

    后置法

    我们将做一些修改,以便在发送请求时使用POST方法。。。

    var url = "get_data.php";
    var params = "lorem=ipsum&name=binny";
    http.open("POST", url, true);
    
    //Send the proper header information along with the request
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http.setRequestHeader("Content-length", params.length);
    http.setRequestHeader("Connection", "close");
    
    http.onreadystatechange = function() {//Call a function when the state changes.
      if(http.readyState == 4 && http.status == 200) {
        alert(http.responseText);
      }
    }
    http.send(params);
    

    某些http头必须与任何POST请求一起设置。所以我们把他们放在这一行。。。

    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http.setRequestHeader("Content-length", params.length);
    http.setRequestHeader("Connection", "close");
    

    通过以上几行,我们基本上是说数据发送是以表单提交的格式进行的。我们还给出了发送参数的长度。

    http.onreadystatechange = function() {//Call a function when the state changes.
      if(http.readyState == 4 && http.status == 200) {
        alert(http.responseText);
      }
    }
    

    我们为“就绪状态”更改事件设置了处理程序。这与我们用于GET方法的处理程序相同。您可以在这里使用http.responseText-使用innerHTML(AHAH)、eval it(JSON)或任何其他方法插入到div中。

    http.send(params);
    

    最后,我们将参数与请求一起发送。只有在调用此行之后,才会加载给定的url。在GET方法中,参数将为空值。但是在POST方法中,要发送的数据将作为send函数的参数发送。params变量在第二行声明为 lorem=ipsum&name=binny -所以我们发送两个参数-“lorem”和“name”,分别值为“ipsum”和“binny”。

        13
  •  2
  •   Ali Shariati    7 年前

    我在postman中试图通过post请求连接到本地服务器代码,这个问题浪费了我很多时间!

    对于使用本地项目的任何人(例如邮递员): 使用IPv4地址(在命令行中键入ipconfig)而不是“localhost”关键字。 就我而言:

    之前:

    localhost/app/login
    

    之后:

    192.168.1.101/app/login
    
        14
  •  1
  •   Josh P    15 年前

    在我的例子中,这是因为在使用jQuery提交表单之前,我正在使用jQuery禁用页面上的所有输入。 所以我改变了我的“禁用所有输入,甚至是‘隐藏’类型”:

    $(":input").attr("disabled","disabled"); 
    

    要“仅禁用‘按钮’类型输入”:

    $('input[type=button]').attr('disabled',true);
    

    如果您将“disabled”属性放在“hidden”类型的表单输入中,那么如果表单被提交,它们的值将不会被发送过来!

        15
  •  1
  •   animuson    14 年前

    对我来说,.htaccess在未安装mod_rewrite时正在重定向。安装mod_rewite,一切正常。

    明确地:

    <IfModule !mod_rewrite.c>
      ErrorDocument 404 /index.php
    </Ifmodule>
    

    正在执行。

        16
  •  1
  •   MyraGe    8 年前

    我只是花了几个小时来解决一个类似的问题。我的问题是

    max_input_vars = "1000"
    

    默认情况下,在php.ini中。我有一个很大的表格没有上传。php.ini被设置为upload_max_filesize=“100M”和post_max_size=“108M”,在我的例子中肯定不是这个问题。当表单中的max_input_vars超过1000个变量时,PHP行为与此相同。它返回并清空POST数组。我真希望我能在一个小时前,几个小时前找到。

        17
  •  1
  •   Walid Ajaj    7 年前

    我知道这是旧的,但想分享我的解决方案。

    php_value post_max_size 50MB
    php_value upload_max_filesize 50MB
    

    后来我注意到这些值应该是xxM而不是xxMB,当我将其更改为:

    php_value post_max_size 50M
    php_value upload_max_filesize 50M
    

    现在我的$POST恢复了以前的数据。 希望这对将来有帮助。

        18
  •  1
  •   Игорь Носков    7 年前

    在我的例子中,当从HTTP发布到HTTPS时,$u POST是空的。问题是,当我将url修复为 https://example.com ,问题消失了。

        19
  •  0
  •   akjoshi HCP    13 年前

    除了mage先生的帖子:

    $_POST 变量(包含大数组1000个项)消失:

    suhosin.request.max_vars = 2500
    

    " request post “是解决办法。。。

        20
  •  0
  •   Rápli András    13 年前

    也许不是最方便的解决方案,但是我发现如果我设置表单 action

        21
  •  0
  •   Victor Häggqvist    12 年前

    这有点类似于 said .

    但是我试着把东西发布到我的api,位于 site/api/index.php ,仅发布到 site/api 因为它被传给 index.php $_POST 在飞行中被清空了。简单地发布到 站点/api/index.php

        22
  •  0
  •   Ben artificialidiot    11 年前

    我的问题是我在使用HTML <base> 标记以更改我的测试站点的基本URL。一旦我从标题中删除了标记 $_POST 数据回来了。

        23
  •  0
  •   Community Mohan Dere    9 年前

    在我的例子中(OVH mutualis服务器上的php页面) enctype="text/plain" 不起作用( $_POST 以及相应的 $_REQUEST 是空的),下面的其他例子也有效。

    <form action="?" method="post">
    <!-- in this case, my google chrome 45.0.2454.101 uses -->
    <!--     Content-Type:application/x-www-form-urlencoded -->
        <input name="say" value="Hi">
        <button>Send my greetings</button>
    </form>
    
    <form action="?" method="post" enctype="application/x-www-form-urlencoded">
        <input name="say" value="Hi">
        <button>Send my application/x-www-form-urlencoded greetings</button>
    </form>
    
    <form action="?" method="post"  enctype="multipart/form-data">
        <input name="say" value="Hi">
        <button>Send my multipart/form-data greetings</button>
    </form>
    
    <form action="?" method="post" enctype="text/plain"><!-- not working -->
        <input name="say" value="Hi">
        <button>Send my text/plain greetings</button>
    </form>
    

    `

    更多信息: method="post" enctype="text/plain" are not compatible?

        24
  •  0
  •   Pang Ajmal PraveeN    8 年前

    Access denied with code 500 (phase 2). Pattern match "((select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|describe)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]|UNION SELECT.*\'.*\'.*,[0-9].*INTO.*FROM)" at REQUEST_BODY. [file "/usr/local/apache/conf/modsec2.user.conf"] [line "345"] [id "300013"] [rev "1"] [msg "Generic SQL injection protection"] [severity "CRITICAL"]
    

    一旦我删除我的mod安全配置进行测试,一切都按预期工作。现在我只需要修改我的规则,以保持安全,但足够灵活,以满足我的需要:

        25
  •  0
  •   Frank Hsieh    7 年前

    请确保使用name=“ 你的变量名

    我错误地使用了id=” 你的变量名 ".

    我花了很多时间去抓虫子。

        26
  •  0
  •   β.εηοιτ.βε grigorevp    6 年前

    确保 name 定义了每个字段的属性。

    这将在PHP上创建一个空的POST

    <input type="text" id="Phone">
    

    但是,这会奏效的

    <input type="text" name="Phone" id="Phone">
    
        27
  •  -1
  •   Mahmoud Elgabry    8 年前

    好吧,我想我应该把我的案子放在这里。。。。在特定情况下我把post数组弄空了。。表单工作得很好,但有时用户抱怨他们点击了提交按钮,什么也没发生。。。。。 经过一段时间的挖掘,我发现我的托管公司有一个安全模块,可以检查用户的输入,如果发现,可以清除整个post数组(不仅是恶意数据)。在我的例子中,一位数学老师试图输入公式:dy+dx+0=0;数据被完全擦除。

    为了解决这个问题,我建议他现在将文本区域中的数据输入为dy+dx+0=0,现在它可以工作了。。。。这样可以节省一些时间。。

    推荐文章