php:从POST接收json并保存到文件

时间:2017-04-17 14:54:29

标签: php json

我想从带有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;,那么正确的密码就在那里
  • 如果我取消注释我要执行的第2行,那么我会返回500,错误日志会引用上面第(1)行中的Illegal string offset 'password'。没有它,我得到一个"Success"(全部用于相同的密码)。

我不明白发生了什么,也不了解如何安全地收到200,403和500条错误消息。

1 个答案:

答案 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/ - >查找您即将使用的函数。