PHPでのjQuery Ajax POSTの例


682

フォームからデータベースにデータを送信しようとしています。これが私が使っているフォームです:

<form name="foo" action="form.php" method="POST" id="foo">
    <label for="bar">A bar</label>
    <input id="bar" name="bar" type="text" value="" />
    <input type="submit" value="Send" />
</form>

典型的なアプローチはフォームを送信することですが、これによりブラウザがリダイレクトされます。jQueryとAjaxを使用して、フォームのすべてのデータをキャプチャし、それをPHPスクリプト(例:form.php)に送信することは可能ですか?


3
削除解除の理由については関連するメタディスカッションを参照してください。
TRiG 2013年

シンプルなバニラjsソリューション:stackoverflow.com/a/57285063/7910454
leonheess

回答:


939

の基本的な使用法は.ajax次のようになります。

HTML:

<form id="foo">
    <label for="bar">A bar</label>
    <input id="bar" name="bar" type="text" value="" />

    <input type="submit" value="Send" />
</form>

jQuery:

// Variable to hold request
var request;

// Bind to the submit event of our form
$("#foo").submit(function(event){

    // Prevent default posting of form - put here to work in case of errors
    event.preventDefault();

    // Abort any pending request
    if (request) {
        request.abort();
    }
    // setup some local variables
    var $form = $(this);

    // Let's select and cache all the fields
    var $inputs = $form.find("input, select, button, textarea");

    // Serialize the data in the form
    var serializedData = $form.serialize();

    // Let's disable the inputs for the duration of the Ajax request.
    // Note: we disable elements AFTER the form data has been serialized.
    // Disabled form elements will not be serialized.
    $inputs.prop("disabled", true);

    // Fire off the request to /form.php
    request = $.ajax({
        url: "/form.php",
        type: "post",
        data: serializedData
    });

    // Callback handler that will be called on success
    request.done(function (response, textStatus, jqXHR){
        // Log a message to the console
        console.log("Hooray, it worked!");
    });

    // Callback handler that will be called on failure
    request.fail(function (jqXHR, textStatus, errorThrown){
        // Log the error to the console
        console.error(
            "The following error occurred: "+
            textStatus, errorThrown
        );
    });

    // Callback handler that will be called regardless
    // if the request failed or succeeded
    request.always(function () {
        // Reenable the inputs
        $inputs.prop("disabled", false);
    });

});

注意:jQueryの1.8以来、.success().error().complete()の賛成で廃止され.done().fail()そして.always()

注:上記のスニペットはDOMの準備ができた後に実行する必要があるため、$(document).ready()ハンドラー内に配置する(または$()省略形を使用する)必要があることに注意してください。

ヒント:次のようにコールバックハンドラをチェーンできます。$.ajax().done().fail().always();

PHP(つまり、form.php):

// You can access the values posted by jQuery.ajax
// through the global variable $_POST, like this:
$bar = isset($_POST['bar']) ? $_POST['bar'] : null;

注:インジェクションやその他の悪意のあるコードを防ぐために、投稿されたデータは常にサニタイズしてください。

上記のJavaScriptコードの.post代わりに省略形を使用することもでき.ajaxます。

$.post('/form.php', serializedData, function(response) {
    // Log the response to the console
    console.log("Response: "+response);
});

注:上記のJavaScriptコードはjQuery 1.8以降で動作するように作成されていますが、jQuery 1.5までの以前のバージョンで動作するはずです。


6
バグを修正するために回答を編集requestしました。ローカル変数として宣言されているため、機能しif (request) request.abort();ません。
Andrey Mikhaylov-lolmaus 2013年

23
この例を使用するために多くの時間を費やしたり、無駄にしたり、投資したりするので、非常に重要なメモです。$(document).readyブロック内でイベントをバインドするか、バインドが実行される前にFORMをロードする必要があります。そうしないと、バインディングが呼び出されない理由を理解するために多くの時間を費やします。
Philibert Perusse 2013年

3
@PhilibertPerusseイベントバインディングと同様に、バインドする前に、または委任されたバインドを使用する場合は、要素がDOMに存在する必要があることは明らかです。
mekwall 2013年

