file_get_contents(“php:// input”)返回一个长字符串

时间:2016-07-12 12:46:07

标签: php ajax

我尝试通过AJAX将JSON发送到我的PHP,但$_POST没有任何内容,file_get_contents(“php://input”)返回一个长字符串。

AJAX代码:

function sendData(userData) {
    alert(userData);
    $.ajax({
        type: 'post',
        url: 'testLogin.php',
        dataType : 'json',
        data: userData,
        success: function (msg) {
        if (msg.error) {
            alert("error:" + msg.msg);
            showError(msg.msg);
        } else {  // send to redirection page
            alert("do something here");
        }
    },
    error : function (XMLHttpRequest, textStatus, errorThrown) {
        alert("ajaxError:::" + textStatus + ":::" + errorThrown);
    }
    });
}

AJAX显示之前的警报 {“username”:“user”,“password”:“long hash here”,“op”:“login”}

PHP代码:

$user =  $_POST('username');
$pass =  $_POST["pass"];

$logString = "user: ".$user.
    " pass: ".$pass.
    " SERVER-REQUEST_METHOD: ".$_SERVER['REQUEST_METHOD'].
    " getfile: ".file_get_contents("php://input").  
    "*\n*\n";
// my loging method 
logMe($logString);

$returnMsg['msg']= $pass;
$returnMsg['error'] = true;
echo json_encode($returnMsg);

这是我在日志文件中的内容

userpassSERVER-REQUEST_METHODPOSTgetfileusernameasdpasswordcd8d627ab216cf7fa8992ca4ff36653ca6298566dc5f7d5cc9b96ecf8141c71boplogin

这是我在AJAX成功时返回警报的结果 错误:null

我无法解码file_get_contents(“php:// input”),因为没有分隔符。

编辑: logme函数打破了logstring文本。我已经修复了这个,这就是我现在在日志文件中的内容。 user:pass:SERVER-REQUEST_METHOD:POST getfile:{“username”:“asd”,“password”:“cd8d627ab216cf7fa8992ca4ff36653ca6298566dc5f7d5cc9b96ecf8141c71b”,“op”:“login”}

所以我应该没事我会解码file_get_contents(“php:// input”)

5 个答案:

答案 0 :(得分:0)

淬火是正确的,这是我的记录功能的一个问题。我在测试中使用它只是因为我有它可用但没有费心去看它。它有一个cleanString函数,它导致我的问题。

答案 1 :(得分:-1)

这是另一种常见的做法:

$entityBody = stream_get_contents(STDIN);
$data = json_decode($entityBody, true);
$username = $data['username'];
$password = $data['pass'];

答案 2 :(得分:-1)

将userData的格式更改为& username = something& password = something ..

答案 3 :(得分:-1)

您需要自己填充变量。因为您正在发送JSON,所以PHP不会为您构建$_POST

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

if(is_null($json_obj)): //if there was an error        
    die(json_last_error_msg());
endif;

$username = $json_obj->username;
$password = $json_obj->password

答案 4 :(得分:-1)

首先,$_POST是一个超级全局变量,它不是函数 $_POST('username'); $_POST['username']

你说

  

$_POST没有任何内容,file_get_contents("php://input")返回一个长字符串。

最后,

$returnMsg['msg']= $pass;  ← ← ←
$returnMsg['error'] = true;
echo json_encode($returnMsg);

$pass等于

$pass =  $_POST["pass"];

相反,您应该从file_get_contents("php://input")本身读取外部变量。使用用于解析file_get_contents("php://input")的用户函数,从PHP docs comment抓取。

function getRealPOST() {
    $pairs = explode("&", file_get_contents("php://input"));
    $vars = array();
    foreach ($pairs as $pair) {
        $nv = explode("=", $pair);
        $name = urldecode($nv[0]);
        $value = urldecode($nv[1]);
        $vars[$name] = $value;
    }
    return $vars;
}

并与您的代码一起使用

header("Content-Type: application/json;charset=utf-8"); //to return the response as json
$post = getRealPOST(); //parse the POST
$user =  $post["username"];
$pass =  $post["pass"];

$logString = "user: ".$user.
    " pass: ".$pass.
    " SERVER-REQUEST_METHOD: ".$_SERVER['REQUEST_METHOD'].
    " getfile: ".file_get_contents("php://input").  
    "*\n*\n";
// my loging method 
logMe($logString);

$returnMsg['msg']= $pass;
$returnMsg['error'] = true;
echo json_encode($returnMsg);