忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

JavaScript jQueryでAjaxを使いPHPからデータを取得する方法その2(郵便番号からの住所取得)

前回の「Ajaxを使いPHPからデータを取得する方法」では例として郵便番号からの住所取得を挙げましたが、 それのデモ的なものを示したいと思います。

先ずは郵便番号のCSVファイルを以下のサイトからダウンロードする必要があります。

郵便番号データダウンロード

今回はデモなので東京都のデータのみを利用しました。

HTML ファイル側のソースですが以下の様になります。
Ajax からの正常戻りの関数で、 PHPからのデータが住所1,住所2,住所3を配列にしたものを返してくるので、 分解してそれぞれの表示タグに設定しています。

■Ajaxを使いPHPからデータを取得するHTMLファイルその2

<html>
<head>
<meta charset="utf-8">
<title>test ajax</title>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
//Ajax関数
function getData() {
    // マスタデータの取得
    $.ajax({
        type: "POST"
      , url: "./ajax2.php"
      , data: { zip: $("#zip").val() }
    }).done(function(res){
        // ajaxがOK
        // JSON形式から文字列に変換
        var data = JSON.parse(res);
        // [,]で分解
        var arr = (""+data).split(',');
        // 住所の表示
        $("#addr1").text(arr[0]);
        $("#addr2").text(arr[1]);
        $("#addr3").text(arr[2]);
    }).fail(function() {
        // 取得エラー
        alert('取得エラー');
    }).always(function() {
        // 後処理(処理することが在れば)
    });
    return false;
}
</script>
</head>
<body>
    <h2>test ajax json 2</h2>
    郵便番号("-"無し):<input type="text" id="zip" size="10" maxlength="7" /><br />
    <p id="addr1">テスト住所1</p>
    <p id="addr2">テスト住所2</p>
    <p id="addr3">テスト住所3</p>
    <button onclick="getData();">Ajax</button>
</body>
</html>

外部PHPファイル ajax2.php 及び 13TOKYO.CSV がこのHTMLファイルと同じディレクトリに存在することにします。

■外部PHPファイル ajax2.php

<?php
// 郵便番号CSVファイル読込、配列データで返す
// (KEY:郵便番号 => array(住所1, 住所2, 住所3) )
function getZipCsv($filename) {
    // ZIPデータ配列
    $arrZip = array();
    // ファイルを開く
    $fp = fopen($filename, 'r');
    // whileで行末までループ処理
    while (!feof($fp)) {
        // fgetsでファイルを読み込み、変数に格納
        $txt = fgets($fp);
        if ($txt == "") continue;
        // SJISからUTF8への文字コード変換
        $txt = mb_convert_encoding($txt, 'UTF-8', 'sjis-win');
        // ["]を省く
        $txt = str_replace('"', '', $txt);
        // [,]で配列に分解
        $arr = explode(',', $txt);
        // 3カラム目をキーにして住所1, 住所2, 住所3を配列で退避
        $arrZip[$arr[2]] = array($arr[6], $arr[7], $arr[8]);
    }
    // fcloseでファイルを閉じる
    fclose($fp); 
    // 郵便番号配列データを返す
    return $arrZip;
}

// 郵便番号の取得
$zip = "";
if (isset($_POST["zip"]) == true && $_POST["zip"] != "") {
    $zip = $_POST["zip"];
}

// 東京の郵便番号CSVファイルを変数に格納
$arrZipData = getZipCsv('./13TOKYO.CSV');

$arrRet = array( "", "", "");
if ($zip != "" && array_key_exists($zip, $arrZipData)) {
    // 郵便番号のキーが存在
    $arrRet = $arrZipData[$zip];
}

// 結果を返す
echo(json_encode($arrRet));

このPHPファイルの関数 getZipCsv は指定されたCSVファイルをオープンし、 1行毎に読込を行い、SJISからUTF8への文字コード変換を行った後で 郵便番号をキーとした配列に住所データを格納しています。

POSTされた zip を取得し、その値をキーとして、郵便番号配列データから 該当データを取得し JSON データに変換して echo 関数で返してやります。

今回は東京都のデータしかありませんが、本当ならば全国のデータに対応する必要があります。 そのためにはこの様なCSVファイルを都度読込んで処理するには重すぎるので、 データベースに郵便番号マスタを作成して、そこから取得するのが一般的だと思います。












PR

コメント

コメントを書く