Отримати всі змінні, надіслані за допомогою POST?


85

Мені потрібно вставити всі змінні, надіслані з поштою, вони були прапорцями, кожен представляючи користувача.

Якщо я використовую GET, я отримую щось подібне:

?19=on&25=on&30=on

Мені потрібно вставити змінні в базу даних.

Як отримати всі змінні, надіслані за допомогою POST? Як масив чи значення, розділені комами чи щось інше?


3
можливий дублікат How to grab all variables in a post (PHP)
mario

Відповіді:


164

Змінна $_POSTзаповнюється автоматично.

Спробуйте var_dump($_POST);переглянути вміст.

Ви можете отримати доступ до окремих значень, як це: echo $_POST["name"];

Звичайно, це передбачає, що у вашій формі використовується типове кодування форми (тобто enctype=”multipart/form-data”

Якщо ваші дані публікації в іншому форматі (наприклад, JSON або XML, ви можете зробити щось подібне:

$post = file_get_contents('php://input');

і $postміститиме вихідні дані.

Припускаючи, що ви використовуєте стандартну $_POSTзмінну, ви можете перевірити, чи встановлений прапорець таким чином:

if(isset($_POST['myCheckbox']) && $_POST['myCheckbox'] == 'Yes')
{
     ...
}

Якщо у вас є масив прапорців (наприклад,

<form action="myscript.php" method="post">
  <input type="checkbox" name="myCheckbox[]" value="A" />val1<br />
  <input type="checkbox" name="myCheckbox[]" value="B" />val2<br />
  <input type="checkbox" name="myCheckbox[]" value="C" />val3<br />
  <input type="checkbox" name="myCheckbox[]" value="D" />val4<br />
  <input type="checkbox" name="myCheckbox[]" value="E" />val5
  <input type="submit" name="Submit" value="Submit" />
</form>

Використання [ ]в назві прапорця означає, що обрані значення будуть доступні за допомогою PHP-скрипту як масив. У цьому випадку $_POST['myCheckbox']не поверне жодного рядка, а поверне масив, що складається з усіх значень прапорців, які були перевірені.

Наприклад, якщо я перевірив всі ящики, $_POST['myCheckbox']буде масив , що складається з: {A, B, C, D, E}. Ось приклад того, як отримати масив значень і відобразити їх:

  $myboxes = $_POST['myCheckbox'];
  if(empty($myboxes))
  {
    echo("You didn't select any boxes.");
  }
  else
  {
    $i = count($myboxes);
    echo("You selected $i box(es): <br>");
    for($j = 0; $j < $i; $j++)
    {
      echo $myboxes[$j] . "<br>";
    }
  }

2
Ви мали намір додати приклад / посилання в кінці?

1
Дякую, я насправді намагався просто print_r ($ _ POST), і він не працював через те, що весь час використовував GET. My bad
lisovaccaro

@ Liso22 не хвилюйся! Буває з усіма нами :)
Кодек-маг

5
$ post = file_get_contents ('php: // input'); врятував мій час. Дякую. О боже, f ** ng php ...
Недуді

1
Грац за 100!
ще

77

ви повинні мати доступ до них із $_POSTзмінної:

foreach ($_POST as $param_name => $param_val) {
    echo "Param: $param_name; Value: $param_val<br />\n";
}

Ви мали намір додати приклад / посилання в кінці?

1
Помітив двокрапку в кінці відповіді.

Це відповідь на запитання.
Лісандро

11

Він застарів і не бажає отримувати прямий доступ до суперглобалів (оскільки php 5.5, я думаю?)

Кожна сучасна IDE скаже вам:

Не звертайтесь безпосередньо до суперглобалів. Використовуйте деякі функції фільтру (наприклад filter_input)

Для нашого рішення, щоб отримати всі параметри запиту, ми повинні використовувати метод filter_input_array

Щоб отримати всі параметри з методу введення, використовуйте це:

$myGetArgs = filter_input_array(INPUT_GET);
$myPostArgs = filter_input_array(INPUT_POST);
$myServerArgs = filter_input_array(INPUT_SERVER);
$myCookieArgs = filter_input_array(INPUT_COOKIE);
...

Тепер ви можете використовувати його у var_dumpвашому foreach-Loops

Що не працює, це отримати доступ до $ _REQUEST Superglobal за допомогою цього методу. Він завжди повертається, NULLі це правильно.

Якщо вам потрібно отримати всі параметри введення, переходячи за різними методами, просто об’єднайте їх, як у наступному методі:

function askForPostAndGetParams(){
    return array_merge ( 
        filter_input_array(INPUT_POST), 
        filter_input_array(INPUT_GET) 
    );
}

Редагувати: розширена версія цього методу (працює також, коли один із методів запиту не встановлений):

function askForRequestedArguments(){
    $getArray = ($tmp = filter_input_array(INPUT_GET)) ? $tmp : Array();
    $postArray = ($tmp = filter_input_array(INPUT_POST)) ? $tmp : Array();
    $allRequests = array_merge($getArray, $postArray);
    return $allRequests;
}

я отримую фатальну помилку при спробі використати вашу пропозицію "$ postArray = ($ tmp = filter_input_array (INPUT_POST))? $ tmp: Array ();". FATAL ERROR Постійний вираз містить недійсні операції в рядку № 5
luckyguy73

@AshtonMorgan я тестував (скопіювати) і він працює нормально. Яку версію PHP ви використовуєте?
mtizziani

8

Отже, щось на зразок $_POSTмасиву?

Ви можете використати, http_build_query($_POST)щоб знову отримати їх у var=xxx&var2=yyyрядок. Або просто print_r($_POST)подивитися, що там.


6

Чому не це, це просто:

extract($_POST);

4
Страшна ідея як є; гігантська діра в безпеці.
ніхто

2
Цей код ідеально відповідає на його запитання "Як отримати всі змінні, надіслані за допомогою POST?", Тоді як інші відповіді - ні. І найкраща відповідь отримує голос проти, перейдіть. Безпека може не бути проблемою для його проекту. Ви хочете сказати, що ті, хто зробив php, помилились, винайшовши цю функцію, що її ніколи не слід використовувати?
bubbahut

2
@bubbahut точно. Ніхто не хоче, щоб усі змінні повідомлення для виробничого коду.
cowboysaif

5

За допомогою цього u можна отримати всю змінну post

print_r($_POST)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.