2017-04-17 39 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'應該沒問題。 –