file_get_contents ( 'PHP: // ввод'); с приложением / x-www-form-urlencoded;

Я прочитал несколько вопросов по теме здесь, но не смог найти ответ, который я ищу. Я делаю $ .post с jQuery на сервере PHP5.6.

$.post('/', {a:100, b:'test'}, function(data){ }, 'json'); 

Кодировка с консоли

 Content-Type application/x-www-form-urlencoded; charset=UTF-8 

Если я попытаюсь прочитать данные POST с помощью обычного $ _POST, PHP5.6 предупреждает меня

 PHP Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead 

Итак, я попробовал это предложение, добавил always_populate_raw_post_data = -1 в php.ini и

 json_decode(file_get_contents("php://input")); 

PHP5.6 предупреждает меня, что он недействителен

 PHP Warning: First parameter must either be an object or the name of an existing class 

Поэтому я выкинул file_get_contents («php: // input»), и это строка.

 a=100&b="test" 

Поэтому я проанализировал строку и закодировал, затем расшифровал

 parse_str(file_get_contents("php://input"), $data); $data = json_decode(json_encode($data)); var_dump($data); 

И, наконец, я наконец получил свои $ data как объект, а не массив, как истинный объект JSON.

Я прибегал к использованию $ _POST на данный момент … Но потом мне интересно, как обновить PHP.

Вопрос здесь в том, что есть ли более прямое решение для этого или это означает, что использование file_get_contents («php: // input») также означает выполнение синтаксического анализа синтаксического кодирования декодирования?

Изменить: так кажется, что это не работает ни на нескольких уровнях json's. Рассмотрим следующее:

 {"a":100, "b":{"c":"test"}} 

Как отправлено в Ajax / Post

 {a:100, b:{c:"test"}} 

дела

 parse_str(file_get_contents("php://input"), $post); var_dump($post); 

Выйдет

 array(2) { ["a"]=>string(8) "100" ["b"]=>string(16) "{"c":"test"}" } 

Или делать (как было предложено)

 parse_str(file_get_contents("php://input"), $post); $post= (object)$post; 

Выйдет

 object(stdClass)#11 (2) { ["a"]=>string(8) "100" ["b"]=>string(16) "{"c":"test"}" 

}

Как преобразовать file_get_contents ("php: // input") в истинный объект с той же «архитектурой» без использования рекурсивной функции?

Edit2: Моя ошибка, предложенная работа, я получил сторону в комментариях с JSON.stringify, которые вызвали ошибку. Итог: он работает с json_decode (json_encode ($ post)) или $ post = (object) $ post;

Напомним, используя jQuery $ .post:

 $.post('/', {a:100, b:{c:'test'}}, function(data){ }, 'json'); parse_str(file_get_contents("php://input"), $data); $data = json_decode(json_encode($data)); 

или

 parse_str(file_get_contents("php://input"), $data); $data= (object)$data; 

Не нужно использовать JSON.stringify

Получая данные POST с сериализованным / urlencoded в тексте POST запроса, как вы, вы правильно преобразовали его в массив с parse_str() уже.

Однако шаг кодирования, а затем декодирование JSON для того, чтобы преобразовать его в объект (в отличие от массива ), который вы ищете, не является необходимым. Вместо этого PHP с радостью передаст ассоциативный массив в объект класса stdClass :

 parse_str(file_get_contents("php://input"), $data); // Cast it to an object $data = (object)$data; var_dump($data); 

Немного больше информации доступно в документации PHP по типу литья .

Чтобы отправить сырые данные json, вы должны остановить jQuery от url-encoding:

  data = {"a":"test", "b":{"c":123}}; $.ajax({ type: 'POST', url: '...', data: JSON.stringify(data), // I encode it myself processData: false // please, jQuery, don't bother }); 

На стороне php просто прочитайте php://input и json_decode :

 $req = file_get_contents("php://input"); $req = json_decode($req); 

Моя ошибка, предложенная работа, я получил сторону, отслеживаемую в комментариях с JSON.stringify, которая вызвала ошибку. Итог: он работает с json_decode (json_encode ($ post)) или $ post = (object) $ post; Ответ Майкла был прав, но стороны отслеживали меня, и я оставил ошибку в своем коде. JSON.stringify полезен только при отправке данных из формы, как я ответил в комментарии.