Различия между $ _POST и $ _GET PHP на стороне клиента AngularJS

0

Я пытался передать JSON скрипту PHP в AngularJS, например:

var testObj = {
  answers : {
    aa : 2,
    ab : 3
  }
};

var userAnswers = angular.toJson(testObj.answers);

$http.post("ajax/testAddObject.php?answers=" + userAnswers).
success(function(data){
    console.log("Result: ", data);
});

На стороне PHP я делал следующее:

//... new PDO connection to DB
$answers = $_POST['answers'];

//some more stuff

Параметр $answers всегда был пустым. Но потом, почти случайным образом, я увидел этот вопрос, и ответ сказал:

$_POST будет пустым, если Content-Type: application/json передается в заголовках

И хотя мой код не был таким же, как и вопрос, я сменил $_POST[...] на $_GET[...] на PHP-код, и он сработает! Вопрос в том, почему? В чем разница между собой? Потому что, из того, что я видел, кажется, нет большой разницы...

Теги:
post

3 ответа

7
Лучший ответ

$http.post("ajax/testAddObject.php?answers=" + userAnswers).

Здесь вы отправляете answers как параметры запроса (GET) на testAddObject.php и не отправляете их (POST) - обратите внимание на ? параметр в конце testAddObject.php -

Данные $ _GET передаются как параметры в URL-адресе. $ _POST - нет.

  • 0
    Он даже не использует запрос post, он просто указывает URL-адрес с параметром в строке запроса, так что можно использовать get
  • 1
    Вот почему он ничего не получает, используя $ _POST, так как параметр не posted а добавляется в URL. Вы знаете это, и я тоже.
Показать ещё 2 комментария
4

$_POST заполняется данными из тела запроса HTTP, если эти данные будут отформатированы с использованием одного из многоголосных или URL-закодированные форматы.

$_GET заполняется данными из части строки запроса URL-адреса.

$_GET будет заполнен, даже если запрос не был запросом GET. Это касается только того, было ли это в строке запроса или нет.


Поскольку он был поднят в комментариях. $_REQUEST содержит данные из $_POST и данные из $_GET и данные из $_COOKIES. Обычно его лучше избегать, так как это позволяет удивляться данным, поступающим из мест, которые вы не ожидаете.

  • 0
    «$ _GET будет заполнен, даже если запрос не был запросом GET» Вы хотите сказать, что $_REQUEST нет?
  • 0
    @zeflex - Нет. Я имел в виду $_GET . $_REQUEST отличается.
Показать ещё 1 комментарий
0

Я углубился в проблему, и я нашел эту статью, которая объясняет, что этот вид является функцией "AngularJS".

По умолчанию angular.js отправляет все данные в json. Поэтому, если вы выполняете POST запрос к PHP-коду, $_POST не будет заполнено.

Хотя мой код был не совсем прав, если я изменю клиентскую сторону:

$http.post("ajax/testAddObject.php?", {answers : userAnswers}) //...

и соответственно изменить PHP, $_POST[...] все равно ничего не возвращает, что имеет смысл сейчас.

Согласно той же статье есть два решения: один на стороне клиента и другой на стороне сервера

На сервере вы можете анализировать ввод и затем декодировать данные из json:

$data = file_get_contents("php://input");
$postData = json_decode($data);'

На стороне клиента данные могут быть отправлены так, как это ожидает PHP:

$http({
    url:url
    data : $.param(data),
    method : 'POST',
    headers : {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}
}).success(callback);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню