郵便番号住所検索

郵便番号住所検索ファイル作成概要

PEAR::XML_RPC2 の機能を使って、郵便番号から住所を表示するファイルを作成します。
ネットワ-ク経由で XML_RPC サ-ビスを利用します。
郵便専門ネット https://yubin.senmon.net/
が提供する住所検索サ-ビスを PHP アプリから利用します。

郵便番号住所検索ファイル作成

郵便番号住所検索 PHP ファイル Yubin.php を作成します。
まず最初に、63Pear Village に戻り、左サイドナビ「郵便番号住所検索」の中の
「郵便番号住所検索 PHPファイル」
を見てください。

入力フォ-ム作成

<form method="POST" action="">
で入力フォ-ムを作成します。
method="POST" ですからフォ-ムに入力されたデ-タのみを本文として送信します。
action="" ですからデ-タをこのファイルに向けて送信し、又戻ってきます。

XML_RPC2_CachedClient::createインスタンス

XML_RPC2サ-ビスのアクセス管理は XML_RPC2_CachedClient クラスにより行います。
XML_RPC2_CachedClient をインスタンスするためには、create メソッドを使用します。
なぜ create なんだ、インスタンスに factory とか勝手な名前をつけるな!
と思っているのですが、PEAR ではインスタンスするのにメソッドが必要になれば勝手に 名前をつけちゃうみたいです!
順番に、create メソッドに必要なものを説明していきます。

サ-ビスurl

今回は郵便専門ネット
'https://yubin.senmon.net/service/xmlrpc/',
を指定します。

パラメ-タ基本情報

連想配列 array で指定します。
名前空間:prefix  yubin
その他:
 文字コ-ドとかが設定できるようです。
デフォルトは UTF-8 のようです。
今回は省略しました。

パラメ-タ オプション cacheOptions

これも名前空間 prefix に続けて連想配列 array で指定します。

cacheDir

キャシュの保管フォルダを指定します。
今回は tmp としました。
パス末尾にはスラッシュ / を書きます。
c:\xampp\htdocs の中に \zip_search\tmpのようにフォルダ tmp をあらかじめ作成して おいてください。
ここにキャシュ値が入ります。
1個の未知の郵便番号を検索すると1個キャシュ値が増えるようです。

lifeTime

キャシュの有効期間(秒)です。
今回は3600を設定しています。
具体的には1時間となります。

その他 Cashe_Lite

他にも Cashe_Lite クラス(詳細勉強不足)で利用できるパラメ-タがそのまま 使用可能なようですが、デフォルト値のままとし、今回は設定は省略すること にしました。

fetchAddressByPostcode メソッド

このメソッドを使用すると指定された郵便番号に合致する住所情報を連想配列の形式で返してきます。
戻値は下記の通りです。

項目 フィ-ルド名 数値or文字列 戻値の文字型等
郵便ID yid int
デ-タタイプ data_ type string p=住所 j= 事業所
地方公共団体コ-ド jis code string
郵便番号 post code string
都道府県名 pref string UTF-8
都道府県名カナ pref_ kana string UTF-8; data_type =pのみ
市区 city string UTF-8
市区カナ city_ kana string UTF-8; data_type =pのみ
町村 town string UTF-8
町村カナ town_ kana string UTF-8; data_type =pのみ
事業所名 addr_ name string UTF-8; data_type =jのみ
事業所名カナ addr_ name_ kana string UTF-8; data_type =jのみ
町域番地 other string UTF-8; data_type =jのみ

isset関数

このファイルには何カ所か isset 関数が出てきますので、これについて少し説明します。
if(isset($_POST['postnum'])){
  $ponum = $_POST['postnum'];
}
この書き方はよく出てきますね。
isset の使い方の定番、定石ですよね。
$_POST['postnum'] の入れ物があって変数がセットされていれば、
$ponum = $_POST['postnum'];
ですね。
入れ物があっても変数がセットされていないか、
(一度も値が代入されておらず初期化されていない変数は「NULL」が格納されていると見なされる)
あるいは、$_POST['postnum'] の入れ物がない、影も形もなければ、 何もしないということになります。
!isset はこの逆ということになります。
この辺が、最初、私にはよく理解できない事柄でした。
みなさんは正確に理解できていますか?

