Если это файл_1.php
<?php $_POST["test_message"] = "Hello, world"; header("Location: http://localhost/file_2.php"); ?>
и это файл_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>
выход Test message is not set
Это заставляет меня задаться вопросом, можно ли даже писать в $ _POST и, подумав, что, интересно, не так ли это плохо. Должен ли я просто разрешать формы с кнопками отправки и методом = post писать для $ _POST для меня, или это законно писать в $ _POST для передачи данных между файлами?
Вместо этого вы хотите использовать $_SESSION
.
$_POST
– это информация, которая была отправлена на текущую страницу и не поддерживает состояние между загрузками страниц, она будет заполнена только, если вы отправляете что-то во второй файл при перенаправлении. Если бы вы включили второй файл, а не перенаправляли его через заголовок, то то, что вы сделали, будет работать, поскольку переменная $_POST
все равно будет установлена.
$_SESSION
будет поддерживать состояние между страницами, поэтому выполнит то, что вы хотите при перенаправлении.
Чтобы правильно использовать $_SESSION
, вам нужно вызвать session_start();
сначала начать сеанс. В руководстве по PHP есть дополнительная информация.
$_POST["test_message"]
пуст в файле2.php, потому что вы на самом деле ничего не отправили в этот скрипт. Массив $_POST
заполняется данными формы POSTing, вы можете заполнить $_GET
, добавив переменную GET в перенаправление заголовка или сохранить данные в $_SESSION
если вам требуется постоянство данных между страницами.
Это абсолютно нормально. Если вы посмотрите на все основные фреймовые фреймы (CI, cake, joomla и т. Д.), Все они отправляют через страницу index.php через контроллер контроллера в конечный пункт назначения (обычно используя некоторый код помощника). Поэтому переменная $ _POST похожа на несколько слоев глубоко. Помните, что переменная $ _POST ТОЛЬКО действует в течение переходного момента, пока HTTP-запрос активен, поэтому, когда запрос завершен, все переменные сбрасываются на нуль.
Переменная $ _SESSION МОЖЕТ использоваться, если вы хотите сохранить между запросами – это зависит от вашего требования и сценария.
Посмотрите на это с точки зрения веб-сервера: он получает запрос на file_1.php
, запускает этот PHP-файл и отправляет обратно результат, который включает в себя заголовок Location:
. Затем через некоторое время он получает отдельный запрос для file_2.php
, поэтому он загружает и запускает этот файл и отправляет обратно результат, который является HTML-страницей. Дело в том, что два файла используются в полностью отдельных HTTP-запросах. Каждый из них запускается в отдельной среде, поэтому, например, любые изменения, внесенные в переменные в одном, не отражаются в другом. $_POST
в запросе file_1.php
является отдельной переменной из $_POST
в запросе file_2.php
.
Что касается вашего фактического вопроса: я думаю, что вы можете писать в $_POST
, но это, вероятно, не рекомендуется. На самом деле это не переменная.
$_POST
следует использовать только с такими формами:
$_POST["test_message"] = "Hello, world";
Вам также необходимо убедиться, что вы избегаете любых угроз безопасности, используйте такие функции, как stripslashes
и mysql_real_escape_string
(при вставке данных в базу данных)
Чтобы поддерживать состояние между страницами, вам нужно использовать сеансы .
Обычно говорящий $_POST
– это просто обычный массив PHP, который заполняется данными POST по каждому запросу. Поэтому вы можете написать свои собственные значения в $_POST
.
Но…
1) Ваш код не работает, так как ваш вызов header()
в file_1.php
указывает браузеру на новый запрос, который приводит к получению совершенно нового (и пустого) массива $_POST
в file_2.php
. Массив будет пустым, потому что вы ничего не отправляли в file_2.php
.
2) По-моему, это действительно плохая практика … Получение данных из $_POST
(или $_GET
или $_REQUEST
) означает, что вы извлекаете данные пользователя, с которыми следует обращаться с особой осторожностью (фильтрация, дезинфекция, экранирование, … ). Запись внутренних данных в эти массивы приведет к смешению внутренних и внешних данных, ведущих к путанице и вероятным дырам в безопасности.
Ваш пример не может работать, см. Ответ другого, объясняющий почему.
Более того, использование $ _POST суперглобала в качестве хранилища данных – довольно плохая идея imho. Используйте специальное решение для совместного использования переменных, если вам нужно (например, база данных, реестр памяти, сеанс, cookie и т. Д.).