フォームの送信時にphp $ _POST配列が空


99

私が開発したカスタムCMSがあり、開発ボックス(Ubuntu / PHP5 + / MySQL5 +)で完全に動作します。

私はそれをクライアントのプロダクションボックスに移動したところ、すべてのフォーム送信が空の$ _POST配列として表示されています。

私はデータが実際に使用されて渡されていることを確認するトリックを見つけましたfile_get_contents('php://input');、そしてデータはそこでうまく表示されます- $_POST/ $_REQUEST配列は常に空です。

また、firebug(application/x-www-form-urlencoded; charset=utf-8)を使用して、コンテンツタイプヘッダーが正しいことも確認しました。

この問題は、フォームがAJAX経由で送信されるのか、通常のフォーム送信で送信されるのかに関係なく発生します。

どんな助けでも大歓迎です!

php  arrays  forms  post 

post_max_sizeを確認します。値は8MBではなく8Mに設定する必要があります。最新のケースではエラーは表示されませんが、$ _ POSTサイズは0に設定されます
セルゲイカルポフ

回答:


185

この質問はフォームを介したPOSTに関するものでしたが、JSON content-typeを使用してPOSTするときの同様の問題の回答を探してここに来ました。答えを見つけ、それは私に多くの時間を費やしたのでそれを共有したいと思いました。

JSON content-typeを使用する場合、$ _ POST配列は入力されません(私が信じているマルチパートフォームでのみ)

問題を修正するために何が機能したかを次に示します。

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

これが誰かを助けることを願っています!


この回避策は理にかなっています-それは私のバッチ更新コントローラーを修正しました:)
Martin Zeitler

2
もう1つの方法は、Content-Typeヘッダーをに変更してからapplication/x-www-form-urlencoded、でデータをシリアル化すること$.param(dataObject)です。それは役立つはずです。
ŁukaszBachman

1
@ŁukaszBachmanデータオブジェクトが........のようなものがある場合はそれを行う方法title=something&body=anything。タイトルと本文のベールが欲しい。$ dataobject ["title"]は空を返します。私の場合、$ _ POSTは空です。また、jsonエンコードされていないことを除いて、file_get_contents( "php:// input")を使用して取得する唯一の方法です。
Khurshid Alam、2015

これは非常に便利です。奇妙なことに、開発マシンでJsonを送信するのに問題はありませんが、実稼働マシンでは問題ありません。
Simon H


86

これは別の考えられる原因です。私のフォームがWWWなしでdomain.comに送信されていました。「WWW」を追加する自動リダイレクトを設定しました。$ _POST配列がプロセスで空になりました。だからそれを修正するために私がしなければならなかったすべてはwww.domain.comに提出することでした


24
私のURLの書き換えは、htaccessPOSTが機能しない原因でした。私はすべてのURLに自動的にスラッシュを追加していましたが、ACTIONとしてコードではスラッシュなしのURLを使用していました。私は.htaccessをチェックするつもりはなかったので、あなたの答えは役に立ちました。+1
binar

Godaddyを使用したドメインフォワーディング(マスキングあり)を使用していましたが、これが問題の原因であるようです。ありがとう!
Chris Prince、

1
私にも同様の問題がありました。それは私の.htaccessファイルからのものでした。それは.phpURLから拡張子を取り除いていたので、私のフォームはPOST拡張子の付いたURL に変換されていました。
EmanuelVintilă2016

25

同様の問題がありました。簡単な修正であることが判明しました。私が持っていた形で

<form action = "directory" method = "post">

ここで、directoryは...の名前でした。私のPOSTアレイは完全に空でした。ブラウザでURLを見ると、末尾にスラッシュが付いています。

アクションの最後にスラッシュを追加するとうまくいきました-

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

$ _POST配列が再びいっぱいになりました!


1
これは修正すべきではありません。たとえば、適切なルーティングシステムがあり、これに失敗したCakePHPの場合(これはCakeが失敗したという意味ではありません)、おそらくこの問題へのアプローチはフレームワークや.phpファイルではありません。しかし、Apacheの設定によっては、この問題についてさらに調査したいと思います。なかなか面白いです。
ジェームズ

