Это - плохая практика для записи в $ _POST?

Если это - 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 для передачи данных между файлами?

9
задан khellang 4 October 2013 в 08:06
поделиться

7 ответов

Вместо этого вы хотите использовать $ _ SESSION .

$ _ POST предназначен для информации, которая была отправлена ​​на текущую страницу и не поддерживает состояние между загрузками страницы, она будет заполнена только в том случае, если вы действительно отправите что-то во второй файл при перенаправлении. Если бы вы включили второй файл вместо перенаправления через заголовок, то все, что вы сделали, сработало бы, поскольку переменная $ _ POST все равно была бы установлена.

$ _ SESSION будет поддерживать состояние между страницами, поэтому выполнит то, что вы хотите при перенаправлении.

Чтобы правильно использовать $ _ SESSION , вам нужно сначала вызвать session_start (); , чтобы начать сеанс. Дополнительную информацию можно найти в руководстве по PHP .

15
ответ дан 4 December 2019 в 07:22
поделиться

Взгляните на это с точки зрения веб-сервера: он получает запрос на file_1.php , запускает этот файл PHP и отправляет обратно результат, который, оказывается, включает Местоположение: заголовок. Затем через некоторое время он получает отдельный запрос на file_2.php , поэтому он загружает и запускает этот файл и отправляет обратно результат, который представляет собой HTML-страницу. Дело в том, что эти два файла используются в совершенно разных HTTP-запросах. Каждый из них запускается в отдельной среде, поэтому, например, любые изменения, внесенные в переменные в одной, не отражаются в другой. $ _ POST в запросе для file_1.php является отдельной переменной от $ _ POST в запросе для file_2.php .

Что касается вашего фактического вопроса: я думаю, вы можете написать на $ _ POST , но, вероятно, это не рекомендуется. На самом деле переменная не для этого.

2
ответ дан 4 December 2019 в 07:22
поделиться

Это абсолютно нормально. Если вы посмотрите на все большие php-фреймворки (CI, cake, joomla и т. Д.), Все они отправляют через страницу index.php через контроллер в конечный пункт назначения (обычно с использованием некоторого вспомогательного кода). Следовательно, переменная $ _POST скрыта на нескольких уровнях. Помните, что переменная $ _POST действительна ТОЛЬКО для того переходного момента, когда HTTP-запрос активен, поэтому, когда запрос завершен, все переменные сбрасываются в ноль.

Переменная $ _SESSION МОЖЕТ использоваться, если вы хотите постоянно переходить между запросами - хотя это зависит от ваших требований и сценария.

3
ответ дан 4 December 2019 в 07:22
поделиться

$ _ POST следует использовать только с формами, отличными от этой:

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

Вам также необходимо убедиться, что вы избегаете каких-либо угроз безопасности, используйте такие функции, как stripslashes и mysql_real_escape_string (при вставке данных в базу данных)

Чтобы поддерживать состояние между страницами, вам нужно вместо этого использовать сеансы .

1
ответ дан 4 December 2019 в 07:22
поделиться

Ваш пример не работает, см. Другие ответы, в которых объясняется, почему.

Кроме того, использование $ _POST superglobal в качестве хранилища данных - довольно плохая идея, imho. При необходимости используйте специальное решение для совместного использования переменных (например, база данных, реестр памяти im, сеанс, файлы cookie и т. Д.)

1
ответ дан 4 December 2019 в 07:22
поделиться

$ _ POST ["test_message"] пусто в file2.php, потому что вы фактически ничего не отправляли в этот скрипт. Массив $ _ POST заполняется данными формы POSTing, вы можете заполнить $ _ GET , добавив переменную GET к перенаправлению заголовка, или сохранить данные в $ _ SESSION , если вам нужна постоянство данных между страницами.

6
ответ дан 4 December 2019 в 07:22
поделиться

Вообще говоря, $_POST - это обычный массив PHP, который заполняется данными POST при каждом запросе. Поэтому в $_POST можно записывать свои собственные значения.

Но...

1) Ваш код не работает, поскольку ваш вызов header() в file_1.php инструктирует браузер выдать новый запрос, что приводит к совершенно новому (и пустому) массиву $_POST в file_2.php. Массив будет пустым, потому что вы ничего не размещали в file_2.php.

2) На мой взгляд, это действительно плохая практика... Получение данных из $_POST (или $_GET или $_REQUEST) означает, что вы получаете пользовательские данные, с которыми следует обращаться крайне осторожно (фильтровать, санировать, экранировать...). Запись внутренних данных в эти массивы приведет к смешению внутренних и внешних данных, что приведет к путанице и вероятным дырам в безопасности.

2
ответ дан 4 December 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: