JavaScript & PHP: 郵便番号から住所を自動入力する

JavaScript & PHP: 郵便番号から住所を自動入力する

2024年1月29日

問い合わせフォームなどでユーザーに住所を入力してもらうときには、郵便番号から他のフィールドに自動入力させることでユーザビリティが向上します。
zipcloudのAPIは無料で使えるので、試してみてはどうでしょうか?
免責事項などをよく読んで、ご利用ください。

単に自動入力をさせるだけなら、PHPだけでも良いのですがページの一番上ではなく問い合わせフォームをページ下部に配置する場合などは、フォーム送信した時にページ上部に戻ってしまいます。
それですとユーザビリティが良くないので非同期通信を行いスクロールせずに読み直すようにします。

JavaScript

JavaScript関数 fetchAddress: この関数は、フォームが送信されたときに呼び出されます。

郵便番号を取得して、非同期リクエスト(AJAXリクエスト)を行います。
fetchを使用して、PHPスクリプト(address_fetch.php)に郵便番号を送信します。
レスポンスが返されたら、そのデータを使って住所のフィールドを更新します。
エラーがある場合はコンソールにエラーを表示します。
最後にreturn false;を使用して、フォームのデフォルトの送信動作(ページの再読み込み)を防ぎます。

        function fetchAddress() {
            const zipcode = document.getElementById('zipcode').value;

            if (zipcode.length === 7) {
                fetch(`address_fetch.php?zipcode=${zipcode}`)
                .then(response => response.json())
                .then(data => {
                    if (data.status === "OK") {
                        document.getElementById('prefecture').value = data.prefecture;
                        document.getElementById('city').value = data.city;
                        document.getElementById('restAddress').value = data.restAddress;
                    } else {
                        alert(data.message);
                    }
                })
                .catch(error => {
                    console.error('Error:', error);
                });
            }

            return false; // フォームのデフォルトの送信を防止
        }

HTML

    <form onsubmit="return fetchAddress();">
        <label for="zipcode">郵便番号:</label>
        <input type="text" id="zipcode" name="zipcode" required>

        <input type="submit" value="検索">

        <label for="prefecture">都道府県:</label>
        <input type="text" id="prefecture" name="prefecture" readonly>

        <label for="city">市区町村:</label>
        <input type="text" id="city" name="city" readonly>

        <label for="restAddress">町域名:</label>
        <input type="text" id="restAddress" name="restAddress" readonly>
    </form>

PHP

郵便番号の取得: $_GET[‘zipcode’]を使用して、AJAXリクエストから郵便番号を取得します。

APIリクエスト: file_get_contentsを使用して、指定されたAPIに郵便番号をパラメータとして送信し、レスポンスを取得します。

レスポンスの処理:
APIからのレスポンスをJSON形式でデコードします。
レスポンスが成功かつ結果が含まれている場合、住所情報を抽出し、JSON形式でクライアントに送り返します。
エラーが発生した場合、エラーメッセージを含むJSONを送り返します。
JSON形式のレスポンス: header(‘Content-Type: application/json’);を使用して、レスポンスがJSON形式であることを指定します。

この方法により、フォームの送信時にページの再読み込みを防ぎ、現在のスクロール位置を維持しながら住所情報を取得し表示できます。また、非同期処理によりユーザビリティが向上します。

if (isset($_GET['zipcode'])) {
    $zipcode = $_GET['zipcode'];
    $apiUrl = "https://zipcloud.ibsnet.co.jp/api/search?zipcode=" . urlencode($zipcode);
    $response = file_get_contents($apiUrl);
    $result = json_decode($response, true);

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

    if ($result["status"] == 200 && !empty($result["results"])) {
        $addressData = $result["results"][0];
        echo json_encode([
            "status" => "OK",
            "prefecture" => $addressData["address1"],
            "city" => $addressData["address2"],
            "restAddress" => $addressData["address3"]
        ]);
    } else {
        echo json_encode([
            "status" => "ERROR",
            "message" => "住所が見つかりませんでした。"
        ]);
    }
}

サンプル

[myphp file=’/tools/zipcode/zip-auto’]