三重県の郵便番号を 5140001 のような形で入力し,住所を入力しようとすると,郵便番号からわかる住所の部分が自動的に入ります。
このページのソースはブラウザから見ることができます。Ajaxにかかわるところは以下の部分です:
<script>
function doit() {
const z = encodeURIComponent(document.getElementById("zip").value);
fetch("lookup.php",
{ method: "POST",
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: "zip=" + z })
.then(response => response.text())
.then(data => document.getElementById("address").value = data);
}
</script>
フォームの部分は次のようになっています:
<form method="post"> <p>郵便番号:<input name="zip" id="zip" onchange="doit();"><br> 住所:<input name="address" id="address"><br> <input type="submit" value="送信"></p> </form>
サーバ側の処理を行う lookup.php は次のようになっています:
<?php
header('Content-Type: text/html; charset=UTF-8');
if ($_POST['zip']) {
try {
$db = new PDO('sqlite:yuubin.db');
$st = $db->prepare("select address from yuubin where zip=? limit 1");
$st->bindParam(1, $_POST['zip']);
$st->execute();
$a = $st->fetch();
echo $a[0];
} catch (PDOException $e) {
echo "エラー";
}
}
?>
yuubin.dbはSQLiteのデータベースで,次のような形の表yuubinを含みます:
| zip | address |
|---|---|
| 5140001 | 三重県津市江戸橋 |
| 5140008 | 三重県津市上浜町 |
| …… | …… |
このような表を作る方法を以下に解説します。
郵便番号データは日本郵便の郵便番号データダウンロードからダウンロードできます。何種類かありますが,どれを使ってもかまいません。以下の例では「読み仮名データの促音・拗音を小書きで表記するもの」を使いました。また,三重県のデータだけに限定しています。これは次のようなCSV形式になっています。三重県のデータだけでも2480件あります(2022年1月現在)。
24201,"514 ","5140000","ミエケン","ツシ","イカニケイサイガナイバアイ","三重県","津市","以下に掲載がない場合",0,0,0,0,0,0 24201,"514 ","5140017","ミエケン","ツシ","アイオイチョウ","三重県","津市","相生町",0,0,0,0,0,0 24201,"51411","5141139","ミエケン","ツシ","アオバダイ","三重県","津市","青葉台",0,0,1,0,0,0
3番目が7桁郵便番号,7〜9番目が住所です。これらだけをタブ区切りのUTF-8ファイルに書き出すには,Pythonなら次のようにします:
import pandas as pd
df = pd.read_csv("24MIE.CSV", header=None, encoding="cp932")
df2 = pd.DataFrame({"番号": df[2], "住所": df[6] + df[7] + df[8]})
df2.to_csv("24mie-utf8.tsv", index=False, header=False, sep="\t")
Rなら次のようにします:
x = read.csv("24MIE.CSV", header=FALSE, fileEncoding="CP932")
y = data.frame(x$V3, paste0(x$V7, x$V8, x$V9))
write.table(y, "24mie-utf8.tsv", quote=FALSE, sep="\t", row.names=FALSE,
col.names=FALSE, fileEncoding="UTF-8")
これをデータベースに読み込ませるには,次のようにします:
sqlite3 yuubin.db create table yuubin(zip text, address text); .separator "\t" .import 24mie-utf8.tsv yuubin .quit
.separator "," とすればCSVも読めます(データ中にコンマがない場合)。
「以下に掲載がない場合」という文字列は省いておくほうがいいでしょう。どうやれば省けるか考えてください。
郵便番号CSVはいろいろややこしいところがあります。詳しくはこちらをご覧ください。
住所フォームについてはケンオールさんのこれだけは押さえよう!住所フォームの作り方が参考になります。