AjaxでPHPでの処理を画面遷移せずにリアルタイムで実行してみる

2023.07.15

PHPでシステムのモックを作っていると、いちいち画面遷移をして処理することがユーザービリティを下げていることに気付いた。

なので、今回はAjaxの非同期通信を使って、画面遷移することなくフォームの内容を送信し、PHPでリアルタイム処理する方法をメモとして残しておく。

jQuery側で定義する処理

まずは非同期通信を行うために、jQueryでの処理を書いていく。

今回は非同期通信を行うことが目的なので、フォームや処理を行うPHPの内容は省略するが、イメージは下記の記事でも作ったフォームを使うと考えてオッケーだ。

【JS】イベントリスナー、ループ、クロージャを組み合わせてボタンを制御する

$(document).ready(function() { //ページの読み込みが完了するまでコードの実行を待つ
    $('.myForm').on('submit', function(event) { //.on()メソッドでsubmitのイベントが発生したときに実行。
        //上記event引数はイベント発生時にイベントハンドラが自動で生成し、引数として渡されれる。そしてそのイベントはsubmit イベントに関連する情報を含んでいるものとして定義されている
        event.preventDefault(); // eventオブジェクトのpreventDefault() メソッドを使い、デフォルトの動作(今回はsubmitでのフォーム送信)を停止
        // Ajaxを使用してフォームデータを非同期に送信
        $.ajax({ //非同期通信(Ajax)を行うための関数
            url: 'save.php', // リクエストを送るURL
            type: 'GET', // リクエストの種類('GET'、'POST'など)
            data: $(this).serialize(), //フォームデータをシリアライズ(要素を文字列化してURLエンコード)。フォームデータを簡単にサーバーに送信する
            //↑フォーム内のすべての入力要素(テキストボックス、チェックボックス、ラジオボタン、など)からデータを取得し、それをURLエンコードした文字列として $.ajax() メソッドに渡す
            success: function(response) { //response という引数は、$.ajax() 関数によって自動的に提供される。
                //success 関数内で response を使うことで、サーバーから返されたデータにアクセスできる。このデータは、通常、サーバーが行った処理の結果や、新たに生成されたデータなどが含まれる
                console.log(response); // // 成功時の処理。デバッグ用にレスポンスをコンソールに出力
                alert('保存に成功しました。');
            },
            error: function(xhr, status, error) {
                //xhrは404などのステータスコードやレスポンスを、statusはリクエストタイムアウトや中断などの状態、errorはサーバーから返されるNot Foundなどのエラーを表す
                //success と errorまたは failのようなコールバック関数はajaxでよく使われる
                console.log(error); // エラー時の処理。デバッグ用にエラー情報をコンソールに出力
                alert('保存に失敗しました。');
            }
        });
    });
});

例のごとく、大量のコメントアウトで解説は書いているので、そちらを読んでもらいたい。

Ajaxでの処理フロー

上記のコードでは主に下記のような流れで処理が行われている。

  • ①$(document).ready(function() で処理を実行
  • ②.on()メソッドでイベントが発生したとき(今回はsubmit押したとき)に実行
  • ③Ajaxの関数を使い、urlやtypeを指定し、フォームデータをシリアライズ化
  • ④戻ってきたresponseを使い、思考失敗の処理を書く

上記のようにすれば、サーバーに通信を行い、③で指定した処理を行うファイル(save.php)を使って処理を行うことが可能になる。

DBを確認してもしっかりとテーブルにデータが入っていたので、上記でフォームの非同期通信を行えばひとまず成功する。

PIC UP