php $ _POST array vuoto al momento dell'invio del modulo


99

Ho un CMS personalizzato che ho creato che funziona perfettamente sulla mia scatola di sviluppo (Ubuntu / PHP5 + / MySQL5 +).

L'ho appena spostato nella casella di produzione per il mio cliente e ora tutti gli invii di moduli vengono visualizzati come array $ _POST vuoti.

Ho trovato un trucco per verificare che i dati vengano effettivamente passati utilizzando file_get_contents('php://input');e che i dati vengano visualizzati correttamente lì: gli array $_POST/ $_REQUESTsono sempre vuoti.

Ho anche verificato che anche le intestazioni del tipo di contenuto sono corrette tramite firebug ( application/x-www-form-urlencoded; charset=utf-8).

Questo problema si verifica indipendentemente dal fatto che un modulo venga inviato tramite AJAX o un modulo normale.

Qualsiasi aiuto è molto apprezzato!

php  arrays  forms  post 

Controlla post_max_size: il valore deve essere impostato su 8M, non 8MB. Nell'ultimo caso, non vedrai alcun errore, ma la dimensione di $ _POST sarà impostata su 0
Sergei Karpov

Risposte:


186

So che questa domanda riguardava il POST tramite un modulo, ma sono venuto qui alla ricerca di risposte per problemi simili durante il POST con il tipo di contenuto JSON. Ho trovato la risposta e ho voluto condividerla perché mi è costato molto tempo.

Quando si utilizza il tipo di contenuto JSON, l'array $ _POST non verrà popolato (credo solo con i moduli in più parti)

Ecco cosa ha funzionato per correggere il problema:

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

spero che questo aiuti qualcuno!


Questa soluzione ha senso: ha risolto il mio controller di aggiornamento batch :)
Martin Zeitler

2
Un'altra alternativa è modificare l' Content-Typeintestazione in application/x-www-form-urlencodede quindi serializzare i dati con $.param(dataObject). Questo dovrebbe aiutare.
ŁukaszBachman

1
@ ŁukaszBachman Come fare che se DataObject è qualcosa di simile ........ title=something&body=anything. Voglio ottenere il valore del titolo e del corpo. $ dataobject ["titolo"] restituisce vuoto. Nel mio caso $ _POST è vuoto. E l'unico modo per ottenerlo usando file_get_contents ("php: // input") ... tranne che non è codificato in json.
Khurshid Alam

Questo è molto utile. La cosa strana è che non ho problemi a inviare Json sulla mia macchina di sviluppo, ma fallo su quella di produzione.
Simon H


86

Ecco un'altra possibile causa: il mio modulo è stato inviato a domain.com senza il WWW. e avevo impostato un reindirizzamento automatico per aggiungere il "WWW". L'array $ _POST veniva svuotato durante il processo. Quindi, per risolvere il problema, tutto quello che dovevo fare era inviare a www.domain.com


24
Dannazione, una riscrittura htaccessdell'URL nel mio è stata la causa del mancato funzionamento dei POST. Stavo aggiungendo automaticamente una barra a tutti gli URL, ma nel codice come AZIONE stavo usando un URL senza una barra. La tua risposta ha aiutato, poiché non avrei mai pensato di controllare il file .htaccess. +1
binar

Ho avuto l'inoltro del dominio (con mascheramento) usando Godaddy e questa sembra essere la fonte del problema. Grazie!
Chris Prince

1
Ho anche avuto un problema simile, proveniva dal mio .htaccessfile. Stava rimuovendo l' .phpestensione dall'URL e il mio modulo stava POSTinviando l'URL con l'estensione.
Emanuel Vintilă

25

Ho avuto un problema simile. Si è rivelata una soluzione semplice. Nella forma che avevo

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

dove directory era il nome di ... la directory. Il mio array POST era completamente vuoto. Quando ho guardato l'URL nel mio browser, è stato visualizzato con una barra alla fine.

L'aggiunta della barra in avanti alla fine della mia azione ha funzionato:

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

Il mio array $ _POST era di nuovo pieno!


1
Questa non dovrebbe essere una soluzione, ad esempio su CakePHP, che ha un buon sistema di routing, ha fallito su questo, (non intendo dire che Cake non è riuscito), forse l'approccio a questo problema non è il framework oi file .php, ma un po 'di configurazione su Apache, vorrei fare ulteriori indagini su questo problema. È piuttosto interessante.
James il

In una nota simile, ho avuto lo stesso problema dell'OP, ma solo se il <form>tag non aveva un nameattributo e solo in IE.
jkt123

13