同様に、私はOPと同じ問題を抱えていましたが、<form>タグにname属性がなく、IEでのみ問題でした。
jkt123

13

php.iniで次のことを確認してください。

  • track_vars (非常に古いバージョンのPHPでのみ使用可能)は On
  • variables_order 手紙が含まれています P
  • post_max_size 適切な値に設定されている(例:8 MB)
  • (suhosinパッチを使用している場合)suhosin.post.max_varsと、suhosin.request.max_vars十分な大きさです。

私の2番目の提案があなたの問題を解決すると思います。


1
MrMageに感謝します。洞察に感謝し、それらのini設定をチェックして、うまくいったかどうかをお知らせします。ありがとう!

1
「post_max_size」設定は私のショートッパーです。フォームの送信中に大きなファイルをアップロードしていたため、この設定に含まれる値が少なくなりました。フォームを送信すると、空の投稿配列が表示されます。
shasi kanth 2012

post_max_sizeがうまくいった
Ahmed Ismail

9

HTTPからHTTPSに投稿$_POSTすると、空が表示されることがわかりました。これはフォームのテスト中に発生しましたが、気付くまでしばらく時間がかかりました。


5

私は似たような少し異なる問題に遭遇し、問題を理解するのに2日かかりました。

  • 私の場合もPOST配列は空でした。

  • 次に、file_get_contents( 'php:// input');でチェックします。そしてそれも空でした。

その後、POST送信後に読み込まれたページを更新すると、ブラウザがフォームデータの再送信の確認を求めていなかったことがわかりました。さわやかなページでした。しかし、フォームのURLを別のURLに変更すると、POSTが適切に渡され、ページを更新しようとしたときにデータを再送信するように求められました。

次に、実際のURLの問題点を確認しました。URLに問題はありませんでしたが、URLにindex.phpがないフォルダーを指しており、index.phpでPOSTをチェックしていました。

ここで、/から/index.phpへのリダイレクトが原因でPOSTデータが失われ、URLにindex.phpを追加してURLをテストしたことを疑っています。

それは働いた。

ここに投稿して、誰かが役立つと思うようにしてください。


1
同じ問題がありましたが、URLの末尾に「/」がなければ、$ _REQUESTには何も存在しませんが、「/」または「/index.php」では、投稿されたすべてのデータが$ _REQUESTに存在します。それは私のnginx設定か何か他のものかもしれません!
MohaMad 2017年

4

この時点で洗練された解決策はありませんが、この問題に遭遇した他の人の将来の参考のために私の発見を共有したいと思いました。問題の原因は、.htaccessファイルの2つのオーバーライドされたphp値です。これらの2つの値を単に追加して、ファイルアップロードのファイルサイズ制限をデフォルトの8 MBからより大きなものに増やしました-htaccessファイルにこれらの2つの値があると、デフォルトよりも大きいか小さいかにかかわらず、問題が発生することがわかりました。

php_value post_max_size xxMB
php_value upload_max_filesize xxMB

すべてのsuhosin.post.xxx/suhosin.upload.xxx変数の制限を引き上げることを期待して、変数を追加しましたが、残念ながら、これらの問題はこの問題に影響を与えませんでした。

要約すると、ここで「なぜ」を実際に説明することはできませんが、根本的な原因を特定しました。私の考えでは、これは最終的にはスホシン/ htaccessの問題ですが、残念ながら、上記の2つのphpでオーバーライドされた値を削除する以外に解決できなかった問題です。

私がこれを理解するために数時間を殺したので、これが将来誰かを助けることを願っています。これを手伝ってくれてありがとう(MrMage、Andrew)


特に問題がサーバーのセットアップ/ htaccessにある場合は、Serverfaultでこの質問をする価値があります。
デビッドはモニカを

5
私が間違っていない場合、サイズは「xxMB」ではなく「xxM」のように指定する必要があるので、それが何か関係があるのではないかと思います...
JC Inacio

4

