Kosongkan array $ _POST kosong

21

Saya memiliki halaman HTML / PHP berikut:

<?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>

Seperti yang Anda lihat, formulir akan dikirimkan dan output yang diharapkan adalah array POST dengan satu array di dalamnya yang berisi nilai yang diisi dan satu entri "tindakan" dengan nilai "Go" (tombol). Namun, tidak peduli nilai apa yang saya masukkan di bidang; hasilnya selalu:

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

Entah bagaimana, array bernama test dikosongkan, variabel "action" berhasil melewatinya.

Saya telah menggunakan ekstensi Header HTTP Langsung untuk Firefox untuk memeriksa apakah bidang POST dikirimkan, dan memang benar. Informasi yang relevan dari Header HTTP Langsung (dengan a, b dan c diisi sebagai nilai dalam kotak teks):

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

Adakah yang tahu mengapa ini terjadi? Aku takut yang satu ini, sudah menghabiskan banyak waktu bagiku ...

Memperbarui:

Kami sudah mencoba ini pada server yang berbeda, pada kotak Windows tidak berfungsi, pada server Ubuntu dengan PHP versi 5.2.4 (dengan Suhosin), tidak. Ia bahkan bekerja pada server yang berbeda, juga dengan Ubuntu dan versi PHP yang sama, juga dengan Suhosin yang diinstal.

Saya telah membedakan dua file, ini adalah output ( 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
>

Dalam phps.ini ini adalah yang dari server tempat ia bekerja dan php.ini adalah yang saat ini. Sepertinya tidak ada masalah di sini, kan?

rael_kid
sumber
4
Suhosin mungkin.
Kolonel Shrapnel
Ya, suhosin terdengar seperti kandidat yang mungkin
SeanJA
Bisakah Anda memberikan lebih banyak info? Suhosin diinstal pada server, haruskah saya mematikannya? Haruskah saya mengubah pengaturan?
rael_kid
3
Coba ini, ini akan masuk jika masalah sihosin. hardened-php.net/suhosin/configuration.html#suhosin.simulation
Saya mencoba menyalakan mode simulasi. Array masih dikosongkan. Namun saya tidak dapat menemukan file log ...
rael_kid

Jawaban:

2

Apakah itu berfungsi tanpa indeks eksplisit? Mencoba:

<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>
Matthew Groves
sumber
Tidak, tidak berhasil juga.
rael_kid
Jangan mengatur indeks untuk array tes - mereka mengacaukan deteksi variabel POST
adam
2
Oke, saya bisa meninggalkan mereka. Tapi itu tidak menyelesaikan masalah saya.
rael_kid
2

Ada sejumlah alasan yang memungkinkan mengapa larik posting bisa kosong - kemungkinan hal itu kembali ke kesalahan manusia / pengembang. Saya mengalami masalah persis ini ketika meningkatkan dari PHP 5.2 ke 5.4, itu sederhana tetapi butuh berjam-jam pemecahan masalah untuk menemukan bug. Dalam file config.php kami, kami memiliki pernyataan di bawah ini untuk memproses array $ _POST:

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

Kutipan ajaib pernah aktif, dan dalam versi PHP hingga 5.2 di atas berfungsi dengan baik tetapi apa pun di atas versi 5.2 itu tidak akan diproses dan array kosong dikembalikan.

Jika Anda belum error_reporting()mengaktifkannya, saya sarankan Anda melakukannya dan saya yakin Anda dapat memecahkan masalah tersebut.

Anda juga harus memeriksa fitur sistem yang sudah usang, seperti " magic_quotes" karena menggunakannya " " gagal mengembalikan hasil. Saya harap ini membantu. Semoga berhasil. JCS :)

pengguna1360528
sumber
1

Ada laporan bug tentang ini atau masalah serupa di bugtracker PHP:

Sayangnya itu tidak menyebutkan solusi, tetapi Anda dapat mencoba untuk mengatur CONTENT_TYPE lain atau tanpa tipe konten sama sekali.

