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