Matrice $ _POST misteriosamente vuota


21

Ho la seguente pagina 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>

Come puoi vedere, il modulo verrà inviato e l'output previsto è un array POST con un array contenente i valori compilati e una voce "azione" con il valore "Vai" (il pulsante). Tuttavia, indipendentemente dai valori che inserisco nei campi; il risultato è sempre:

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

In qualche modo, l'array chiamato test viene svuotato, la variabile "action" lo fa passare.

Ho usato l'estensione di intestazioni HTTP Live per Firefox per verificare se i campi POST vengono inviati e lo fanno. Le informazioni pertinenti dalle intestazioni HTTP in tempo reale (con a, bec compilate come valori nelle caselle di testo):

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

Qualcuno ha idea del perché questo accada? Sto impazzendo per questo, mi è già costato così tanto tempo ...

Aggiornare:

Abbiamo provato questo su diversi server, su Windows funziona, sul server Ubuntu con PHP versione 5.2.4 (con Suhosin), non funziona. Funziona anche su un server diverso, anche con Ubuntu e la stessa versione di PHP, anche con Suhosin installato.

Ho diffuso i due file, questo è l'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
>

In questo phps.ini è quello dal server su cui funziona e php.ini è quello corrente. Sembra che non ci siano problemi qui, giusto?


4
Suhosin può essere.
Col. Shrapnel,

Sì, il suhosin sembra un probabile candidato
SeanJA

Potresti dare qualche informazione in più? Suhosin è installato sul server, devo spegnerlo? Devo modificare le impostazioni?
rael_kid,

3
Prova questo, registrerà se si tratta di un problema sihosin. hardened-php.net/suhosin/configuration.html#suhosin.simulation

Ho provato ad attivare la modalità di simulazione. L'array è ancora vuoto. Tuttavia, non riesco a trovare i file di registro ...
rael_kid

Risposte:


2

Funziona senza gli indici espliciti? Provare:

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

No, non funziona neanche.
rael_kid,

Non impostare gli indici per l'array di test - incasinano il rilevamento delle variabili POST
adam

2
Va bene, posso lasciarli fuori. Ma non risolve il mio problema.
rael_kid

2

Esistono diversi motivi per cui l'array post potrebbe essere vuoto: è probabile che ritorni all'errore umano / sviluppatore. Ho riscontrato questo esatto problema durante l'aggiornamento da PHP 5.2 a 5.4, era semplice ma ci sono volute ore di risoluzione dei problemi per trovare il bug. Nel nostro file config.php avevamo l'istruzione seguente per elaborare le matrici $ _POST:

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

Una volta le virgolette magiche erano attive e nelle versioni PHP fino alla 5.2 funzionava bene ma qualsiasi cosa sopra la versione 5.2 non veniva elaborata e veniva restituito un array vuoto.

Se non hai error_reporting()attivato, ti suggerisco di farlo e sono sicuro che sarai in grado di risolvere il problema.

È inoltre necessario verificare la presenza di funzionalità di sistema obsolete, come " magic_quotes" in quanto il loro utilizzo non riesce a restituire risultati. Spero che aiuti. Buona fortuna. JCS :)


1

Ci sono segnalazioni di bug su questo o simili problemi nel bugtracker di PHP:

Sfortunatamente non menziona una soluzione, ma potresti provare a impostare un altro CONTENT_TYPE o nessun tipo di contenuto.


Questi bug sono simili, ma non uguali ai miei. Ho provato a impostare il tipo di contenuto (come puoi vedere nello snippet di codice nella mia risposta originale). Se non imposto alcun tipo di contenuto, non funziona nemmeno ...
rael_kid

1

Ha avuto un problema abbastanza simile. Bene, prima di tutto mi ci è voluto un po 'di tempo per arrivare a questo post. Per capire il nome del mio problema, ho dovuto installare la console PHP, capire come usarlo. Eseguire il debug del codice di cui non sapevo nulla. Raggiungi la radice del problema e resta comunque perplesso.

La soluzione era piuttosto semplice in realtà. In Chrome, premi F12 per accedere agli strumenti per sviluppatori, seleziona Rete, prova a pubblicare il modulo. Traccia richiesta post, guarda lo stato. Se è 301 (o qualsiasi altra cosa diversa da 200), stai riscontrando lo stesso identico problema che ho avuto fino a poco tempo fa!

Il mio nuovo provider host stava reindirizzando http://my_site.com a http://www.my_site.com , tutto quello che dovevo fare è cambiare alcune impostazioni come parte del mio CMS (il tuo potrebbe essere diverso ma in qualche modo simile) da

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

a

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

E voilà, la magia, gli arcobaleni e gli unicorni e il mio sito finalmente funziona!

PS Messing con le tue impostazioni di hosting potrebbe anche risolvere il tuo problema ... Se il tuo problema è simile al mio ovviamente ...


Accidenti. Anche il reindirizzamento era il mio problema!
Aman Alam,

0

Non sono sicuro ma averlo

name="test[1]"

ecc. può confondere php. Vorrei modificare i nomi di input in test_1, test_2 e vedere cosa succede.


7
@haavee: No, PHP pubblicizza questo utilizzo: php.net/manual/en/faq.html.php#faq.html.arrays
Boldewyn