10
はい、わかりました。しかし、私は常に$(document).readyブロックを配置して多くの例を見つけたので、例は自己完結型です。私は、私のように、このエンドアップのコメントのスレッドと、この初心者ヒント"読んでつまずくことがあり、将来のユーザーのためにコメントを書いた
フィリベールPerusse

5
これを独自のコードに適用する場合、 'name'属性は入力にとって重要であり、それ以外の場合serialize()はスキップされます。
ベンフリン

216

jQueryを使用してAjaxリクエストを行うには、次のコードでこれを行うことができます。

HTML:

<form id="foo">
    <label for="bar">A bar</label>
    <input id="bar" name="bar" type="text" value="" />
    <input type="submit" value="Send" />
</form>

<!-- The result of the search will be rendered inside this div -->
<div id="result"></div>

JavaScript:

方法1

 /* Get from elements values */
 var values = $(this).serialize();

 $.ajax({
        url: "test.php",
        type: "post",
        data: values ,
        success: function (response) {

           // You will get response from your PHP page (what you echo or print)
        },
        error: function(jqXHR, textStatus, errorThrown) {
           console.log(textStatus, errorThrown);
        }
    });

方法2

/* Attach a submit handler to the form */
$("#foo").submit(function(event) {
    var ajaxRequest;

    /* Stop form from submitting normally */
    event.preventDefault();

    /* Clear result div*/
    $("#result").html('');

    /* Get from elements values */
    var values = $(this).serialize();

    /* Send the data using post and put the results in a div. */
    /* I am not aborting the previous request, because it's an
       asynchronous request, meaning once it's sent it's out
       there. But in case you want to abort it you can do it
       by abort(). jQuery Ajax methods return an XMLHttpRequest
       object, so you can just use abort(). */
       ajaxRequest= $.ajax({
            url: "test.php",
            type: "post",
            data: values
        });

    /*  Request can be aborted by ajaxRequest.abort() */

    ajaxRequest.done(function (response, textStatus, jqXHR){

         // Show successfully for submit message
         $("#result").html('Submitted successfully');
    });

    /* On failure of request this function will be called  */
    ajaxRequest.fail(function (){

        // Show error
        $("#result").html('There is error while submit');
    });

.success().error()、および.complete()コールバックがで廃止されているjQueryの1.8。最終的な削除のためにコードを準備する.done().fail()は、.always()代わりに、、およびを使用します。

MDN: abort()。リクエストがすでに送信されている場合、このメソッドはリクエストを中止します。

これで、Ajaxリクエストを正常に送信できたので、今度はサーバーにデータを取得します。

PHP

Ajax呼び出し(type: "post")でPOSTリクエストを作成すると、$_REQUESTまたはを使用してデータを取得できるようになります$_POST

  $bar = $_POST['bar']

POSTリクエストで何が得られるかは、どちらかで確認することもできます。ところで、それ$_POSTが設定されていることを確認してください。そうしないと、エラーが発生します。

var_dump($_POST);
// Or
print_r($_POST);

そして、あなたはデータベースに値を挿入しています。クエリを実行する前に、GETまたはPOSTを実行したかどうかに関係なく、すべてのリクエストを適切に感知またはエスケープしていることを確認してください。準備されたステートメントを使用するのが最善です。

また、データをページに戻したい場合は、以下のようにそのデータをエコーするだけで実行できます。

// 1. Without JSON
   echo "Hello, this is one"

// 2. By JSON. Then here is where I want to send a value back to the success of the Ajax below
echo json_encode(array('returned_val' => 'yoho'));

そして、あなたはそれを次のように得ることができます:

 ajaxRequest.done(function (response){
    alert(response);
 });

簡単な方法がいくつかあります。以下のコードを使用できます。同じことを行います。

var ajaxRequest= $.post("test.php", values, function(data) {
  alert(data);
})
  .fail(function() {
    alert("error");
  })
  .always(function() {
    alert("finished");
});

@Clarenceバーは、入力タイプのテキスト名で、$ _POST [「バー」]は、それの値を取得するために使用されているので、私はポストメソッドを訴えておりますので
NullPoiиteя

4
jsonを使用したい人のために-JSONを使用している間、呼び出しにはパラメーター
K. Kilian Lindberg

4
@CarlLindberg-応答のMIMEタイプに基づいてjQueryに推測させたい場合(これはdataType、を設定しない場合の処理​​です)、JSON または他の形式を受け入れる可能性があります
nnnnnn 2013年

@nnnnnnあなたは正しい-それはずっと良い-確かにデフォルトである:Intelligent Guess
K. Kilian Lindberg

JSON応答オブジェクト(data.returned_val)にアクセスするには、元のajax呼び出しに
dataType

56

PHP + Ajaxで投稿する方法の詳細な方法と、失敗時にスローされるエラーを共有したいと思います。

まず、2つのファイルを作成します(例:form.phpと)process.php

まず、formを作成し、jQuery .ajax()メソッドを使用して送信します。残りはコメントで説明されます。


form.php

<form method="post" name="postForm">
    <ul>
        <li>
            <label>Name</label>
            <input type="text" name="name" id="name" placeholder="Bruce Wayne">
            <span class="throw_error"></span>
            <span id="success"></span>
       </li>
   </ul>
   <input type="submit" value="Send" />
</form>


jQueryクライアント側検証を使用してフォームを検証し、データをに渡しますprocess.php

$(document).ready(function() {
    $('form').submit(function(event) { //Trigger on form submit
        $('#name + .throw_error').empty(); //Clear the messages first
        $('#success').empty();

        //Validate fields if required using jQuery

        var postForm = { //Fetch form data
            'name'     : $('input[name=name]').val() //Store name fields value
        };

        $.ajax({ //Process the form using $.ajax()
            type      : 'POST', //Method type
            url       : 'process.php', //Your form processing file URL
            data      : postForm, //Forms name
            dataType  : 'json',
            success   : function(data) {
                            if (!data.success) { //If fails
                                if (data.errors.name) { //Returned if any error from process.php
                                    $('.throw_error').fadeIn(1000).html(data.errors.name); //Throw relevant error
                                }
                            }
                            else {
                                    $('#success').fadeIn(1000).append('<p>' + data.posted + '</p>'); //If successful, than throw a success message
                                }
                            }
        });
        event.preventDefault(); //Prevent the default submit
    });
});

今から見てみましょう process.php

$errors = array(); //To store errors
$form_data = array(); //Pass back the data to `form.php`

/* Validate the form on the server side */
if (empty($_POST['name'])) { //Name cannot be empty
    $errors['name'] = 'Name cannot be blank';
}

if (!empty($errors)) { //If errors in validation
    $form_data['success'] = false;
    $form_data['errors']  = $errors;
}
else { //If not, process the form, and return true on success
    $form_data['success'] = true;
    $form_data['posted'] = 'Data Was Posted Successfully';
}

//Return the data back to form.php
echo json_encode($form_data);

プロジェクトファイルはhttp://projects.decodingweb.com/simple_ajax_form.zipからダウンロードできます。


27

シリアライズを使用できます。以下に例を示します。

$("#submit_btn").click(function(){
    $('.error_status').html();
        if($("form#frm_message_board").valid())
        {
            $.ajax({
                type: "POST",
                url: "<?php echo site_url('message_board/add');?>",
                data: $('#frm_message_board').serialize(),
                success: function(msg) {
                    var msg = $.parseJSON(msg);
                    if(msg.success=='yes')
                    {
                        return true;
                    }
                    else
                    {
                        alert('Server error');
                        return false;
                    }
                }
            });
        }
        return false;
    });

2
$.parseJSON()トータルライフセーバーです、ありがとう。他の回答に基づいて出力を解釈するのに問題がありました。
foochow 14

21

HTML

    <form name="foo" action="form.php" method="POST" id="foo">
        <label for="bar">A bar</label>
        <input id="bar" class="inputs" name="bar" type="text" value="" />
        <input type="submit" value="Send" onclick="submitform(); return false;" />
    </form>

JavaScript

   function submitform()
   {
       var inputs = document.getElementsByClassName("inputs");
       var formdata = new FormData();
       for(var i=0; i<inputs.length; i++)
       {
           formdata.append(inputs[i].name, inputs[i].value);
       }
       var xmlhttp;
       if(window.XMLHttpRequest)
       {
           xmlhttp = new XMLHttpRequest;
       }
       else
       {
           xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
       }
       xmlhttp.onreadystatechange = function()
       {
          if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
          {

          }
       }
       xmlhttp.open("POST", "insert.php");
       xmlhttp.send(formdata);
   }

18

以下のように使います。ファイルのようなすべてのものを送信します。

$(document).on("submit", "form", function(event)
{
    event.preventDefault();

    var url  = $(this).attr("action");
    $.ajax({
        url: url,
        type: 'POST',
        dataType: "JSON",
        data: new FormData(this),
        processData: false,
        contentType: false,
        success: function (data, status)
        {

        },
        error: function (xhr, desc, err)
        {
            console.log("error");
        }
    });
});

14

jQuery Ajaxを使用してデータを送信する場合、フォームタグと送信ボタンは不要です。

例:

<script>
    $(document).ready(function () {
        $("#btnSend").click(function () {
            $.ajax({
                url: 'process.php',
                type: 'POST',
                data: {bar: $("#bar").val()},
                success: function (result) {
                    alert('success');
                }
            });
        });
    });
</script>

<label for="bar">A bar</label>
<input id="bar" name="bar" type="text" value="" />
<input id="btnSend" type="button" value="Send" />

10
<script src="http://code.jquery.com/jquery-1.7.2.js"></script>
<form method="post" id="form_content" action="Javascript:void(0);">
    <button id="desc" name="desc" value="desc" style="display:none;">desc</button>
    <button id="asc" name="asc"  value="asc">asc</button>
    <input type='hidden' id='check' value=''/>
</form>

<div id="demoajax"></div>

<script>
    numbers = '';
    $('#form_content button').click(function(){
        $('#form_content button').toggle();
        numbers = this.id;
        function_two(numbers);
    });

    function function_two(numbers){
        if (numbers === '')
        {
            $('#check').val("asc");
        }
        else
        {
            $('#check').val(numbers);
        }
        //alert(sort_var);

        $.ajax({
            url: 'test.php',
            type: 'POST',
            data: $('#form_content').serialize(),
            success: function(data){
                $('#demoajax').show();
                $('#demoajax').html(data);
                }
        });

        return false;
    }
    $(document).ready(function_two());
</script>

あなたと他の答えの違いは何ですか?
NullPoiиteя

11
私が投稿したものです。
ジョン

6

送信前と送信成功後のAjaxエラーとローダーの処理では、例付きのアラートブートボックスが表示されます。

var formData = formData;

$.ajax({
    type: "POST",
    url: url,
    async: false,
    data: formData, // Only input
    processData: false,
    contentType: false,
    xhr: function ()
    {
        $("#load_consulting").show();
        var xhr = new window.XMLHttpRequest();

        // Upload progress
        xhr.upload.addEventListener("progress", function (evt) {
            if (evt.lengthComputable) {
                var percentComplete = (evt.loaded / evt.total) * 100;
                $('#addLoad .progress-bar').css('width', percentComplete + '%');
            }
        }, false);

        // Download progress
        xhr.addEventListener("progress", function (evt) {
            if (evt.lengthComputable) {
                var percentComplete = evt.loaded / evt.total;
            }
        }, false);
        return xhr;
    },
    beforeSend: function (xhr) {
        qyuraLoader.startLoader();
    },
    success: function (response, textStatus, jqXHR) {
        qyuraLoader.stopLoader();
        try {
            $("#load_consulting").hide();

            var data = $.parseJSON(response);
            if (data.status == 0)
            {
                if (data.isAlive)
                {
                    $('#addLoad .progress-bar').css('width', '00%');
                    console.log(data.errors);
                    $.each(data.errors, function (index, value) {
                        if (typeof data.custom == 'undefined') {
                            $('#err_' + index).html(value);
                        }
                        else
                        {
                            $('#err_' + index).addClass('error');

                            if (index == 'TopError')
                            {
                                $('#er_' + index).html(value);
                            }
                            else {
                                $('#er_TopError').append('<p>' + value + '</p>');
                            }
                        }
                    });
                    if (data.errors.TopError) {
                        $('#er_TopError').show();
                        $('#er_TopError').html(data.errors.TopError);
                        setTimeout(function () {
                            $('#er_TopError').hide(5000);
                            $('#er_TopError').html('');
                        }, 5000);
                    }
                }
                else
                {
                    $('#headLogin').html(data.loginMod);
                }
            } else {
                //document.getElementById("setData").reset();
                $('#myModal').modal('hide');
                $('#successTop').show();
                $('#successTop').html(data.msg);
                if (data.msg != '' && data.msg != "undefined") {

                    bootbox.alert({closeButton: false, message: data.msg, callback: function () {
                            if (data.url) {
                                window.location.href = '<?php echo site_url() ?>' + '/' + data.url;
                            } else {
                                location.reload(true);
                            }
                        }});
                } else {
                    bootbox.alert({closeButton: false, message: "Success", callback: function () {
                        if (data.url) {
                            window.location.href = '<?php echo site_url() ?>' + '/' + data.url;
                        } else {
                            location.reload(true);
                        }
                    }});
                }

            }
        }
        catch (e) {
            if (e) {
                $('#er_TopError').show();
                $('#er_TopError').html(e);
                setTimeout(function () {
                    $('#er_TopError').hide(5000);
                    $('#er_TopError').html('');
                }, 5000);
            }
        }
    }
});

5

私はこの単純な1行のコードを何年も問題なく使用しています(jQueryが必要です)。

<script src="http://malsup.github.com/jquery.form.js"></script> 
<script type="text/javascript">
    function ap(x,y) {$("#" + y).load(x);};
    function af(x,y) {$("#" + x ).ajaxSubmit({target: '#' + y});return false;};
</script>

ここで、ap()はAjaxページを意味し、af()はAjaxフォームを意味します。フォームでは、単にaf()関数を呼び出すと、フォームがURLに送信され、目的のHTML要素に応答が読み込まれます。

<form id="form_id">
    ...
    <input type="button" onclick="af('form_id','load_response_id')"/>
</form>
<div id="load_response_id">this is where response will be loaded</div>

サーバーファイルを含めてください!テスト方法がわからない。
ジョニー、なぜ

4

phpファイルに次のように入力します。

$content_raw = file_get_contents("php://input"); // THIS IS WHAT YOU NEED
$decoded_data = json_decode($content_raw, true); // THIS IS WHAT YOU NEED
$bar = $decoded_data['bar']; // THIS IS WHAT YOU NEED
$time = $decoded_data['time'];
$hash = $decoded_data['hash'];
echo "You have sent a POST request containing the bar variable with the value $bar";

そしてあなたのjsファイルでデータオブジェクトとajaxを送信してください

var data = { 
    bar : 'bar value',
    time: calculatedTimeStamp,
    hash: calculatedHash,
    uid: userID,
    sid: sessionID,
    iid: itemID
};

$.ajax({
    method: 'POST',
    crossDomain: true,
    dataType: 'json',
    crossOrigin: true,
    async: true,
    contentType: 'application/json',
    data: data,
    headers: {
        'Access-Control-Allow-Methods': '*',
        "Access-Control-Allow-Credentials": true,
        "Access-Control-Allow-Headers" : "Access-Control-Allow-Headers, Origin, X-Requested-With, Content-Type, Accept, Authorization",
        "Access-Control-Allow-Origin": "*",
        "Control-Allow-Origin": "*",
        "cache-control": "no-cache",
        'Content-Type': 'application/json'
    },
    url: 'https://yoururl.com/somephpfile.php',
    success: function(response){
        console.log("Respond was: ", response);
    },
    error: function (request, status, error) {
        console.log("There was an error: ", request.responseText);
    }
  })

またはform-submitをそのまま使用します。これは、クライアントによって入力された一部のフォームデータだけでなく、計算された追加コンテンツを含む変更されたリクエストを送信する場合にのみ必要です。たとえば、ハッシュ、タイムスタンプ、ユーザーID、セッションIDなどです。


2

こちらをご確認ください。これは完全なAjax要求コードです。

$('#foo').submit(function(event) {
    // Get the form data
    // There are many ways to get this data using jQuery (you
    // can use the class or id also)
    var formData = $('#foo').serialize();
    var url = 'URL of the request';

    // Process the form.
    $.ajax({
        type        : 'POST',   // Define the type of HTTP verb we want to use
        url         : 'url/',   // The URL where we want to POST
        data        : formData, // Our data object
        dataType    : 'json',   // What type of data do we expect back.
        beforeSend : function() {

            // This will run before sending an Ajax request.
            // Do whatever activity you want, like show loaded.
        },
        success:function(response){
            var obj = eval(response);
            if(obj)
            {
                if(obj.error==0){
                    alert('success');
                }
                else{
                    alert('error');
                }
            }
        },
        complete : function() {
            // This will run after sending an Ajax complete
        },
        error:function (xhr, ajaxOptions, thrownError){
            alert('error occured');
            // If any error occurs in request
        }
    });

    // Stop the form from submitting the normal way
    // and refreshing the page
    event.preventDefault();
});

これは私が探しているものです。
Nirav Bhoi

2

これは jQueryフォームの送信について知っておく必要があるすべてを含む非常に優れた記事です。

記事の要約:

シンプルなHTMLフォーム送信

HTML:

<form action="path/to/server/script" method="post" id="my_form">
    <label>Name</label>
    <input type="text" name="name" />
    <label>Email</label>
    <input type="email" name="email" />
    <label>Website</label>
    <input type="url" name="website" />
    <input type="submit" name="submit" value="Submit Form" />
    <div id="server-results"><!-- For server results --></div>
</form>

JavaScript:

$("#my_form").submit(function(event){
    event.preventDefault(); // Prevent default action
    var post_url = $(this).attr("action"); // Get the form action URL
    var request_method = $(this).attr("method"); // Get form GET/POST method
    var form_data = $(this).serialize(); // Encode form elements for submission

    $.ajax({
        url : post_url,
        type: request_method,
        data : form_data
    }).done(function(response){ //
        $("#server-results").html(response);
    });
});

HTML Multipart / form-dataフォーム送信

ファイルをサーバーにアップロードするには、XMLDataRequestオブジェクトで構成され、jQuery Ajaxを使用して簡単にサーバーに送信できるXMLHttpRequest2で利用可能なFormDataインターフェイスを使用できます。

HTML:

<form action="path/to/server/script" method="post" id="my_form">
    <label>Name</label>
    <input type="text" name="name" />
    <label>Email</label>
    <input type="email" name="email" />
    <label>Website</label>
    <input type="url" name="website" />
    <input type="file" name="my_file[]" /> <!-- File Field Added -->
    <input type="submit" name="submit" value="Submit Form" />
    <div id="server-results"><!-- For server results --></div>
</form>

JavaScript:

$("#my_form").submit(function(event){
    event.preventDefault(); // Prevent default action
    var post_url = $(this).attr("action"); // Get form action URL
    var request_method = $(this).attr("method"); // Get form GET/POST method
    var form_data = new FormData(this); // Creates new FormData object
    $.ajax({
        url : post_url,
        type: request_method,
        data : form_data,
        contentType: false,
        cache: false,
        processData: false
    }).done(function(response){ //
        $("#server-results").html(response);
    });
});

これがお役に立てば幸いです。


2

Fetch APIの導入以来、jQuery AjaxまたはXMLHttpRequestsを使用してこれを行う理由はありません。フォームデータをバニラJavaScriptのPHPスクリプトにPOSTするには、次のようにします。

function postData() {
    const form = document.getElementById('form');
    const data = new FormData();
    data.append('name', form.name.value);

    fetch('../php/contact.php', {method: 'POST', body: data}).then(response => {
        if (!response.ok){
            throw new Error('Network response was not ok.');
        }
    }).catch(err => console.log(err));
}
<form id="form" action="javascript:postData()">
    <input id="name" name="name" placeholder="Name" type="text" required>
    <input type="submit" value="Submit">
</form>

以下は、データを取得してメールを送信するPHPスクリプトの非常に基本的な例です。

<?php
    header('Content-type: text/html; charset=utf-8');

    if (isset($_POST['name'])) {
        $name = $_POST['name'];
    }

    $to = "test@example.com";
    $subject = "New name submitted";
    $body = "You received the following name: $name";

    mail($to, $subject, $body);

Internet ExplorerのサポートがjQuery AJAXを使い続ける理由かもしれません
Huub S

@HuubSなんで?ポリフィルを使用するだけです。jQueryは私見で死んでいます。
レオニース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.