Joseph
sumber
Bug ini mirip, tetapi tidak sama dengan bug saya. Saya memang mencoba mengatur tipe konten (seperti yang dapat Anda lihat dalam cuplikan kode dalam jawaban asli saya). Jika saya tidak menetapkan tipe konten sama sekali, itu juga tidak berfungsi ...
rael_kid
1

Punya masalah yang sangat mirip. Yah, pertama-tama butuh waktu cukup lama untuk sampai ke pos ini. Untuk mengetahui nama masalah saya, saya harus menginstal konsol PHP, mencari tahu cara menggunakannya. Debug kode yang saya tidak tahu tentang. Dapatkan ke akar masalah dan masih bingung.

Solusinya sebenarnya cukup sederhana. Di Chrome, tekan F12 untuk sampai ke alat pengembang, pilih Jaringan, coba posting formulir Anda. Lacak permintaan posting, lihat statusnya. Jika itu 301 (atau apa pun selain 200) - Anda mengalami masalah yang sama persis yang saya alami sampai saat ini!

Penyedia host baru saya mengalihkan http://my_site.com ke http://www.my_site.com , yang harus saya lakukan adalah mengubah beberapa pengaturan sebagai bagian dari CMS saya (milik Anda mungkin berbeda tetapi serupa) dari

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

untuk

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

Dan voila, keajaiban dan pelangi dan unicorn dan situs saya akhirnya bekerja!

PS Messing dengan pengaturan hosting Anda mungkin juga memecahkan masalah Anda ... Jika masalah Anda mirip dengan milik saya tentu saja ...

Barmaley
sumber
Sial. Pengalihan adalah masalah saya juga!
Aman Alam
0

Saya tidak yakin tetapi memiliki

name="test[1]"

dll. dapat membingungkan php. Saya akan mengubah nama input menjadi test_1, test_2 dan lihat apa yang terjadi.


sumber
7
@haavee: Tidak, PHP mengiklankan penggunaan ini: php.net/manual/en/faq.html.php#faq.html.arrays
Boldewyn
Saya sudah mencoba ini, dengan cara itu variabel berfungsi, tetapi mereka tidak dalam array.
rael_kid
@ Haavee: Nah, notasi itu tidak membingungkan PHP, itu standar penggunaan bentuk PHP +. Lihat tautan Boldewyn. :)
oke terima kasih! belajar sesuatu yang baru hari ini.
1
@adam: "Dimungkinkan juga untuk menetapkan kunci spesifik ke array Anda".
0

Dalam PHP dasar, saya hanya dapat memikirkan satu opsi konfigurasi yang dapat memecahkan ini, yaitu post_max_size, jadi periksa php.ini Anda dan file terkait untuk memastikan bahwa nilai ini waras dan tidak disetel ke nol atau nilai yang tidak valid seperti karakter alfabet. .

Suhosin memungkinkan untuk memblokir variabel posting pada berbagai kondisi, termasuk hal-hal seperti panjang array dan panjang nama variabel. Grep file php.ini Anda untuk 'suhosin' untuk melihat apakah ada pengaturan, terutama apa pun yang dimulai dengan 'suhosin.post'. (Lihat http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depth untuk detail lebih lanjut tentang parameter yang saya pikirkan.)

Sayangnya, kecuali ada kesalahan besar dalam konfigurasi yang menetapkan beberapa nilai menjadi satu atau nol, kode Anda (dan variabel) cukup pendek sehingga ini merupakan pukulan panjang. Jika itu muncul kosong, saran saya berikutnya adalah membuat cadangan konfigurasi Apache dan PHP Anda, menghapus direktori mereka, membersihkan paket-paket, menginstal ulang, dan mulai meletakkan potongan konfigurasi kembali ke tempatnya sampai kode berhenti bekerja lagi (secara bergantian, mulai memperbarui server itu itu bekerja dengan konfigurasi dari server yang tidak berfungsi sampai keduanya rusak). Karena Anda memiliki server yang sama-OS-sama-PHP bekerja dengan benar, ini hampir pasti merupakan kesalahan konfigurasi pada server yang tidak berfungsi di suatu tempat, tapi itu tumpukan jerami yang cukup besar untuk dicari.