Ho provato questo, in questo modo le variabili funzionano, ma non sono in un array.
rael_kid,

@haavee: No, la notazione non confonde PHP, è l'uso standard dei moduli PHP +. Vedi il link di Boldewyn. :)

ok grazie! ho imparato qualcosa di nuovo oggi.

1
@adam: "È anche possibile assegnare chiavi specifiche ai tuoi array".

0

Nel PHP di base, posso pensare a una sola opzione di configurazione che potrebbe rompere questo, che è post_max_size, quindi controlla il tuo php.ini e i file correlati per assicurarti che questo valore sia sano e non impostato su zero o un valore non valido come un carattere alfabetico .

Suhosin consente di bloccare variabili post su una varietà di condizioni, tra cui la lunghezza dell'array e la lunghezza del nome della variabile. Esegui il grep dei tuoi file php.ini per "suhosin" per vedere se sono presenti impostazioni, in particolare tutto ciò che inizia con "suhosin.post". (Vedi http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depth per maggiori dettagli sui parametri a cui sto pensando.)

Sfortunatamente, a parte un grosso errore nella configurazione che imposta un valore su uno o zero, il tuo codice (e le variabili) sono abbastanza brevi da essere qualcosa di molto lungo. Se il problema persiste, il mio prossimo suggerimento sarebbe di eseguire il backup delle configurazioni di Apache e PHP, eseguire l'annullamento delle loro directory, eliminare i pacchetti, reinstallare e iniziare a rimettere a posto i blocchi di configurazione fino a quando il codice non smette di funzionare di nuovo (in alternativa, iniziare ad aggiornare quel server che funziona con le configurazioni dal server non funzionante fino a quando non sono entrambe interrotte). Dato che il tuo stesso sistema operativo-stesso-PHP funziona correttamente, questo è quasi certamente un errore di configurazione sul server malfunzionante da qualche parte, ma è un pagliaio piuttosto grande da cercare.

Il controllo della versione di / etc è altamente raccomandato prima di iniziare questo - guarda nel pacchetto etckeeper. (In realtà, ne consiglio l'uso, punto. Maggiore risparmio di integrità, in particolare su una macchina in cui più di una persona ha accesso come root.)


Il mio post_max_size è 8M, penso che sarebbe abbastanza. Il mio php.ini non contiene alcuna voce con suhosin, quindi potrebbe essere un problema ... Suhosin ha i suoi file conf?
rael_kid,

Non di default, ma le impostazioni per qualsiasi modulo PHP possono essere impostate da qualsiasi file in /etc/php5/conf.d su un sistema Debian, e quindi presumo anche un sistema Ubuntu. Come ho detto, questa era una cosa da lungo tempo. Tuttavia, inizierei diffondendo ogni file di configurazione con un sistema funzionante.
Zed,

0

Sto avendo errori di invio dei moduli dappertutto da quando sono passato a "testing" di Debian da "stable". Sembra che apache2 o php5 non gestiscano più elementi nell'invio con lo stesso nome. Per esempio; il modulo ha due input nome "mo". In passato solo uno dei valori di "mo" sarebbe riuscito. Ora il modulo sembra eliminare tutti i dati dopo la prima occorrenza di una chiave duplicata. Non sono ancora sicuro. Sto ancora cercando di capirlo.


0

Prova a copiare su php.ini dal server che funziona su questo (esegui prima il backup del php.ini del server non funzionante). Se lo fa, è qualcosa dentro (forse il variabili_ordine, o forse la memoria, entrambi improbabili).


0

Prova a rinominare il pulsante di invio in qualcosa di diverso dall'azione. Ho avuto alcuni problemi con questo in passato. Avere un input chiamato 'action' sembra essere il problema.


0

Quanto segue NON dovrebbe aiutarti. Si oppone a tutto ciò che so della configurazione di PHP:

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

Questo è saltato su di me. I tuoi superglobali si stanno registrando in diversi ordini. Questo non dovrebbe essere un problema perché poiché non si sta utilizzando register_globalse non si fa affidamento su di essi, non dovrebbe essere un problema cambiare l'ordine in cui vengono elaborate le variabili di ordine.

Ma dovresti assolutamente provarlo e cambiare l'ordine delle variabili.


0

Anche quel PO è piuttosto vecchio, ma oggi ho riscontrato un problema simile.

Dopo aver trascorso alcune ore a controllare milioni di cose diverse più e più volte, alla fine ho scoperto che dopo l'ultimo aggiornamento alla versione 5.6.17 di PHP nella nostra configurazione di cPanel alle impostazioni predefinite di PHP, http non è stato selezionato.inserisci qui la descrizione dell'immagine

E dopo averlo impostato su selezionato - tutto torna alla normalità :-)

inserisci qui la descrizione dell'immagine

Spero che possa aiutare i futuri lettori


0

Se questo può aiutare chiunque altro ... Ho appena trascorso ore a risolvere un problema simile e il problema era il limite max_input_vars = "1000" di php.ini. Assicurati di controllare i valori php.ini di upload_max_filesize, post_max_size e max_input_vars. Il superamento di uno avrà come risultato un array $ _POST vuoto.

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.