2010-07-13 23 views
9

Si esto es file_1.php

<?php 

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

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

y esto es 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> 

la salida es Test message is not set

que me pregunto si uno puede incluso escribir en $ _POST y, habiéndome preguntado eso, me pregunto si es una mala práctica hacerlo. ¿Debo dejar que los formularios con botones de envío y method = post escriban en $ _POST en mi nombre, o es legítimo escribir en $ _POST para pasar datos entre archivos?

+0

sin mencionar si esta es una mala práctica: simplemente no es la forma en que puede enviar datos a otro archivo, esto no funcionará – oezi

+1

use las variables de sesión –

+1

puede no ser una mala práctica si está filtrando los datos de la publicación con una parte de la aplicación antes de que otra parte de la aplicación la obtenga y las dos partes deben estar completamente desacopladas. De lo contrario, probablemente haya una mejor manera de hacer lo que sea que estés haciendo. –

Respuesta

14

Quiere usar $_SESSION en su lugar.

$_POST es la información que se ha PUBLICADO en la página actual y no mantiene el estado entre carga de página, solo se completará si realmente publica algo en el segundo archivo al redireccionar. Si tuviera que incluir el segundo archivo, en lugar de redirigirlo a través de un encabezado, entonces lo que haya hecho funcionaría, ya que la variable $_POST aún estaría configurada.

$_SESSION mantendrá el estado entre páginas, por lo que logrará lo que desea al redireccionar.

Para usar correctamente $_SESSION, primero deberá llamar al session_start(); para comenzar la sesión. Hay más información en el PHP manual.

+0

Esto parece la respuesta +1 – Mawg

6

$_POST["test_message"] está en blanco en file2.php porque no ha publicado nada en ese script. La matriz $_POST se rellena con los datos de formulario de POSTING, puede completar $_GET agregando una variable GET a su encabezado redirigir o almacenar datos en $_SESSION si necesita persistencia de datos entre las páginas.

+0

¿Estás diciendo que $ _POST solo se puede escribir desde un formulario HTML con "emthod = post"? – Mawg

+1

como dice el manual de PHP $ _POST es "... Una matriz asociativa de variables pasadas al script actual a través del método HTTP POST". http://php.net/manual/en/reserved.variables.post.php – robjmills

+0

+1 para respuesta y +1 para comentario. Gracias – Mawg

3

Está absolutamente bien hacer eso. Si observas todos los grandes frameworks php (CI, cake, joomla, etc.), todos publican a través de la página index.php por un controlador hasta el destino final (usualmente usando algún código auxiliar). Por lo tanto, la variable $ _POST está enterrada a unas pocas capas de profundidad. Recuerde, la variable $ _POST SÓLO es válida para ese momento transitorio mientras la solicitud http está activa, por lo que cuando se completa la solicitud, todas las variables se restablecen a nulo.

La variable $ _SESSION PUEDE ser utilizada si desea persistir entre las solicitudes, aunque depende de su requisito y escenario.

+0

+1 para "transitorio". Gracias, puedo quedarme con $ _SESSION – Mawg

1

El $_POST deberían utilizarse sólo con las formas no como este:

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

También es necesario asegurarse de que evite los riesgos de seguridad, funciones de uso como stripslashes y mysql_real_escape_string (al insertar datos en la base de datos)

Para mantener el estado entre las páginas, necesita usar el sessions en su lugar.

2

Mírelo desde la perspectiva del servidor web: recibe una solicitud de file_1.php, ejecuta ese archivo PHP y devuelve el resultado, que pasa a incluir un encabezado Location:.Luego, un tiempo después, recibe una solicitud por separado para file_2.php, por lo que carga y ejecuta ese archivo y devuelve el resultado, que es una página HTML. El punto es que los dos archivos se usan en solicitudes HTTP completamente separadas. Cada uno se ejecuta en un entorno separado, por lo que, por ejemplo, los cambios que se realicen en las variables en uno no se reflejarán en el otro. El $_POST en la solicitud de file_1.php es una variable separada del $_POST en la solicitud de file_2.php.

En cuanto a su pregunta real: Creo que puede escribir al $_POST, pero probablemente no se recomienda. Eso no es realmente para lo que es la variable.

+0

+1 Gracias por hacerme pensar al respecto; eso lo dejó muy claro. – Mawg

1

Generalmente hablada $_POST es simplemente una matriz PHP normal que se rellena con los datos POST en cada solicitud. Por lo tanto, es posible escribir sus propios valores en $_POST.

Pero ...

1) Su código no funciona como su header() llamada en file_1.php indica al navegador que emitir una nueva solicitud que se traduce en una forma completamente nueva (y vacío) $_POST matriz en file_2.php. La matriz estará vacía porque no ha publicado nada en file_2.php.

2) En mi opinión, es de hecho una mala práctica ... Obtener datos de $_POST (o $_GET o $_REQUEST) indica que se están recuperando datos de usuario que debe ser manejado con extrema precaución (filtrado, desinfección, escapando, .. .). Escribir datos internos en estas matrices mezclará los datos internos y externos dando lugar a confusión y probables agujeros de seguridad.

+0

+1 buen punto acerca de la seguridad. Gracias – Mawg

1

Su ejemplo no puede funcionar, vea la respuesta de otros que explican por qué.

Además, usar $ _POST superglobal como almacenamiento de datos es una idea bastante mala. Use una solución de intercambio de variables específica si necesita (como base de datos, registro de memoria im, sesión, cookie, etc.)

Cuestiones relacionadas