php $ _POST array kosong pada saat pengiriman formulir

99

Saya memiliki CMS khusus yang saya buat yang berfungsi dengan sempurna di kotak dev saya (Ubuntu / PHP5 + / MySQL5 +).

Saya baru saja memindahkannya ke kotak produksi untuk klien saya dan sekarang semua pengiriman formulir muncul sebagai array $ _POST kosong.

Saya menemukan trik untuk memverifikasi bahwa data benar-benar sedang diteruskan menggunakan file_get_contents('php://input');dan data muncul dengan baik di sana - $_POST/ $_REQUESTarray selalu kosong.

Saya juga telah memverifikasi bahwa header jenis konten juga benar melalui firebug ( application/x-www-form-urlencoded; charset=utf-8).

Masalah ini terjadi terlepas dari apakah formulir dikirimkan melalui AJAX atau pengiriman formulir biasa.

Bantuan apa pun sangat dihargai!


sumber
Periksa post_max_size: nilai harus disetel sebagai 8M, bukan 8MB. Dalam kasus terbaru, Anda tidak akan melihat kesalahan apa pun, tetapi ukuran $ _POST akan disetel ke 0
Sergei Karpov

Jawaban:

186

Saya tahu pertanyaan ini tentang POST melalui Formulir, tetapi datang ke sini mencari jawaban untuk masalah serupa saat POSTING dengan tipe konten JSON. Menemukan jawabannya dan ingin membagikannya karena saya menghabiskan banyak waktu.

Saat menggunakan tipe konten JSON, array $ _POST tidak akan terisi (hanya dengan formulir multi-bagian yang saya percaya)

Inilah yang berhasil untuk memperbaiki masalah:

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

semoga ini membantu seseorang!

tiltem
sumber
Solusi ini masuk akal - memperbaiki pengontrol pembaruan batch saya :)
Martin Zeitler
2
Alternatif lain adalah mengubah Content-Typeheader menjadi application/x-www-form-urlencodeddan kemudian membuat serial data Anda dengan $.param(dataObject). Itu akan membantu.
ŁukaszBachman
1
@ ŁukaszBachman Cara melakukannya jika DataObject adalah sesuatu seperti ........ title=something&body=anything. Saya ingin mendapatkan vale of title & body. $ dataobject ["title"] kembali kosong. Dalam kasus saya $ _POST kosong. Dan satu-satunya cara untuk mendapatkannya menggunakan file_get_contents ("php: // input") ... kecuali bahwa itu tidak dikodekan json.
Khurshid Alam
Ini sangat berguna. Hal yang aneh adalah saya tidak mengalami masalah saat mengirim Json ke mesin pengembangan saya, tetapi saya mengerjakan yang produksi.
Simon H
86

Berikut kemungkinan penyebab lainnya - formulir saya dikirimkan ke domain.com tanpa WWW. dan saya telah menyiapkan pengalihan otomatis untuk menambahkan "WWW". Array $ _POST dikosongkan dalam proses. Jadi untuk memperbaikinya yang harus saya lakukan adalah mengirimkan ke www.domain.com


sumber
24
Sial, url yang ditulis ulang di saya htaccessadalah penyebab POST tidak berfungsi. Saya secara otomatis menambahkan garis miring ke semua url, tetapi dalam kode sebagai TINDAKAN saya menggunakan url tanpa garis miring. Jawaban Anda membantu, karena saya tidak pernah berpikir untuk memeriksa .htaccess. +1
binar
Saya memiliki penerusan domain (dengan masking) menggunakan GoDaddy, dan tampaknya inilah sumber masalahnya. Terima kasih!
Chris Prince
1
Saya juga mengalami masalah serupa, itu berasal dari .htaccessfile saya . Itu menghapus .phpekstensi dari URL, dan formulir saya POSTmenuju ke URL dengan ekstensi.
Emanuel Vintilă
25

Saya memiliki masalah serupa. Ternyata perbaikan sederhana. Dalam bentuk yang saya miliki

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

dimana direktori adalah nama dari ... direktori tersebut. Array POST saya benar-benar kosong. Saat saya melihat url di browser saya, itu ditampilkan dengan garis miring di bagian akhir.

Menambahkan garis miring ke akhir tindakan saya berhasil -

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