Assicurati che, in php.ini:

  • track_vars (è disponibile solo su versioni PHP molto vecchie) è impostato su On
  • variables_order contiene la lettera P
  • post_max_size è impostato su un valore ragionevole (ad esempio 8 MB)
  • (se si utilizza suhosin patch) suhosin.post.max_varse suhosin.request.max_varssono abbastanza grandi.

Suppongo che il mio secondo suggerimento risolverà il tuo problema.


1
Grazie MrMage, apprezzo la tua intuizione e controllerà quelle impostazioni ini e ti farà sapere se ha funzionato. Grazie!

1
L'impostazione "post_max_size" è il mio showstopper. Stavo caricando un file di grandi dimensioni durante l'invio del modulo e questa impostazione conteneva un valore inferiore. Quindi ricevo un array di post vuoto quando invio il modulo.
shasi kanth

9

Ho scoperto che quando si pubblica da HTTP a HTTPS, il messaggio $_POSTè vuoto. Questo è successo durante il test del modulo, ma mi ci è voluto un po 'prima di rendermene conto.


5

Mi sono imbattuto in un problema simile ma leggermente diverso e ci sono voluti 2 giorni per capire il problema.

  • Nel mio caso anche l'array POST era vuoto.

  • Quindi controllato con file_get_contents ('php: // input'); e anche quello era vuoto.

Successivamente ho scoperto che il browser non stava chiedendo conferma per il reinvio dei dati del modulo dopo Se aggiorno la pagina caricata dopo l'invio POST. Stava rinfrescando direttamente la pagina. Ma quando ho cambiato l'URL del modulo in uno diverso, stava passando correttamente il POST e ho chiesto di inviare nuovamente i dati quando ho tentato di aggiornare la pagina.

Quindi ho controllato cosa c'è di sbagliato nell'URL effettivo. Non c'erano errori con l'URL, tuttavia puntava a una cartella senza index.php in URL e stavo controllando POST su index.php.

Qui ho dubitato che il reindirizzamento da / a /index.php causi la perdita dei dati POST e l'URL testato con l'aggiunta di index.php all'URL.

Quello ha funzionato.

L'ho pubblicato qui in modo che qualcuno lo trovasse utile.


1
Ho avuto lo stesso problema, senza "/" alla fine dell'URL, non esiste nulla in $ _REQUEST, ma con "/" o "/index.php", tutti i dati pubblicati esistono in $ _REQUEST. Potrebbero essere le mie impostazioni di nginx o qualcos'altro!
MohaMad

4

Non ho una soluzione elegante a questo punto, ma volevo condividere le mie scoperte per il futuro riferimento di altri che incontrano questo problema. La fonte del problema era 2 valori php sovrascritti in un file .htaccess. Avevo semplicemente aggiunto questi 2 valori per aumentare il limite di dimensione del file per i caricamenti di file dagli 8 MB predefiniti a qualcosa di più grande: ho osservato che il problema era semplicemente avere questi 2 valori nel file htaccess, sia più grandi che più piccoli del valore predefinito .

php_value post_max_size xxMB
php_value upload_max_filesize xxMB

Ho aggiunto variabili aggiuntive per aumentare, si spera, i limiti per tutte le variabili suhosin.post.xxx/suhosin.upload.xxx, ma sfortunatamente queste non hanno avuto alcun effetto con questo problema.

In sintesi, non posso davvero spiegare il "perché" qui, ma ho identificato la causa principale. La mia sensazione è che questo sia in definitiva un problema suhosin / htaccess, ma sfortunatamente uno che non sono stato in grado di risolvere se non rimuovere i 2 valori php sovrascritti sopra.

Spero che questo aiuti qualcuno in futuro mentre ho ucciso una manciata di ore per capirlo. Grazie a tutti coloro che si sono presi il tempo per aiutarmi con questo (MrMage, Andrew)


Potrebbe valere la pena porre questa domanda su Serverfault, in particolare se il problema risiede nella configurazione del server / htaccess.
David dice di reintegrare Monica il

5
Se non mi sbaglio, la dimensione dovrebbe essere specificata come "xxM" e non "xxMB", quindi mi chiedo se questo potrebbe avere qualcosa a che fare con questo ...
JC Inacio

4

Potrei risolvere il problema usando enctype = "application / x-www-form-urlencoded" poiché l'impostazione predefinita è "text / plain". Quando si archivia $ DATA, il separatore è uno spazio per "text / plain" e un carattere speciale per "urlencoded".

Cordiali saluti Frank


4

Avere l' enable_post_data_readingimpostazione disabilitata causerà ciò. Secondo la documentazione:

enable_post_data_reading

