神秘的に空の$ _POST配列


21

次のHTML / PHPページがあります。

<?php
if(empty($_SERVER['CONTENT_TYPE'])) {
    $type = "application/x-www-form-urlencoded";
    $_SERVER['CONTENT_TYPE'] = $type;
}

echo "<pre>";
var_dump($_POST);
var_dump(file_get_contents("php://input"));
echo "</pre>";
?>

<form method="post" action="test.php">
<input type="text" name="test[1]" />
<input type="text" name="test[2]" />
<input type="text" name="test[3]" />
<input type="submit" name="action" value="Go" />
</form>

ご覧のとおり、フォームは送信され、期待される出力は、値が入力された1つの配列と、値が「Go」(ボタン)のエントリ「action」を含むPOST配列です。ただし、フィールドに入力する値に関係なく、結果は常に:

array(2) {
  ["test"]=>
  string(0) ""
  ["action"]=>
  string(2) "Go"
}
string(16) "test=&action=Go&"

どういうわけか、testという名前の配列は空になり、 "action"変数がそれを通過します。

FirefoxのLive HTTP Headers拡張機能を使用して、POSTフィールドが送信されるかどうかを確認しました。ライブHTTPヘッダーからの関連情報(テキストボックスに値として入力されたa、b、c):

Content-Type: application/x-www-form-urlencoded
Content-Length: 51
test%5B1%5D=a&test%5B2%5D=b&test%5B3%5D=c&action=Go

なぜこれが起こっているのか誰にも分かりませんか?私はこれに驚いています、すでに時間がかかりました...

更新:

さまざまなサーバー、Windowsボックス、PHPバージョン5.2.4(Suhosinを使用)のUbuntuサーバーでこれを試しましたが、機能しません。また、Ubuntuと同じPHPバージョン、Suhosinがインストールされている別のサーバーでも動作します。

2つのファイルを比較しました。これは出力(diff php.ini phps.ini)です。

270c270
< memory_limit = 32M
---
> memory_limit = 16M      ; Maximum amount of memory a script may consume (16MB)
415c415
< variables_order = "EGCSP"
---
> variables_order = "EGPCS"
491d490
< include_path = ".:"
1253a1253,1254
> extension=mcrypt.so
>

このphps.iniは、それが機能するサーバーのものであり、php.iniは現在のものです。ここには問題がないように見えますよね?


4
スホシンかもしれません。
Col.シュラプネル

ええ、スホシンは有望な候補のように聞こえます
-SeanJA

さらに情報を提供できますか?Suhosinはサーバーにインストールされていますが、オフにする必要がありますか?設定を変更する必要がありますか?
rael_kid

3
これを試してください。それがシホシンの問題であればログに記録します。 hardened-php.net/suhosin/configuration.html#suhosin.simulation

シミュレーションモードをオンにしてみました。アレイはまだ空です。ただし、ログファイルが見つからないようです
...-rael_kid

回答:


2

明示的なインデックスなしでも機能しますか?試してください:

<form method="post" action="test.php">
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="submit" name="action" value="Go" />
</form>

いいえ、機能しません。
rael_kid

テスト配列のインデックスを設定しないでください-POST変数の検出を台無しにします
-adam

2
さて、私はそれらを省くことができます。しかし、それは私の問題を解決しません。
rael_kid

2

post配列が空になる理由はいくつか考えられます-人/開発者エラーに戻る可能性があります。PHP 5.2から5.4にアップグレードするときにこの正確な問題を経験しました。それは簡単でしたが、バグを見つけるのに何時間もトラブルシューティングが必要でした。config.phpファイルには、$ _ POST配列を処理するための以下のステートメントがありました。

if (!get_magic_quotes_gpc()) {
    if (isset($_POST)) {
        foreach ($_POST as $key => $value) {
            $_POST[$key] =  trim(addslashes($value));
        }
    }

マジッククオートはかつて有効でした。バージョン5.2までのPHPでは上記は正常に機能しましたが、バージョン5.2以上では処理されず、空の配列が返されます。

error_reporting()スイッチをオンにしていない場合は、オンにすることをお勧めします。問題をトラブルシューティングできると確信しています。

また、「magic_quotes」などの廃止されたシステム機能を確認する必要があります。使用すると、結果が返されないだけです。これがお役に立てば幸いです。幸運を祈ります。JCS :)


1

PHPのバグトラッカーには、この問題または同様の問題に関するバグ報告があります。

残念ながら、解決策については言及していませんが、別のCONTENT_TYPEを設定することも、コンテンツタイプをまったく設定しないこともできます。


これらのバグは似ていますが、私のバグと同じではありません。content-typeを設定してみました(元の回答のコードスニペットをご覧ください)。content-typeをまったく設定しない場合も機能しません
...-rael_kid

1

同様の問題がありました。まあ、まず第一に、この投稿に到達するのにかなり時間がかかりました。問題の名前を把握するために、PHPコンソールをインストールし、その使用方法を把握する必要がありました。私が何も知らなかったコードをデバッグします。問題の根本を突き止めて、まだ困惑している。

ソリューションは実際には非常に簡単でした。ChromeでF12キーを押して開発者ツールにアクセスし、[ネットワーク]を選択して、フォームを投稿してみてください。ポストリクエストをトレースし、ステータスを確認します。301(または200以外)の場合-最近まで私が抱えていたのとまったく同じ問題を抱えています!