デフォルトは「text / plain」なので、enctype = "application / x-www-form-urlencoded"を使用して問題を解決できます。$ DATAをチェックインするとき、セパレーターは「text / plain」のスペースであり、「urlencoded」の特殊文字です。

親切にフランク


4

持つenable_post_data_reading設定無効にすると、この原因となります。ドキュメントによると:

enable_post_data_reading

このオプションを無効にすると、$ _ POSTおよび$ _FILESが入力されなくなります。postdataを読み取る唯一の方法は、php:// inputストリームラッパーを使用することです。これは、リクエストをプロキシするか、メモリ効率の良い方法でPOSTデータを処理するのに役立ちます。


4

/api/index.phpなどのディレクトリにあるindex.phpファイルに投稿する場合は、フォームでファイルの完全なディレクトリを指定してください。

この

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

または

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

動作します。

しかし、これは失敗します

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

私は実際には正反対です。私はそれ/my_uriがうまくいくが、うまくいかないことを発見しました/my_uri/
Link14

同じ問題がありました。apacheまたはnginxが/ apiから/ api /へのリダイレクトを追加するようです
John Smith

4
<form action="test.php" method="post">
                        ^^^^^^^^^^^^^

さて、これは愚かだったので私は公の場で恥ずかしい思いをしますが、PHPで何かの小さなテストスクリプトを作成しました。$_POST配列が空の場合、StackOverflowが最初に検索した場所であり、必要な答えが見つかりませんでした。 。

私は書いただけだった

<form action="test.php">

メソッドを指定するのを忘れたPOST

きっと誰かがこっそりするでしょうが、これが同じことをする他の誰かを助けるなら、私は気にしません!私たちは時々それを行います!


信じられない 私は新しいサーバーを試してみて、それが構成によるものだと思った...とにかく、リマインダーをありがとう!
サミュエルアイアラフェレイラ

4

私の場合、HTTPからHTTPSに投稿すると、$ _ POSTが空になります。問題は、フォームに//example.comのようなアクションがあったことです。URLをhttps://example.comに修正すると、問題が消えました。


1
サーバーのセットアップ方法に関連していると思います。GoDaddyをホストとして使用しても同じ問題が発生します。このソリューションは問題を解決しませんでした。
acarlstein

この解決策は私の問題を解決しました。私は素晴らしい頭痛がしました。
gokaysatir

3

ここで同じ問題!

私は郵便配達員のポストリクエストを介してローカルサーバーコードに接続しようとしていました、そしてこの問題はたくさんの時間を無駄にしました!

ローカルプロジェクト(postmanなど)を使用するユーザー向け:「localhost」キーワードの代わりに、IPv4アドレス(cmdにipconfigと入力)を使用します。私の場合:

前:

localhost/app/login

後:

192.168.1.101/app/login

Postmanは、引用符またはスペースが含まれるスクレイピングされたjson値に関するいくつかの問題を私に与えました。特定の形式を想定しています。
トムアンダーソン、

2

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

POSTメソッド

リクエストを送信するときに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メソッドでは、パラメーターはNULL値になります。ただし、POSTメソッドでは、送信されるデータはsend関数の引数として送信されます。params変数は、2行目で次のように宣言されています。つまり、lorem=ipsum&name=binny「lorem」と「name」という2つのパラメーターをそれぞれ「ipsum」と「binny」という値で送信します。


1

私の場合は、jQueryを使用してフォームを送信する直前に、jQueryを使用してページ上のすべての入力を無効にしていたためです。そこで、「「非表示」タイプも含めてすべての入力を無効にする」を変更しました。

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

「「ボタン」タイプの入力のみを無効にする」:

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

これは、ユーザーが誤って「移動」ボタンを2回押してDBを起動しないようにするためです。'hidden'タイプのフォーム入力に 'disabled'属性を設定すると、フォームが送信された場合、それらの値は送信されないようです。


1

私にとって、.htaccessはmod_rewriteがインストールされていないときにリダイレクトしていました。mod_rewiteをインストールしてください。

具体的には:

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

実行していた。