La disabilitazione di questa opzione fa sì che $ _POST e $ _FILES non vengano popolati. L'unico modo per leggere i postdata sarà quindi tramite l'input stream wrapper php: //. Ciò può essere utile per le richieste proxy o per elaborare i dati POST in modo efficiente in termini di memoria.


4

Se stai postando in un file index.php in una directory per esempio /api/index.php assicurati che nel modulo specifichi l'intera directory del file es.

Questo

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

O

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

lavori.

Ma questo fallisce

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

In realtà ho l'esatto contrario. Ho scoperto che /my_uriavrebbe funzionato ma non /my_uri/.
Link14

ha avuto lo stesso problema. sembra che apache o nginx aggiungano un reindirizzamento da / api a / api /
John Smith

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

Ok, è stato stupido e mi metterò in imbarazzo in pubblico, ma ho buttato giù un piccolo script di test per qualcosa in PHP e quando il mio $_POSTarray era vuoto, StackOverflow è il primo posto in cui ho cercato e non ho trovato la risposta di cui avevo bisogno .

Avevo solo scritto

<form action="test.php">

e dimenticato di specificare il metodo come essere POST!

Sono sicuro che qualcuno ridaccherà, ma se questo aiuta qualcun altro che fa la stessa cosa, allora non mi dispiace! Lo facciamo tutti di tanto in tanto!


non posso credere di aver dimenticato anche quello! Sto solo provando un nuovo server e pensavo che fosse qualcosa dovuto alla configurazione ... comunque, grazie per il promemoria!
Samuel Aiala Ferreira

4

Nel mio caso, quando invio da HTTP a HTTPS, $ _POST risulta vuoto. Il problema era che il modulo aveva un'azione come questa //example.com Quando ho corretto l'URL su https://example.com , il problema è scomparso.


1
Penso che sia qualcosa correlato a come è configurato il server. Sto riscontrando gli stessi problemi utilizzando GoDaddy come host. Questa soluzione non ha risolto il problema.
acarlstein

Questa soluzione ha risolto il mio problema. Ho avuto un bel headeach.
gokaysatir

3

stesso problema qui!

stavo cercando di connettermi al codice del mio server locale tramite richiesta di posta nel postino e questo problema mi ha fatto perdere molto tempo!

per chiunque usi un progetto locale (es. postino): usa il tuo indirizzo IPv4 (digita ipconfig in cmd) invece della parola chiave "localhost". nel mio caso:

prima:

localhost/app/login

dopo:

192.168.1.101/app/login

Postman mi ha dato alcuni problemi con i valori json raschiati che hanno virgolette o spazi. Si aspetta un formato specifico.
Tom Anderson

2

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

Metodo POST

Apporteremo alcune modifiche in modo che venga utilizzato il metodo POST quando si invia la richiesta ...

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

Alcune intestazioni http devono essere impostate insieme a qualsiasi richiesta POST. Quindi li abbiamo impostati in queste righe ...

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

Con le righe precedenti stiamo sostanzialmente dicendo che i dati inviati sono nel formato di un modulo di invio. Forniamo anche la lunghezza dei parametri che stiamo inviando.

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

Abbiamo impostato un gestore per l'evento di modifica "stato pronto". Questo è lo stesso gestore che abbiamo usato per il metodo GET. Puoi usare http.responseText qui: inseriscilo in un div usando innerHTML (AHAH), eval it (JSON) o qualsiasi altra cosa.

http.send(params);

Infine, inviamo i parametri con la richiesta. L'URL fornito viene caricato solo dopo che questa riga è stata chiamata. Nel metodo GET, il parametro sarà un valore null. Ma nel metodo POST, i dati da inviare verranno inviati come argomento della funzione di invio. La variabile params è stata dichiarata nella seconda riga come lorem=ipsum&name=binny- quindi inviamo due parametri - "lorem" e "name" rispettivamente con i valori "ipsum" e "binny".


1

Nel mio caso era perché stavo usando jQuery per disabilitare tutti gli input sulla pagina appena prima di usare jQuery per inviare il modulo. Quindi ho cambiato il mio "disabilita ogni input anche i tipi 'nascosti'":

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

per "disabilitare solo gli ingressi di tipo 'pulsante'":

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

In questo modo l'utente non poteva premere accidentalmente due volte il pulsante "vai" e irrigare il nostro DB! Sembra che se metti l'attributo "disabilitato" su un modulo di tipo "nascosto", i loro valori non verranno inviati se il modulo viene inviato!


1

Per me, .htaccess stava reindirizzando quando mod_rewrite non era installato. Installa mod_rewite e tutto va bene.

