2017-04-17 712 views
0

我想从json主体(即这是而不是表单数据)的JS客户端收到POST请求,并将.gigs(javascript)数组保存到文件,然后检查.password字段。这是我的代码(基于Receive JSON POST with PHPphp:从POST接收json并保存到文件

$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和错误日志引用Illegal string offset 'password'上面行(1)。没有这个,我得到一个"Success"(全部为相同的密码)。

我不明白发生了什么,也不知道如何安全地获取200,403和500错误消息。

+0

为什么你在阅读'php:// input'的时候说'POST request'?也''inp =“我从来没有设置”;' - >这就是'null'通常是什么。 –

+0

这可能是我滥用的词。我正在从客户端发送ajax POST。我根本不懂PHP,所以我可能会做一些非常错误的事情。 –

+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()自变量(2nd) - >您正在解码到数组(true),而不是对象(false),因此只有$password = $inp['password'];可用于您的情况。当输入数据无效时,整个代码也会失败,因为在这种情况下,$np是垃圾字符串,而不是稍后尝试读取的数组。使用null作为默认值并检查之前的进一步使用情况。

下一页:

$res = file_put_contents('gigs.json', json_encode($gigs), FILE_TEXT); 

有一个为file_put_contents()没有FILE_TEXT选项。你也不需要一个。

一旦你改正这些,你会没事的。另外print_r()var_dump()可能是您希望进一步调试时熟悉的功能。

一般http://php.net/ - >查找您即将使用的函数。

+0

谢谢 - 关于php:// input的建议与大多数评论相矛盾所以我找到了,但我会尝试一下,如果我能解决如何使用它(php.net似乎目前无法访问) –

+0

您是否建议在json_decode中使用或不使用 - “true”?我知道我的两个'$ password ='中的一个必须是错的,但哪个更好? –

+1

'$ _POST'只能用于标准格式编码('application/x-www-form-urlencoded'和'multipart/form-data')。我相信OP期待JSON作为请求体,所以'php:// input'应该没问题。 –