2010-07-13 15 views
9

Se questo è file_1.php

<?php 

    $_POST["test_message"] = "Hello, world";  

    header("Location: http://localhost/file_2.php"); 
?> 

e questo è file_2.php

<html> 
<head> 
</head> 
<body> 

<?php 

    if (!(isset($_POST["test_message"]))) 
    echo "Test message is not set"; 
    else 
    echo $_POST["test_message"]; 
?> 

</body> 
</html> 

l'uscita è Test message is not set

Il che mi fa chiedere se si può anche scrivere a $ _POST e, dopo essermi chiesto, mi chiedo se sia una cattiva pratica farlo. Devo solo lasciare moduli con i pulsanti submit e method = post write a $ _POST per me, o è legittimo scrivere a $ _POST per passare i dati tra i file?

+0

per non parlare di questa pratica errata: semplicemente non è il modo in cui si può andare a pubblicare dati in un altro file, non funzionerà – oezi

+1

utilizza le variabili di sessione –

+1

potrebbe non essere una cattiva pratica se si stanno filtrando i dati del post con una parte dell'app prima che un'altra parte dell'app lo ottenga e le due parti debbano essere completamente disaccoppiate. Altrimenti, probabilmente c'è un modo migliore per fare qualunque cosa tu stia facendo. –

risposta

14

Si desidera utilizzare $_SESSION invece.

$_POST è per informazioni che è stato inviato POST alla pagina corrente e non mantiene lo stato tra i carichi di pagina, verrà popolato solo se si pubblica effettivamente qualcosa nel secondo file durante il reindirizzamento. Se dovessi includere il secondo file invece di reindirizzare tramite un'intestazione, ciò che avresti funzionato avrebbe funzionato poiché la variabile $_POST sarebbe stata ancora impostata.

$_SESSION manterrà lo stato tra le pagine, quindi eseguirà ciò che si desidera reindirizzando.

Per utilizzare correttamente $_SESSION, è necessario chiamare session_start(); per iniziare la sessione. Ulteriori informazioni sono disponibili nello PHP manual.

+0

Sembra la risposta +1 – Mawg

6

$_POST["test_message"] è vuoto in file2.php perché in realtà non hai postato nulla per quello script. L'array $_POST viene popolato dal POSTing dei dati del modulo, è possibile popolare $_GET aggiungendo una variabile GET al proprio reindirizzamento dell'intestazione o memorizzare i dati in $_SESSION se è necessaria la persistenza dei dati tra le pagine.

+0

stai dicendo che $ _POST può essere scritto solo da un modulo HTML con "emthod = post"? – Mawg

+1

come dice il manuale PHP $ _POST è "... Un array associativo di variabili passato allo script corrente tramite il metodo HTTP POST." http://php.net/manual/en/reserved.variables.post.php – robjmills

+0

+1 per la risposta e +1 per il commento. Grazie – Mawg

3

È assolutamente perfetto farlo. Se si guardano tutti i grandi framework php (CI, cake, joomla etc), tutti postano attraverso la pagina index.php attraverso un controller verso la destinazione finale (di solito usando un codice di aiuto). Pertanto, la variabile $ _POST viene sotterrata in profondità di alcuni livelli. Ricorda, la variabile $ _POST è SOLO valida per quel momento transitorio mentre la richiesta http è attiva, quindi quando la richiesta è completa, tutte le variabili vengono reimpostate su null.

La variabile $ _SESSION PU CAN essere utilizzata se si desidera mantenere le richieste tra una richiesta e l'altra.

+0

+1 per "transitorio". Grazie, posso rimanere con $ _SESSION – Mawg

1

Il $_POST deve essere utilizzato con i moduli non in questo modo:

$_POST["test_message"] = "Hello, world"; 

È inoltre necessario assicurarsi che evitare eventuali rischi per la sicurezza, utilizzare le funzioni come stripslashes e mysql_real_escape_string (durante l'inserimento dei dati nel database)

Per mantenere lo stato tra le pagine, è necessario utilizzare lo sessions.

2

Guardalo dal punto di vista del server web: riceve una richiesta per file_1.php, esegue quel file PHP e restituisce il risultato, che capita di includere un'intestazione Location:.Quindi qualche tempo dopo, riceve una richiesta separata per file_2.php, quindi carica ed esegue quel file e restituisce il risultato, che è una pagina HTML. Il punto è che i due file sono usati in richieste HTTP completamente separate. Ognuno viene eseguito in un ambiente separato, quindi ad esempio, le modifiche apportate alle variabili in una non si riflettono nell'altra. Il $_POST nella richiesta di file_1.php è una variabile separata da $_POST nella richiesta per file_2.php.

Per quanto riguarda la tua domanda attuale: penso che tu possa scrivere a $_POST, ma probabilmente non è raccomandato. Questo non è esattamente ciò che la variabile è per.

+0

+1 Grazie per avermi fatto riflettere; questo lo ha reso molto chiaro. – Mawg

1

Generalmente parlato $_POST è solo un normale array PHP che viene popolato con i dati POST su ogni richiesta. È quindi possibile scrivere i propri valori in $_POST.

Ma ...

1) il suo codice non funziona come header() chiamata in file_1.php indica al browser di emettere una nuova richiesta che si traduce in una nuova (e vuota) $_POST matrice in file_2.php. L'array sarà vuoto perché non hai inviato nulla a file_2.php.

2) A mio parere è davvero una cattiva pratica ... Come ottenere i dati da $_POST (o $_GET o $_REQUEST) indica che si desidera recuperare i dati utente, che deve essere maneggiato con estrema cautela (filtraggio, sanificazione, in fuga, .. .). La scrittura di dati interni in questi array mescolerà i dati interni ed esterni con conseguente confusione e probabili lacune di sicurezza.

+0

+1 buon punto sulla sicurezza. Grazie – Mawg

1

L'esempio non può funzionare, vedere la risposta di altri che spiega perché.

Inoltre l'utilizzo di $ _POST superglobal come memoria di dati è un'impresa piuttosto pessima. Utilizzare una soluzione di condivisione variabile specifica se necessario (come database, registro im memoria, sessione, cookie, ecc.)

Problemi correlati