Nello specifico:

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

stava eseguendo.


1

Ho appena passato ore a risolvere un problema simile. Il problema nel mio caso era il

max_input_vars = "1000"

per impostazione predefinita, nel php.ini. Avevo un modulo davvero enorme senza caricamenti. php.ini è impostato su upload_max_filesize = "100M" e post_max_size = "108M" e sicuramente non era il problema nel mio caso. Il comportamento di PHP è lo stesso per max_input_vars quando supera 1000 variabili nel modulo. Restituisce e svuota l'array _POST. Vorrei averlo scoperto un'ora e ore fa.


1

So che questo è vecchio, ma volevo condividere la mia soluzione.

Nel mio caso il problema era nel mio .htaccess poiché ho aggiunto variabili per aumentare il limite massimo di upload del mio PHP. Il mio codice era così:

php_value post_max_size 50MB
php_value upload_max_filesize 50MB

Successivamente ho notato che i valori dovrebbero piacere xxM non xxMB e quando l'ho cambiato in:

php_value post_max_size 50M
php_value upload_max_filesize 50M

ora il mio $ _POST ha restituito i dati normalmente prima. Spero che questo aiuti qualcuno in futuro.


0

Oltre al post di MRMage:

Ho dovuto impostare questa variabile per risolvere il problema che alcune $_POSTvariabili (con un ampio array> 1000 elementi) sono scomparse:

suhosin.request.max_vars = 2500

" request", non " post" era la soluzione ...


0

Forse non è la soluzione più conveniente, ma ho capito che se imposto l' actionattributo form al dominio principale, è possibile accedere a index.php e ottenere le variabili pubblicate. Tuttavia, se imposto come azione un URL riscritto, non funziona.


0

Questo è un po 'simile a quello che ha detto @icesar .

Ma stavo cercando di pubblicare cose nella mia API, situata in site/api/index.php, solo postando in site/apiquanto viene trasmessa index.phpda sola. Questo, tuttavia, a quanto pare, ha causato un disordine, poiché il mio è $_POSTstato svuotato al volo. Semplicemente postando site/api/index.phpdirettamente su invece risolto.


0

Il mio problema era che stavo utilizzando il <base>tag HTML per modificare l'URL di base del mio sito di test. Una volta rimosso quel tag dall'intestazione, i $_POSTdati sono tornati.


0

Nel mio caso (la pagina php sul server OVH mutualisé) enctype="text/plain"non funziona ( $_POSTe il corrispondente $_REQUESTè vuoto), gli altri esempi sotto funzionano. "

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

"

Altro qui: method = "post" enctype = "text / plain" non sono compatibili?


0

Ho ricevuto il seguente errore da 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"]

Dopo aver rimosso la mia configurazione di sicurezza mod per testare, tutto ha funzionato come previsto. Ora devo solo modificare le mie regole per rimanere al sicuro ma abbastanza flessibile per le mie esigenze :)


0

Assicurati di utilizzare name = " your_variable_name " nel tag di input.

Uso erroneamente id = " your_variable_name ".

Ho passato molto tempo a catturare il bug.


0

Assicurati che la nameproprietà di ogni campo sia definita.

Questo ti crea un POST vuoto su PHP

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

Ma questo funzionerà

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

Penso che sia qualcosa correlato a come è configurato il server. Sto riscontrando gli stessi problemi utilizzando GoDaddy come host. Questa soluzione non ha risolto il problema.
acarlstein

-1

OK, ho pensato che avrei dovuto mettere il mio caso qui ... in casi specifici stavo lasciando vuoto l'array di post .. Il modulo funziona bene, ma a volte gli utenti si lamentano di aver premuto il pulsante di invio e non succede nulla ... Dopo aver scavato per un po ', ho scoperto che la mia società di hosting ha un modulo di sicurezza che controlla gli input degli utenti e cancella l'intero array di post (non solo i dati dannosi) se lo scopre. Nel mio esempio, un insegnante di matematica stava cercando di inserire l'equazione: dy + dx + 0 = 0; e i dati sono stati cancellati completamente.

Per risolvere questo problema, gli consiglio ora di inserire i dati nell'area di testo come dy + dx + 0 = zero, e ora funziona .... Questo può far risparmiare tempo a qualcuno ..


5
Chiedere agli utenti di tenere conto di codici difettosi è un non-principiante.
freeworlder

Non è davvero un codice difettoso, ma potresti prendere in considerazione un nuovo provider di hosting. In alternativa, inserisci l'input in una forma diversa, ad es. Codifica URL HTML.
Tom Anderson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.