2016-11-04 4 views
1

AJAX呼び出しを使用してフォームデータをPHPスクリプトに送信しようとしています。フォームデータをシリアル化してPOSTメソッドでJSON変数としてPHPスクリプトに送信しています。 Ajaxのデータ変数は正しいようですが、何らかの理由でPHP $ _POST配列が空で、私がここで間違っていることを理解するのに苦労しています。

これは私のAJAX呼び出し

// AJAX 
     var input_data = $('#contact-form').serialize(); 

     event.preventDefault(); 

     $.ajax({ 
      url: 'contact.php', 
      type:'POST', 
      dataType:'json',//return type from server side function [return it as JSON object] 
      contentType: "application/json", 
      data: input_data, //Pass the data to the function on server side 
      success: function (data) { //Array of data returned from server side function 

       $.each(data,function(index){ 
        alert(data[index]); // used for debugging, returns 1 
       }); 
      } 

     }); 

     alert("called"); 
     if(input_data.length < 1) 
     { 
      alert("empty"); 
      alert(input_data); 
     } 
     else 
     { 
      alert("not empty"); 
      alert(input_data); 
     } 
     return false; 

フォーム

<form class="text-center" id="contact-form" method="POST" action="contact.php"> 
        <div class="form-group"> 
         <input type="text" class="form-control" id="name" name="name" placeholder="Name"> 
        </div> 
        <div class="form-group"> 
         <input type="email" class="form-control" id="email" name="email" placeholder="Email"> 
        </div> 
        <div class="form-group"> 
         <textarea class="form-control" rows="5" id="msg" name="msg" placeholder="Type your message"></textarea> 
        </div> 
        <div class="form-group"> 
         <div class="g-recaptcha buffer" data-sitekey="some_key" data-callback="recaptcha_callback"></div> 
         <input type="hidden" class="hiddenRecaptcha required" name="hiddenRecaptcha" id="hiddenRecaptcha"> 
        </div> 


        <button type="submit" class="btn btn-lg btn-primary text-uppercase buffer">Send message</button> 
       </form> 

とPHPコードを実行することにより、最終的に私contact.phpスクリプト

<?php 
    header('Content-Type: application/json'); 

    $name; 
    $email; 
    $msg; 

    $nameErr = $emailErr = $msgErr = 0; 

    if ($_SERVER["REQUEST_METHOD"] == "POST") { 
     if (empty($_POST["name"])) { 
      $nameErr = 1; 
     } 
     else { 
      $name = $_POST["name"]; 
      $nameErr = 0; 
     } 

     if (empty($_POST["email"])) { 
      $emailErr = 1; 
     } 
     else { 
      $email = $_POST["email"]; 
      if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) { 
       $emailErr = 0; 
      } else { 
       $emailErr = 1; 
      } 
     } 

     if (empty($_POST["msg"])) { 
      $msgErr = 1; 
     } 
     else { 
      $msg = $_POST["msg"]; 
      $msgErr = 0; 
     } 

     if($nameErr == 0 && $emailErr == 0 && $msgErr == 0) 
     { 
      $to = "[email protected]"; 
      $subject = 'Contact request - site'; 
      $txt = $_POST['msg']; 
      $headers = "From: " . $_POST['email'] . "\r\n"; 
      mail($to,$subject,$txt,$headers); 
      echo json_encode(array("sent")); 
     } 
     else 
     { 
      echo json_encode(array($nameErr, $emailErr, $msgErr)); 
     } 
    } 
    else 
    { 
     echo json_encode(array("post_error")); 
    } 

?> 

で、メールが正しく送信取得します。 Ajax呼び出しを使用する場合、$ _POST配列は空であり、PHPコードの最後のif文から3つのエラーコードを返します。また、これを実現するためのより良い方法があれば、私は代替案を見て嬉しいです。助けてくれてありがとう、ありがとう。

EDIT:$('#contact-form').serialize()を使用することでJSONデータ

json_data

+0

まず第一に、あなたはjQueryのを使用している場合、なぜちょうど 'の代わりに' $アヤックス() 'のの$ .postを()'は使用しませんか?次に、$ _POST変数がPHPファイルに現れるはずです - PHPファイルの先頭に 'var_dump($ _ POST)'を実行しますか? – junkfoodjunkie

+0

@junkfoodjunkie '$ .post'は' $ .ajax'のエイリアスで、タイプが 'POST'で、何かを変更する必要はありません。 –

+0

これは必要ではありません。とにかく既にPOSTを実行していて、X-HTTPリクエストを行う必要はありません。 – junkfoodjunkie

答えて

1

あなたはjQueryのは、HTTPクエリ文字列key=val&key2=val2&...に定期的なフィールドからのデータを変換します - なりますが、今あなたがcontentTypeapplication/jsonであることを$.ajaxに設定し、 jQueryはリクエストにHTTPヘッダContent-Type: application/jsonを設定します。 jQueryはContent-Typeが間違っているかもしれないと不平を言うことはありません。

POST-RequestにContent-Type application/jsonがあるため、PHPはHTTP POSTデータをスーパーグローバル$_POSTに解析しません。代わりに、生のPOSTデータをphp://inputから読み取る必要があります。

あなたの問題は、HTTP POSTデータがJSONだと言うことですが、送信するものはJSONではなく、HTTPクエリ文字列です。これはHTTPクエリ文字列なので、$.ajax呼び出しからcontentType: "application/json",を削除すると、jQueryが正しいContent-Typeヘッダーを設定します。

jQueryはContent-Typeヘッダーを正しいContent-Typeヘッダーであるapplication/x-www-form-urlencodedに設定します。これがContent-Type PHPパースの1つであるため、HTTP POSTデータは現在、超大国$_POSTで利用可能です。

$_POSTは、特定のコンテンツタイプ、つまりmultipart/form-dataapplication/x-www-form-urlencodedにのみ埋められます。 HTTPコンテンツタイプがどちらでもない場合、$_POSTは埋め込まれず、php://inputからRAW POSTデータを読み取る必要があります。

http://php.net/manual/en/reserved.variables.post.php

+0

だから、これらの線に沿った何かが働くだろうか? '$ str_json = file_get_contents( 'php:// input'); \t $ str_json = json_decode($ str_json); ' –

+0

何?それはまったく間違っています。 $ _POSTはAJAX経由であっても$ _POST変数を受け取るので、ファイルを持たない限りマルチパートとしてエンコードする必要はありません。 – junkfoodjunkie

+0

@ Petar-Krešimirあなたが本当にJSONを送るなら、それはうまくいくはずです。 –

関連する問題