住所検索APIの作成
郵便番号から住所検索するAPIを作成します。
アプリケーションなどから呼び出し、自動的に住所入力を補完する際に便利なAPIです。
動作環境
・ PHP5以上
・ sqlite3
汎用性を考慮して、フレームワークなどは使用しません。
レンタルサーバ等ではsqliteが使用できない場合があるので、事前にご確認ください。
郵便番号データのダウンロード
まず最初に、郵便局のサイトから全国の郵便番号データ(CSV)をダウンロードします。
「都道府県一覧」の「全国一括」を選択してください。
郵便番号データダウンロード
https://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html
ken_all.zip というZIPデータを解凍すると、KEN_ALL.CSV が出てきます。
1. CSVの不要なデータを削除したいので、Excelで表示し、10番目以降の列を削除します。
2. CSVデータの文字コードをShift-JISからUTF8に変換します。(miエディタなどを使用)
データベースの作成
1. データーベースの作成
sqlite3 zipcode.sqlite
2. テーブルの作成
create table zipcode(
gov_code,
old_zipcode,
zipcode,
kana_prefectures,
kana_municipality,
kana_town_area,
prefectures,
municipality,
town_area
);
3. インデックスの作成
create index zipcode_index on zipcode(zipcode);
4. CSVからsqliteデータベースに変換
sqlite3 -separator , zipcode.sqlite ".import KEN_ALL.CSV zipcode"
PHPプログラム
郵便番号クエリ(q)を受け取り、住所データをJSON形式で返答します。
郵便番号はハイフン無しの7桁数値です。
<?php
$zipcode = $_GET['q'];
if (empty($zipcode) || !is_numeric($zipcode) || mb_strlen($zipcode) != 7) {
$error = array();
$error['code'] = 400;
$error['message'] = 'Bad Request';
echo(json_encode($error));
return;
}
$db = new PDO('sqlite:zipcode.sqlite');
$sql = sprintf('SELECT * FROM zipcode WHERE zipcode = \'%s\';', $zipcode);
$query = $db->prepare($sql);
$query->execute();
$result = $query->fetchAll(PDO::FETCH_ASSOC);
$response = array();
if (!empty($result)) {
$response['code'] = 200;
$response['data'] = $result[0];
} else {
$response['code'] = 404;
$response['message'] = 'Not Found';
}
echo(json_encode($response));
htaccessの編集
# PHPの拡張子なしアクセス
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php
# sqliteファイルのアクセス禁止
<Files ~ "(\.sqlite|db)$">
deny from all
</Files>
動作テスト
https://hoge.com/zipcode?q=1000000
{
"code": 200,
"data": {
"gov_code": "13101",
"old_zipcode": "100",
"zipcode": "1000000",
"kana_prefectures": "トウキョウト",
"kana_municipality": "チヨダク",
"kana_town_area": "イカニケイサイガナイバアイ",
"prefectures": "東京都",
"municipality": "千代田区",
"town_area": "以下に掲載がない場合"
}
}
お問い合わせ
気軽にご相談ください。
ご予算に応じて柔軟に対応させて頂きます。
ご予算に応じて柔軟に対応させて頂きます。