我尝试通过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”)
答案 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);