私の新しいホストプロバイダーはhttp://my_site.comhttp://www.my_site.comにリダイレクトしていました私がしなければならなかったのは、CMSの一部としていくつかの設定を変更することだけです

$Configuration['BASE_URL'] = 'http://my_site.com'

$Configuration['BASE_URL'] = 'http://www.my_site.com'

そして出来上がり、魔法と虹とユニコーンと私のサイトがついに機能しました!

PSホスティング設定でのMessingも問題を解決する可能性があります...もしあなたの問題が私のものと似ているなら...


畜生。リダイレクトも私の問題でした!
アマンアラム

0

わからないけど

name="test[1]"

などはphpを混乱させる可能性があります。入力名をtest_1、test_2に変更して、何が起こるかを確認します。


7
@haavee:いいえ、PHPはこの使用法を宣伝しています:php.net/manual/en/faq.html.php#faq.html.arrays
Boldewyn

私はこれを試しましたが、その方法で変数は機能しますが、配列にはありません。
rael_kid

@haavee:いや、表記法はPHPを混乱させません。PHP+フォームの標準的な使用法です。Boldewynのリンクを参照してください。:)

わかりました!今日何か新しいことを学びました。

1
@adam:「特定のキーを配列に割り当てることもできます」。

0

基本PHPでは、これを壊す可能性のある設定オプションは1つしか考えられませんpost_max_size。したがって、php.iniと関連ファイルをチェックして、この値が正気であり、ゼロまたはアルファベット文字のような無効な値に設定されていないことを確認してください。

Suhosinを使用すると、配列の長さや変数名の長さなど、さまざまな条件でポスト変数をブロックできます。'suhosin'のphp.iniファイルをGrepして、特に 'suhosin.post'で始まる設定が存在するかどうかを確認します。(私が考えているパラメーターの詳細については、http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depthを参照してください。)

残念なことに、何らかの値を1または0に設定する構成での大きな混乱を除けば、コード(および変数)は十分に短いので、これは大したことではありません。それが空白になった場合、私の次の提案は、ApacheとPHPの設定をバックアップし、それらのディレクトリを削除し、パッケージをパージし、再インストールし、コードが再び動作しなくなるまで設定チャンクを元に戻すことです(または、そのサーバーの更新を開始します)それは両方とも壊れるまで、機能していないサーバーからの設定で動作しています)。同じOSのPHPサーバーが正常に動作しているため、これはほぼ間違いなく誤動作しているサーバーの設定エラーですが、検索するのはかなり大きな干し草です。

これを開始する前に、/ etcのバージョン管理を強くお勧めします-etckeeperパッケージを調べてください。(実際には、その使用期間をお勧めします。特に複数の人がルートアクセス権を持つマシンでは、主要な健全性セーバーです。)


私のpost_max_sizeは8Mです。これで十分だと思います。私のphp.iniにはsuhosinを含むエントリが含まれていないため、問題になる可能性があります... suhosinには独自のconfファイルがありますか?
rael_kid

デフォルトではなく、PHPモジュールの設定は、Debianシステムの/etc/php5/conf.dにある任意のファイルで設定できるため、Ubuntuシステムも想定しています。私が言ったように、これは長いショットのようなものでした。それでも、私は各設定ファイルを動作中のシステムと比較することから始めます。
Zed

0

Debianを「安定版」から「テスト版」にアップグレードしてから、フォーム送信がどこでも失敗しています。apache2またはphp5は同じ名前の提出物の複数のアイテムを処理していないようです。例えば; フォームには「mo」という名前の2つの入力があります。過去には、「mo」の値の1つだけが通過していました。重複キーが最初に発生した後、フォームはすべてのデータをドロップするようになりました。まだ分​​からない。まだ解明しようとしています。


0

動作するサーバーからphp.iniをコピーしてみてください(ただし、動作していないサーバーのphp.iniを最初にバックアップしてください)。もしそうなら、それはそこにあるものです(たぶん、variables_order、またはおそらくメモリ、どちらもありそうもない)。


0

送信ボタンの名前をアクション以外に変更してみてください。過去にこれに関していくつかの問題がありました。「アクション」という名前の入力があることが問題のようです。


0

以下はあなたを助けるべきではありません。PHP構成について知っているすべてのものに反するものです。

< variables_order = "EGCSP"
---
> variables_order = "EGPCS"

これは私に飛びつきました。スーパーグローバルはさまざまな順序で登録されています。これは問題にregister_globalsなりません。使用しておらず、依存していないので、順序変数が処理される順序を変更しても問題にならないからです。

ただし、確実に試して変数の順序を変更する必要があります。


0

そのOPでさえかなり古いですが、今日私は同様の問題に遭遇しました。

数百万ものさまざまなものを何度もチェックした後、最終的にPHPデフォルト設定のcPanelでPHP 5.6.17バージョンに更新した後、httpが選択されていないことがわかりました。ここに画像の説明を入力してください

そして、それを選択済みに設定した後、すべてが通常に戻ります:-)

ここに画像の説明を入力してください

将来の読者に役立つことを願っています


0

これが他の誰かを助けることができるなら...私は同様の問題を修正するために何時間も費やし、問題はphp.iniのmax_input_vars = "1000"制限でした。upload_max_filesize、post_max_size、max_input_varsのphp.ini値を必ず確認してください。1つを超えると、空の$ _POST配列になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.