Kontrol versi / etc sangat disarankan sebelum Anda memulai ini - lihat paket etckeeper. (Sebenarnya, saya merekomendasikan penggunaannya, titik. Penghemat kewarasan utama, terutama pada mesin di mana lebih dari satu orang memiliki akses root.)

Zed
sumber
Post_max_size saya adalah 8M, saya pikir itu sudah cukup. Php.ini saya tidak mengandung entri dengan suhosin di dalamnya, jadi itu mungkin menjadi masalah ... Apakah suhosin punya file konfigurasi sendiri?
rael_kid
Tidak secara default, tetapi pengaturan untuk modul PHP apa pun dapat diatur oleh file apa pun di /etc/php5/conf.d pada sistem Debian, dan dengan demikian saya juga menganggap sistem Ubuntu. Seperti yang saya katakan, ini adalah sesuatu yang sulit. Namun, saya akan mulai dengan membedakan setiap file konfigurasi dengan sistem yang berfungsi
Zed
0

Saya mengalami kegagalan pengiriman formulir di semua tempat karena saya memutakhirkan ke "pengujian" dari Debian dari "stabil". Tampaknya apache2 atau php5 tidak menangani banyak item dalam pengiriman dengan nama yang sama. Sebagai contoh; formulir Anda memiliki dua input nama "mo". Di masa lalu hanya satu dari nilai-nilai untuk "mo" yang akan berhasil. Sekarang formulir tersebut sepertinya akan menghapus semua data setelah kemunculan duplikat kunci yang pertama. Belum yakin. Masih berusaha mencari tahu.


sumber
0

Coba salin php.ini dari server yang berfungsi untuk yang satu ini (backup dulu php.ini server yang tidak berfungsi). Jika ya, itu adalah sesuatu di sana (mungkin variable_order, atau mungkin memori, keduanya tidak mungkin).

gravyface
sumber
0

Coba ganti nama tombol kirim Anda ke sesuatu selain tindakan. Saya punya beberapa masalah dengan ini di masa lalu. Memiliki input bernama 'action' tampaknya menjadi masalah.


sumber
0

Berikut ini TIDAK boleh membantu Anda. Itu bertentangan dengan semua yang saya ketahui tentang Konfigurasi PHP:

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

Yang ini melompat pada saya. Superglobals Anda terdaftar di berbagai pesanan. Ini seharusnya tidak menjadi masalah karena karena Anda tidak menggunakan register_globalsdan tidak bergantung pada mereka itu seharusnya tidak menjadi masalah untuk mengubah urutan variabel pesanan sedang diproses.

Tetapi Anda harus mencobanya dan mengubah urutan variabel secara definitif.

cepat
sumber
0

Bahkan OP itu sudah cukup tua, tetapi hari ini saya menghadapi masalah yang sama.

Setelah menghabiskan beberapa jam memeriksa jutaan hal yang berbeda berulang-ulang, akhirnya menemukan bahwa setelah pembaruan terakhir ke versi PHP 5.6.17 di cPanel kami di pengaturan default PHP http tidak dipilih.masukkan deskripsi gambar di sini

Dan setelah mengaturnya untuk dipilih - semuanya kembali normal :-)

masukkan deskripsi gambar di sini

Semoga ini akan membantu pembaca di masa depan

Nikita Kurtin
sumber
0

Jika ini dapat membantu orang lain ... Saya hanya menghabiskan waktu berjam-jam untuk memperbaiki masalah yang sama dan masalahnya adalah batas max_input_vars = "1000" dari php.ini. Pastikan untuk memeriksa nilai php.ini dari upload_max_filesize, post_max_size dan max_input_vars. Melebihi satu akan menghasilkan dengan array $ _POST kosong.

Chris L.
sumber