Неплохая ли практика писать в $ _POST?

Если это файл_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 и т. Д.).