$ _POST var未填充而$ HTTP_RAW_POST_DATA获取数据

时间:2014-12-20 19:35:23

标签: php html json forms file

我在javascript中使用此功能与服务器php脚本进行通信:

    ajax = function( url, ready, json=null, method = 'post') {
    var response, request = xhr();
    request.open( method, url, true );
    request.onreadystatechange = function() {
        if( request.readyState == 4 ) {
            if( typeof ready == 'function' ){
                return ready( request );
            } else {    return JSON.parse( request.responseText );}
        } 
    }
    if(json !== null){
        request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        return request.send( JSON.stringify( json ) );
    }else { return request.send( null );}
}

在使用XMLHttpRequest打开连接后,我创建了post method。 我还将setRequestHeader设置为解析JSON: ("Content-Type", "application/json;charset=UTF-8");,我使用此功能从data收集html form

formToValues = function (id) {
    var i, values = {}, form = document.getElementById(id);
    //var fields = form.querySelectorAll('input,textarea,select'),
    for (i = 0; i < form.length ;i++) {
        if( form.elements[i].name !== "" ){
            values[form.elements[i].name] = form.elements[i].value;
        }
    }
    return values;
}


ajax('a.php', function(response){
    console.log(response);
}, formToValues("regForm") );

这里也是我的html form

<form id="regForm" action="javascript:;" method="post" />
<p>
<label for="name">Name</label>
<input type="text" name="name" value="xhr" />

<label for="email">Email:</label>
<input type="email" name="email" value="ro@ew.gq" />

<label for="password">Password:</label>
<input type="password" name="password" value="pass" />

<input type="button" value="Search" />
</p>

现在我在php脚本中回收数据时遇到了问题: a.php

<?php
var_dump(  $GLOBALS );
$ar= array( "a"=>2,"b"=>3, "c"=>json_decode( $_REQUEST['params'] ));
echo json_encode($ar);
?>

似乎php将我从javascrip发出的数据作为字符串并将其存储在HTTP_RAW_POST_DATA

["HTTP_RAW_POST_DATA"]=> string(51) "{"name":"xhr","email":"ro@ew.gq","password":"pass"}"

    "array(7) {
  ["GLOBALS"]=>
  array(7) {
    ["GLOBALS"]=>
    *RECURSION*
    ["HTTP_RAW_POST_DATA"]=>
    string(51) "{"name":"xhr","email":"ro@ew.gq","password":"pass"}"
    ["_POST"]=>
    array(0) {
    }
    ["_GET"]=>
    array(0) {
    }
    ["_COOKIE"]=>
    array(0) {
    }
    ["_FILES"]=>
    array(0) {
    }
    ["_REQUEST"]=>
    array(0) {
    }
  }

现在我可以使用php://input获取数据不会有问题,但我关注安全问题并且它确实没问题,还有一件事要考虑:从php 5.6.0开始。 $ HTTP_RAW_POST_DATA - 不推荐使用原始POST数据〜所以我该怎么办? Tkanks

1 个答案:

答案 0 :(得分:3)

当请求内容类型为application/json(仅application/x-www-form-urlencodedmultipart/form-data)时,PHP不会填充$ _POST超全局。

建议使用json_decode()php://input