2017-04-17 12 views
0

json本体(つまりはフォームデータではなくではありません)を持つJSクライアントからPOSTリクエストを受け取り、.gigs(javascript)配列をファイル.passwordフィールドを確認した後。これは私が見つける何(Receive JSON POST with PHPに基づいて)すべての私のコードphp: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;ならば、正しいパスワードが

  • がI場合があり

    • ということですコメント解除私がやりたい2行目、そして私は500を返し、エラーログは上記の行(1)のIllegal string offset 'password'を参照します。それがなければ、私は"Success"(すべて同じパスワード)を返します。

    何が起こっているのか、また、200,403、および500のエラーメッセージを安全に取得する方法についてはわかりません。

  • +0

    なぜあなたは 'php:// input'を読んでいるときに' POST request'と言うのですか?また、 '$ inp ="私は決して設定されていません "; - それは' null'が普通のためです。 –

    +0

    これは私の言葉の乱用かもしれません。私はクライアントからajax POSTを送信しています。私はPHPを全く理解していないので、間違ったことをしている可能性があります。 –

    +0

    さて、ほとんどのことが間違っています。 –

    答えて

    1

    $json_params = file_get_contents("php://input"); 
    

    スクリプトは、HTMLフォームから来ているように、彼らはあなたがphp://input、あなたのコンテンツに$_POSTをない使用することを検討すべきデータを渡し、通常のHTTPリクエスト時に実行している場合。リクエスト本体に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

    Thanks - 'php:// input'に関するあなたのアドバイスは、あなたが見つかりましたが、私はそれを使用する方法を試すことができます(php.netが現在到達できないようです) –

    +0

    json_decodeで - "true"を使用することをお勧めしますか?私の2つの '$ password ='の私のものは間違っていなければならないが、これはもっと良い方法だと分かっている。 –

    +1

    '$ _POST'は標準形式のエンコーディング(' application/x-www-form-urlencoded'と 'multipart/form-data')でのみ使用できます。 OPはJSONをリクエスト本体として期待しているので、 'php:// input'はうまくいくはずです。 –

    関連する問題