1

同様の問題を修正するのに何時間も費やしました。私の場合の問題は、

max_input_vars = "1000"

デフォルトでは、php.ini。アップロードのない非常に大きなフォームがありました。php.iniは、upload_max_filesize = "100M"およびpost_max_size = "108M"に設定されていますが、私の場合は問題ありませんでした。PHPの動作は、フォームの変数が1000を超える場合のmax_input_varsと同じです。空の_POST配列が返されます。私はそれを1時間、そして数時間前に見つけられたらよかったのに。


1

私はこれが古いことを知っていますが、私の解決策を共有したいと思いました。

私の場合、PHPの最大アップロード制限を引き上げるために変数を追加したため、問題は.htaccessにありました。私のコードはこのようなものでした:

php_value post_max_size 50MB
php_value upload_max_filesize 50MB

後で、値がxxMBではなくxxMのようになっていることに気付きました。

php_value post_max_size 50M
php_value upload_max_filesize 50M

今、私の$ _POSTは以前と同じようにデータを返しました。これが将来の誰かを助けることを願っています。


0

MRMageの投稿に加えて:

この変数を設定して、いくつかの$_POST変数(1000項目を超える大きな配列)が表示されなくなるという問題を解決する必要がありました。

suhosin.request.max_vars = 2500

request」ではなく「post」が解決策でした...


0

最も便利な解決策ではないかもしれませんが、フォームaction属性をルートドメインに設定すると、index.phpにアクセスでき、ポストされた変数を取得できることがわかりました。ただし、書き換えたURLをアクションとして設定しても機能しません。


0

これは@icesarが言ったことに似ていますます。

しかし、私はにある私のapiにものを投稿しようとしましたが、それ自体に渡さsite/api/index.phpれるsite/apiため、に投稿するだけindex.phpです。しかし、これは、私$_POSTがその場で空になったので、明らかに何かがめちゃくちゃになる原因になります。site/api/index.php代わりに直接投稿するだけで解決しました。


0

私の問題は、HTML <base>タグを使用してテストサイトのベースURLを変更していたことでした。ヘッダーからそのタグを削除すると、$_POSTデータが戻ってきました。


0

私の場合(OVHミューチャライザサーバーの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"は互換性がありませんか?


0

Mod Securityから次のエラーが発生しました。

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セキュリティ構成を削除すると、すべて期待どおりに機能しました。安全性を保つためにルールを変更する必要がありますが、私のニーズに十分に柔軟です:)


0

入力タグでname = " your_variable_name " を使用していることを確認してください。

誤ってid = " your_variable_name "を使用しています。

私はバグを捕まえるために多くの時間を費やしました。


0

name各フィールドのプロパティが定義されていることを確認してください。

これにより、PHPで空のPOSTが作成されます

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

しかし、これはうまくいきます

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

サーバーのセットアップ方法に関連していると思います。GoDaddyをホストとして使用しても同じ問題が発生します。このソリューションは問題を解決しませんでした。
acarlstein

-1

わかりました、ここに自分のケースを入れるべきだと思いました....特定のケースでpost配列を空にしていました..フォームはうまく機能しますが、ユーザーが送信ボタンを押すと不平を言うことがあり、何も起こりません....しばらく調べてみたところ、ホスティング会社にセキュリティモジュールがあり、ユーザーの入力をチェックし、見つかった場合は(悪意のあるデータだけでなく)ポストアレイ全体をクリアすることがわかりました。私の例では、数学の先生が次の方程式を入力しようとしました。dy+ dx + 0 = 0; データは完全に消去されました。

これを修正するには、テキスト領域にdy + dx + 0 = 0としてデータを入力するようにアドバイスします。これで機能します。これにより、誰かの時間を節約できます。


5
欠陥のあるコードを考慮に入れるようにユーザーに要求することは、最初のことではありません。
freeworlder

それは実際には不完全なコードではありませんが、新しいホスティングプロバイダーを検討するかもしれません。または、HTML URLエンコーディングなど、別の形式で入力を投稿します。
トムアンダーソン、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.