Форма с методом POST возвращает $ _REQUEST, но $ _POST пуст - PullRequest
0 голосов
/ 01 февраля 2020

Используя PHP7 .x, у меня есть простая форма

<form method='post' action=''>
<input type='text' name ='yourname'>
<input type='submit' name = 'submitted' value = 'here'>
</form>

Кнопка отправки работает нормально. Глядя на POST с инструментами разработчика, я вижу значения представленных полей ввода. Таким образом, параметры POST в окне инструментов разработчика показывают введенное значение.

Но если моя страница обработки (страница 'действия') содержит этот код

echo $_POST['yourname'];

Вывод равен нулю. Этот оператор echo $_REQUEST['yourname'] показывает введенное значение.

Почему $_POST['yourname'] не показывает значение?

И я очищаю все данные формы с помощью этой команды

$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

Я могу изменить свой код для использования $_REQUEST['yourname'], но почему $_POST['yourname'] не показывает данные? И будут ли мои filter_input_array() 'чистить' результирующие $_REQUEST значения?

Добавлены Внесены исправления в код (я поместил «действие» в неправильном утверждении в моем примере код; код не был фактически использован. Фактический код содержал параметр 'action' в правильном расположении. Пример кода был обобщенным c образцом, как я видел эту проблему во многих областях кода, использующих «формы».

Но не понимаю «закрыть». Это область программирования (на мой взгляд), и это вопрос программирования: «Почему POST не заполняет массив $ _POST при отправке».

И на второй вопрос «Очистит ли filter_input_array переменные, помещенные в $ _REQUEST?», Ответа не было. (Может быть, это должен был быть отдельный вопрос.)

Но разочарован и неясен, так как почему этот вопрос не подходит для этого стека (и да, я прочитал «правила».)

Ответы [ 3 ]

1 голос
/ 01 февраля 2020

Если вы все еще не можете получить доступ к $_POST переменным после исправления html, существует другая возможная причина.

директива variable_order

В файле конфигурации php .ini есть директива, определяющая, какие из суперглобальных переменных используются и в каком порядке.

Из руководства:

variable_order string

Устанавливает порядок разбора переменных EGPCS (Environment, Get, Post, Cook ie и Server) , Например, если для variable_order установлено значение «SP», то PHP создаст суперглобальные переменные $ _SERVER и $ _POST, , но не создаст $ _ENV, $ _GET и $ _COOK IE. Установка в "" означает, что суперглобальные переменные не будут установлены.

директива request_order

Кроме того, $_REQUEST имеет свою собственную директиву, которая, кажется, заменяет директиву variable_order:

request_order string

Эта директива описывает порядок, в котором PHP регистрирует переменные GET, POST и Cook ie в массиве _REQUEST. Регистрация выполняется слева направо, более новые значения переопределяют более старые значения. Если эта директива не установлена ​​, переменная_ордер используется для содержимого $ _REQUEST.

Поиск php .ini

Из руководство

<?php
$inipath = php_ini_loaded_file();

if ($inipath) {
    echo 'Loaded php.ini: ' . $inipath;
} else {
    echo 'A php.ini file is not loaded';
}
?>
0 голосов
/ 03 февраля 2020

Я провел дополнительное тестирование, пытаясь упростить код и продублировать проблему. Код находится на сайте, который имеет различные «включает». Поэтому я взял свой простой код (просто форму, а затем print_r из $ _GET / POST / REQUESTs), чтобы помочь продублировать проблему.

My includes включает эти операторы для очистки всех входных данных:

$_POST = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_GET = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

Выглядит хорошо, не так ли? Стандартная дезинфекция переменных $_GET и $_POST. Здесь нечего смотреть. Двигайся.

Но посмотрите более внимательно. Я использовал эти утверждения в своем коде много раз. Продолжал идти. Но это должно быть так:

$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);

Обратите внимание, что первый блок фильтрует GET в POST, а POST в GET. Dyslexi c code!

Я называю это ошибкой SAF - «Smack Against лоб». Или «LCG» - «Присмотрись, кузнечик».

<sigh> Спасибо за помощь.

0 голосов
/ 01 февраля 2020

Прежде всего,

HTML выглядит немного нехорошо ..

  1. Атрибут action не является допустимым атрибутом для ввода.
  2. В кнопке отправки есть пробелы
  3. В форме не объявлено никаких действий, большинство браузеров публикует их на ссылающейся странице, но не на всех.

Если я исправлю код, подобный этому, у меня будет хороший вывод:

<?php // this file is test.php
    if (sizeof($_POST))
      var_dump($_POST);
?>
   <form method='post' action='test.php'>
   <input type='text' name ='yourname'>
   <input type='submit' name='submitted' value='here'>
   </form>

Я получу ожидаемый ответ:

array(2) { ["yourname"]=> string(4) "test" ["submitted"]=> string(4) "here" }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...