Array $ _POST saya penuh lagi!

Randy Kilwag
sumber
1
Ini seharusnya tidak menjadi perbaikan, misalnya pada CakePHP, yang memiliki sistem perutean yang baik, gagal dalam hal ini, (Saya tidak bermaksud Cake gagal), mungkin pendekatan untuk masalah ini bukanlah kerangka kerja atau file .php, tetapi beberapa konfigurasi pada apache, saya ingin melakukan penyelidikan lebih lanjut atas masalah ini. Cukup menarik.
Yakobus
Pada catatan serupa, saya memiliki masalah yang sama dengan OP, tetapi hanya jika <form>tag tidak memiliki nameatribut, dan hanya di IE.
jkt123
13

Pastikan, di php.ini:

  • track_vars (ini hanya tersedia pada versi PHP yang sangat lama) disetel ke On
  • variables_order berisi surat itu P
  • post_max_size diatur ke nilai yang wajar (mis. 8 MB)
  • (jika menggunakan patch suhosin) suhosin.post.max_varsdan suhosin.request.max_varsberukuran cukup besar.

Saya kira saran kedua saya akan menyelesaikan masalah Anda.

MrMage
sumber
1
Terima kasih MrMage, hargai wawasan Anda dan akan memeriksa pengaturan ini dan memberi tahu Anda jika itu berhasil. Terima kasih!
1
Setelan "post_max_size" adalah showstopper saya. Saya mengupload file besar selama pengiriman formulir, dan pengaturan ini mengandung nilai yang lebih rendah. Jadi saya mendapatkan larik posting kosong ketika saya mengirimkan formulir.
Shasi kanth
9

Saya telah menemukan bahwa ketika memposting dari HTTP ke HTTPS, $_POSTisinya kosong. Ini terjadi saat menguji formulir, tapi butuh beberapa saat sampai saya menyadarinya.

Marcos
sumber
5

Saya menemukan masalah yang serupa namun sedikit berbeda dan butuh waktu 2 hari untuk memahami masalahnya.

  • Dalam kasus saya, array POST juga kosong.

  • Kemudian diperiksa dengan file_get_contents ('php: // input'); dan itu juga kosong.

Kemudian saya menemukan bahwa browser tidak meminta konfirmasi untuk mengirim ulang data formulir setelah jika saya menyegarkan halaman yang dimuat setelah pengiriman POST. Itu langsung menyegarkan halaman. Tetapi ketika saya mengubah URL formulir ke yang berbeda, itu melewati POST dengan benar dan meminta pengiriman ulang data ketika mencoba menyegarkan halaman.

Kemudian saya memeriksa apa yang salah dengan URL sebenarnya. Tidak ada kesalahan dengan URL, namun itu menunjuk ke folder tanpa index.php di URL dan saya memeriksa POST di index.php.

Di sini saya meragukan pengalihan dari / ke /index.php menyebabkan data POST hilang dan URL yang diuji dengan menambahkan index.php ke URL.

Itu Berhasil.

Diposting di sini agar seseorang merasa terbantu.

GUIR
sumber
1
Saya mengalami masalah yang sama, tanpa '/' di akhir url, tidak ada apa pun di $ _REQUEST, tetapi dengan '/' atau '/index.php', semua data yang diposting ada di $ _REQUEST. Mungkin pengaturan nginx saya atau yang lainnya!
MohaMad
4

Tidak memiliki solusi yang elegan saat ini tetapi ingin membagikan temuan saya untuk referensi di masa mendatang bagi orang lain yang mengalami masalah ini. Sumber masalahnya adalah 2 nilai php yang diganti dalam file .htaccess. Saya baru saja menambahkan 2 nilai ini untuk meningkatkan batas ukuran file untuk unggahan file dari default 8MB menjadi sesuatu yang lebih besar - Saya mengamati bahwa hanya memiliki 2 nilai ini di file htaccess sama sekali, apakah lebih besar atau lebih kecil dari default, menyebabkan masalah .

php_value post_max_size xxMB
php_value upload_max_filesize xxMB

Saya menambahkan variabel tambahan untuk meningkatkan batas untuk semua vars suhosin.post.xxx/suhosin.upload.xxx tetapi sayangnya ini tidak berpengaruh pada masalah ini.

Singkatnya, saya tidak bisa menjelaskan "mengapa" di sini, tetapi telah mengidentifikasi akar penyebabnya. Perasaan saya adalah bahwa ini pada akhirnya adalah masalah suhosin / htaccess, tetapi sayangnya salah satu yang tidak dapat saya selesaikan selain menghapus 2 nilai yang diganti php di atas.

Semoga ini membantu seseorang di masa depan karena saya menghabiskan beberapa jam untuk mencari tahu. Terima kasih untuk semua yang meluangkan waktu untuk membantu saya dengan ini (MrMage, Andrew)


sumber
Mungkin ada baiknya menanyakan pertanyaan ini di Serverfault, terutama jika masalahnya terletak pada pengaturan server / htaccess.
David mengatakan mengembalikan Monica
5
Jika saya tidak salah, ukurannya harus ditentukan seperti 'xxM', dan bukan 'xxMB', jadi saya bertanya-tanya apakah itu mungkin ada hubungannya dengan itu ...
JC Inacio
4

Saya bisa memecahkan masalah menggunakan enctype = "application / x-www-form-urlencoded" karena defaultnya adalah "text / plain". Ketika Anda check in $ DATA, pemisahnya adalah spasi untuk "teks / biasa" dan karakter khusus untuk "urlencoded".

Salam Frank

RudeUrm
sumber
4

Menonaktifkan enable_post_data_readingpengaturan akan menyebabkan ini. Menurut dokumentasi:

enable_post_data_reading

Menonaktifkan opsi ini menyebabkan $ _POST dan $ _FILES tidak terisi. Satu-satunya cara untuk membaca postdata adalah melalui php: // input stream wrapper. Ini dapat berguna untuk permintaan proxy atau untuk memproses data POST dengan cara yang efisien memori.

Luke A. Leber
sumber
4

Jika Anda memposting ke file index.php dalam direktori misalnya /api/index.php pastikan dalam formulir Anda, Anda menentukan direktori lengkap ke file misalnya

Ini

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

ATAU

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

bekerja.

Tapi ini gagal

<form method="post" action="/api"> 
</form>
Minggu G Akinsete
sumber
Saya sebenarnya memiliki kebalikannya. Saya menemukan itu /my_uriakan berhasil tetapi tidak /my_uri/.
Link14
memiliki masalah yang sama. tampaknya apache atau nginx menambahkan pengalihan dari / api ke / api /
John Smith
4
<form action="test.php" method="post">
                        ^^^^^^^^^^^^^

Oke, ini bodoh dan saya akan mempermalukan diri sendiri di depan umum, tetapi saya membuat skrip pengujian kecil untuk sesuatu di PHP dan ketika $_POSTarray saya kosong, StackOverflow adalah tempat pertama yang saya lihat dan saya tidak menemukan jawaban yang saya butuhkan .

Saya hanya menulis

<form action="test.php">

dan lupa untuk menentukan metodenya POST!

Saya yakin seseorang akan terkekeh, tetapi jika ini membantu orang lain yang melakukan hal yang sama, maka saya tidak keberatan! Kita semua melakukannya dari waktu ke waktu!

Ivan
sumber
tidak percaya saya lupa itu juga! Saya hanya mencoba server baru, dan mengira itu adalah sesuatu karena konfigurasinya ... bagaimanapun, terima kasih atas pengingatnya!
Samuel Aiala Ferreira
4

Dalam kasus saya, saat memposting dari HTTP ke HTTPS, $ _POST kosong. Masalahnya, formulir tersebut memiliki tindakan seperti ini //example.com. Saat saya memperbaiki url ke https://example.com , masalahnya hilang.

Игорь Носков
sumber
1
Saya pikir ada sesuatu yang berhubungan dengan bagaimana server diatur. Saya mengalami masalah yang sama saat menggunakan GoDaddy sebagai host. Solusi ini tidak menyelesaikan masalah.
acarlstein
Solusi ini menyelesaikan masalah saya. Saya memiliki otak yang bagus.
gokaysatir
3

masalah yang sama di sini!

saya mencoba menyambung ke kode server lokal saya melalui permintaan pos di tukang pos, dan masalah ini membuang banyak waktu saya!

