file_get_contents(" php:// input"返回空字符串

时间:2014-11-26 13:28:47

标签: php json

我有一个请求类,应该获得post json数据

class Request
{
    public $data;

    public function __construct ( )
    {
        $this->data = json_decode(file_get_contents("php://input"), true);
    }
}

当我执行print_r($this->data)时,print_r()是emtpy,当我执行var_dump()时,内容会显示为

我作为POST请求发送到服务器的内容

{"currentFilter": {"groupSelect":"all","hostSelect":"all","prioritySelect":"all","priorityOf":"none","priorityTo":"none","periodSelect":"all","periodDateStart":"none","periodDateEnd":"none","messageFilter":"none"},"firstseq":null,"lastseq":null}

我做错了,我得到一个空字符串

不同之处在于浏览器firefox和chrome

之间
class ResultController extends Controller
{

    public function loadLogs ( )
    {
         $this->prepareRequest();
    }

    public function prepareRequest ( )
    {
     print_r($this->request->data);
     var_dump($this->request->data);
    }

在chrome中我得到了数组,而在firefox中我得到的只是null

客户代码

load : function ( ) {

    var deferred = $.Deferred();

    var currentFilter = FilterModel.getCurrentFilter();

    var data = {
        'currentFilter' : currentFilter,
        'firstseq' : LogsController.firstseq,
        'lastseq' : LogsController.lastseq
    };

    var url = 'php/main.php?controller=Result&action=loadLogs';

    server.post(url, data).done(function ( data ) {
        LogsController.firstseq = data.firstelem;
        LogsController.lastseq = data.lastelem;
        LogsView.appendLogs(data.resultdata);
        view.setPriorityColor();
        deferred.resolve();
    }).fail(function ( textStatus ) {
        view.popupError(textStatus.responseText);
    });

    return deferred.promise();
},

1 个答案:

答案 0 :(得分:0)

php://input只能读一次。您需要将结果保存在某处并访问

  

:在PHP 5.6之前,使用php://输入打开的流只能是   读一次;流不支持搜索操作。然而,   根据SAPI实现,可能会打开   另一个php://输入流并重新开始读取。这是唯一可能的   如果请求正文数据已保存。通常情况是这样的   对于POST请求,但不是其他请求方法,例如PUT或   PROPFIND。

http://php.net/manual/en/wrappers.php.php