我想从带有json主体的JS客户端接收POST请求(即这是不表单数据),并在检查后将.gigs(javascript)数组保存到文件中.password字段。这是我的所有代码(基于Receive JSON POST with PHP)
$json_params = file_get_contents("php://input");
if (strlen($json_params) > 0 && isValidJSON($json_params)){
/* json_decode(..., true) returns an 'array', not an 'object'
* Working combination: json_decode($json_params) WITH $inp->password
*/
$inp = json_decode($json_params);
} else {
echo "could not decode POST body";
return;
}
$password = $inp->password;
// echo $password;
if ($password == "****") {
$gigs = $inp['gigs'];
// WAS $res = file_put_contents('gigs.json', json_encode($gigs), TEXT_FILE);
$res = file_put_contents('gigs.json', json_encode($gigs));
if ($res > 0) {
echo "Success";
return;
} else {
if (!$res) {
http_response_code(500);
echo "file_put_contents error:".$res;
return;
} else {
http_response_code(500);
echo "Error: saved zero data!";
return;
}
}
}
else {
// http_response_code(403); // (2)
echo "Password invalid";
return;
}
我发现的是
if
语句并取消注释echo $password;
,那么正确的密码就在那里Illegal string offset 'password'
。没有它,我得到一个"Success"
(全部用于相同的密码)。 我不明白发生了什么,也不了解如何安全地收到200,403和500条错误消息。
答案 0 :(得分:1)
请注意
$json_params = file_get_contents("php://input");
如果您的脚本是在常规HTTP请求上运行的,那么传递类似于HTML表单的数据,则应考虑使用$_POST
作为您的内容,而不是php://input
。如果您希望JSON在请求正文中,那么我可以,但我也会检查application/json
的内容类型。
下一步:
$inp = "I never got set";
if (strlen($json_params) > 0 && isValidJSON($json_params)){
$inp = json_decode($json_params, true);
}
$password = $inp->password;
$password = $inp['password'];
这很糟糕。首先,请参阅json_decode()
参数(第2个) - >你正在解码为数组(true
),而不是对象(false
),所以只有$password = $inp['password'];
才能适用于您的情况。当输入数据无效时,整个代码也将失败,因为$np
是垃圾字符串,而不是您稍后尝试阅读的数组。使用null
作为默认值并检查以前的进一步使用。
下一步:
$res = file_put_contents('gigs.json', json_encode($gigs), FILE_TEXT);
FILE_TEXT
没有file_put_contents()
选项。你也不需要。
一旦你纠正了这些,你就没事了。此外,print_r()
和var_dump()
可能是您希望熟悉的功能,以便进一步调试。
一般来说http://php.net/ - >查找您即将使用的函数。