untuk siapa saja yang menggunakan proyek lokal (mis. tukang pos): gunakan alamat IPv4 Anda (ketik ipconfig di cmd) daripada kata kunci "localhost". dalam kasus saya:

sebelum:

localhost/app/login

setelah:

192.168.1.101/app/login
Ali Shariati
sumber
Tukang pos telah memberi saya beberapa masalah dengan nilai json bekas yang memiliki tanda kutip atau spasi. Ia mengharapkan format tertentu.
Tom Anderson
2

REFERENSI: http://www.openjs.com/articles/ajax_xmlhttp_using_post.php

Metode POST

Kami akan membuat beberapa modifikasi sehingga metode POST akan digunakan saat mengirim permintaan ...

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);

Beberapa header http harus disetel bersama dengan permintaan POST apa pun. Jadi kami mengaturnya di baris ini ...

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

Dengan baris di atas kita pada dasarnya mengatakan bahwa pengiriman data dalam format pengiriman formulir. Kami juga memberikan panjang parameter yang kami kirim.

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

Kami menetapkan penangan untuk peristiwa perubahan 'status siap'. Ini adalah penangan yang sama yang kami gunakan untuk metode GET. Anda dapat menggunakan http.responseText di sini - masukkan ke dalam div menggunakan innerHTML (AHAH), eval it (JSON), atau apa pun.

http.send(params);

Akhirnya, kami mengirim parameter dengan permintaan tersebut. Url yang diberikan dimuat hanya setelah baris ini dipanggil. Dalam metode GET, parameter akan menjadi nilai null. Namun pada metode POST, data yang akan dikirim akan dikirim sebagai argumen fungsi kirim. Variabel params dideklarasikan di baris kedua sebagai lorem=ipsum&name=binny- jadi kami mengirim dua parameter - 'lorem' dan 'name' dengan nilai 'ipsum' dan 'binny' masing-masing.

Chandu
sumber
1

Dalam kasus saya itu karena saya menggunakan jQuery untuk menonaktifkan semua input pada halaman sebelum menggunakan jQuery untuk mengirimkan formulir. Jadi saya mengubah "nonaktifkan setiap masukan bahkan jenis 'tersembunyi'":

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

untuk "menonaktifkan hanya input jenis 'tombol'":

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

Ini agar pengguna tidak bisa secara tidak sengaja menekan tombol 'pergi' dua kali dan menyemprot DB kami! Tampaknya jika Anda meletakkan atribut 'disabled' pada formulir jenis 'tersembunyi', nilainya tidak akan dikirim jika formulir dikirimkan!

Josh P.
sumber
1

Bagi saya, .htaccess mengalihkan ketika mod_rewrite tidak diinstal. Instal mod_rewite dan semuanya baik-baik saja.

Secara khusus:

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

sedang mengeksekusi.

Martin Fisher
sumber
1

Saya hanya menghabiskan waktu berjam-jam untuk memperbaiki masalah serupa. Masalah dalam kasus saya, adalah file

max_input_vars = "1000"

secara default, di php.ini. Saya memiliki formulir yang sangat besar tanpa unggahan. php.ini diatur ke upload_max_filesize = "100M" dan post_max_size = "108M" dan itu pasti bukan masalah dalam kasus saya. Perilaku PHP sama untuk max_input_vars jika melebihi 1000 variabel dalam formulir. Ia mengembalikan dan mengosongkan array _POST. Saya berharap saya dapat menemukannya satu jam, dan jam yang lalu.

MyraGe
sumber
1

Saya tahu ini sudah tua, tetapi ingin membagikan solusi saya.

Dalam kasus saya, masalahnya ada di .htaccess saya karena saya menambahkan variabel untuk meningkatkan batas unggah maks PHP saya. Kode saya seperti ini:

php_value post_max_size 50MB
php_value upload_max_filesize 50MB

Kemudian saya perhatikan bahwa nilainya harus seperti xxM bukan xxMB dan ketika saya mengubahnya menjadi:

php_value post_max_size 50M
php_value upload_max_filesize 50M

sekarang $ _POST saya mengembalikan data seperti biasa sebelumnya. Semoga ini bisa membantu seseorang di masa depan.