try~catch 命令

何かの理由で郵便専門ネットに接続できなかった場合、XML_RPC2_CachedClient クラスは、Exception $e 例外を発生します。
この Exception クラスは、xampp では、
C:\xampp\php\pear\XML\RPC2\Exception.php
の中にあり、CachedClient.php の中から呼び出されます。
「例外処理」というのは、「例外」が投げられた場合の処理の事です。
まず「例外」って何なのか?大雑把に言うと「エラー(問題)」の事です。
通常は、エラーが発生したら「エラーです」とそこで処理を中断するか、何事も無かったかのようにスルーしてしまいます。
「例外処理」では、実行中にエラーが発生した場合の処理を記述しておいて、エラーが発生した場合でも処理の中断はせず、 発生したエラーを「例外」として“投げ”、記述しておいた“エラー発生時の処理”を実行します。
この“エラー発生時の処理”が「例外処理」であり、これを実現するのが「例外処理機能」です。
要するに、何か問題が発生した場合に“エラーだから止めた”ではなく、 “エラーみたいですよ”と報告し、その報告を受け取って何かしらの処置をするのが「例外処理」です。
try~catch 命令は、tryブロックと catch ブロックからなっています。
例外の発生する可能性のある fetchAddressByPostcode メソッドを「トライ」して、トライ中にエラーが発生したら トライを中断し、発生した Exception $e 例外を「キャッチ」して「エラー時用処理」を実行します。
$e の中には例外メッセ-ジ等が入っており、get**** メソッドでその内容を知る事ができます。
例えば、
例外メッセ-ジ内容は、$e->getMessage());
例外コ-ド内容は、$e->getCode());
で読取る事ができます。
他にも $e の中には情報があるようですが、詳細は不明です。
なお、die 関数は指定されたメッセ-ジを出力してスクリプトを強制終了させます。

try~catch 命令を勉強する

try~catch 命令は奥がかなり深いです。
独習PHP 第2版 山田祥寛 著 (株)翔泳社
P334 および10.6章-例外処理P413 参照
を読むと勉強できます。
参考にされてください。

foreach 文で住所要素に分解

$resultの中に住所内容のデ-タが配列として入っていますので、 配列 $address の要素の数だけ繰返して要素に分解します。
しかし実際に使用する要素は、
$address['pref']、$address['city']、$address['town]、$address['other']
だけで、しかも、$address['town]、$address['other']の二つは処理を追加する必要があります。

戻値の利用

今回利用している戻値は、pref、city、town、other の4つです。
ただし、otherはいつも空です。
$addess['other'] が NULL になっているのか、$addess['other'] 自体が存在しないのかは不明です。
$addess['other'] を読出そうとするとエラ-になってしまうので、
if(!isset($addess['other'])){
   $addess['other'] = "";
}
すなわち、!isset で
$addess['other'] が NULL になっているか、$addess['other'] 自体が存在しない時は、 $addess['other'] = ""; としてエラ-を回避しています。
いつ戻ってくるのだろう?

町村 town 戻値の具体例

town 戻値の具体例として郵便番号2160000を検索するとtownの戻値は、
'宮前区 以下に掲載がない場合'
のようになってしまいます。
仕方ないので、str_replace 命令で、
'以下に掲載がない場合'
の文字列を消去しています。
str_replace 関数は検索文字列に一致したすべての文字列を置換し、置き換えた後の文字列を返す関数です。
str_replace ("検索文字列", "置換え文字列", "対象文字列","置き換えた文字列の個数を格納する変数");
のように使います。
今回の場合ですと、
"検索文字列"= $address['town']
"置換え文字列"= '  '  空白
"対象文字列"= '以下に掲載がない場合'
"置き換えた文字列の個数を格納する変数"= $cnt
となります。
ただし、今回 $cnt は利用していません。


郵便番号住所検索ファイル動作確認に続く
郵便番号住所検索概要に戻るく

63 Pear Villageに戻る