Walid Ajaj
sumber
0

Selain posting MRMage:

Saya harus mengatur variabel ini untuk menyelesaikan masalah yang beberapa $_POSTvariabel (dengan array besar> 1000 item) menghilang:

suhosin.request.max_vars = 2500

" request", bukan " post" adalah solusinya ...

Itzekocke Setzling
sumber
0

Mungkin bukan solusi yang paling nyaman, tetapi saya menemukan bahwa jika saya menyetel actionatribut formulir ke domain root, index.php dapat diakses dan mendapatkan variabel yang diposting. Namun jika saya menyetel URL yang ditulis ulang sebagai tindakan, itu tidak akan berhasil.

Rápli András
sumber
0

Ini mirip dengan apa yang dikatakan @icesar .

Tapi saya mencoba untuk mengirim barang ke api saya, terletak di site/api/index.php, hanya posting site/apikarena diteruskan index.phpdengan sendirinya. Namun, ini tampaknya menyebabkan sesuatu menjadi kacau, karena saya $_POSTdikosongkan dengan cepat. Cukup memposting ke site/api/index.phpsecara langsung alih-alih menyelesaikannya.

Victor Häggqvist
sumber
0

Masalah saya adalah saya menggunakan <base>tag HTML untuk mengubah URL dasar situs pengujian saya. Setelah saya menghapus tag itu dari tajuk, $_POSTdatanya kembali.

Ben
sumber
0

Dalam kasus saya (halaman php di server OVH mutualisé) enctype="text/plain"tidak berfungsi ( $_POSTdan yang sesuai $_REQUESTkosong), contoh lain di bawah berfungsi. `

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

`

Lebih lanjut di sini: method = "post" enctype = "text / plain" tidak kompatibel?

PaulH
sumber
0

Saya mendapatkan kesalahan berikut dari 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"]

Setelah saya menghapus konfigurasi keamanan mod saya untuk menguji, semuanya berfungsi seperti yang diharapkan. Sekarang saya hanya perlu mengubah aturan saya agar tetap aman tetapi cukup fleksibel untuk kebutuhan saya :)

Luke
sumber
0

Pastikan Anda menggunakan name = " your_variable_name " di tag masukan.

Saya salah menggunakan id = " your_variable_name ".

Saya menghabiskan banyak waktu untuk menangkap serangga.

Frank Hsieh
sumber
0

Pastikan bahwa nameproperti setiap bidang ditentukan.

Ini membuat Anda menjadi POST kosong di PHP

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

Tapi, ini akan berhasil

<input type="text" name="Phone" id="Phone">
Miguel Montes de Oca
sumber
Saya pikir ada sesuatu yang berhubungan dengan bagaimana server diatur. Saya mengalami masalah yang sama saat menggunakan GoDaddy sebagai host. Solusi ini tidak menyelesaikan masalah.
acarlstein
-1

Oke, saya pikir saya harus meletakkan kasus saya di sini .... Saya mendapatkan array posting kosong dalam kasus tertentu .. Formulir berfungsi dengan baik, tetapi beberapa kali pengguna mengeluh bahwa mereka menekan tombol kirim, dan tidak ada yang terjadi .... Setelah menggali beberapa saat, saya menemukan bahwa perusahaan hosting saya memiliki modul keamanan yang memeriksa input pengguna dan membersihkan seluruh larik posting (tidak hanya data berbahaya) jika ditemukan demikian. Dalam contoh saya, seorang guru matematika mencoba memasukkan persamaan: dy + dx + 0 = 0; dan data dihapus sepenuhnya.

Untuk memperbaikinya, saya hanya menyarankan dia sekarang untuk memasukkan data di area teks sebagai dy + dx + 0 = nol, dan sekarang berhasil .... Ini dapat menghemat waktu seseorang ..

Mahmoud Elgabry
sumber
5
Meminta pengguna untuk memberikan kelonggaran untuk kode yang salah bukanlah permulaan.
freeworlder
Ini sebenarnya bukan kode yang salah tetapi Anda mungkin mempertimbangkan penyedia hosting baru. Cara lainnya, posting masukan dalam bentuk yang berbeda, misalnya pengkodean URL HTML.
Tom Anderson