////////////////////////////////////////
住所から郵便番号及び住所詳細検索 Read Me
////////////////////////////////////////
LAST UPDATE：2010.10.14
AUTHOR		:T.Matsushige


++++++使い方・機能++++++
都道府県（セレクトボックス）、市名（フリーワード）、町名（フリーワード）より郵便番号データベース内を検索して、一致した郵便番号　都道府県名　町名　を全県テキストエリア内に表示します。
全てきちんと入力することで該当件数を絞り込むこともできます。

都道府県は必須です。なぜなら、例えば市名を「市」と入力した際に5万件以上が一致して、テキストエリアでスクロールしようと思うとブラウザがフリーズしてしまうからです。それでも北海道等何千件ある都道府県はやっぱり怪しいですが…。

エラーメッセージも意図的に出しています。
「都道府県が選ばれてないとき」「検索結果一致がないとき」「DBへのアクセスが失敗した時」です。


++++++お持ち帰り方法++++++
zipファイルを解凍したら
m_zipというsqlファイル、m_zipというフォルダ、そしてこのReadmeが入っています。
sqlファイルはphpmyadminなどでMySQL内にインポートしてください。
何故かって、都道府県セレクトボックスをcapital_masterというテーブルに都道府県名を入れていてそこから県名とセレクトボックスの中身の数字（valueに入る値）を取得しているからです。

で、setフォルダのsetting.phpの頭のほうにあるDB関係の設定をご自分のサーバーの環境に合わせて変更してください。
自分のPC内にXAMPP入れてやってたら、

define("DB_HOST","localhost");
define("DB_USER","root");
define("DB_PASS","");
define("DB_NAME","任意のDB名");

でしょうか。DB名は先ほどm_zip.sqlをインポートしたDB名を入れてください。
今回、セレクトボックスのvalueを数字にするにあたって、zipcodeテーブルに1つ自分でフィールドを追加して、
北海道なら1・・・沖縄なら47という風に数字を入れています。検索用に。またそれは別でプログラム作ってcapital_masterテーブルと連携させてcsvを取り込みました。

環境設定が終わったら、ブラウザよりm_zipにアクセスしてください。index.phpにメインの処理が書いてあるので、フォルダまででOKです。index.phpまで打っても大丈夫です。m_zipのフォルダ名を変更した場合はURLも同様に変わりますのでご注意を。

あとはひたすら検索！で。




++++++詳細その他++++++
今回のネックは”入力状態によってSQL文の中身が違う”というところだと思います。
都道府県はセレクトボックスから選ぶのでこちらの思い通りにできますが、市と町は何を入力されるかわかりません。つまり「部分一致」という検索ができなければなりません。
通常なら SELECT * FROM テーブル名 WHERE `検索対象フィールド名`='検索対象語句';
という風に書いて”＝”を使うのですが、それだと完全に語句と内容が一致していなければデータは取得できません。”＝”は「完全一致」なので。
で、調べてみると”＝”ではなく”LIKE”を使うことで前方一致、後方一致、部分一致が実現できると
http://www.techscore.com/tech/sql/05_06.html　とか
http://www.yc.tcu.ac.jp/~yamada/doc/mysql/win/0611.html　とか
に書いてあったので使ってみました。書き方は
・前方一致
SELECT * FROM テーブル名 WHERE `検索対象フィールド名`LIKE'検索対象語句%';
・後方一致
SELECT * FROM テーブル名 WHERE `検索対象フィールド名`LIKE'%検索対象語句';
・部分一致
SELECT * FROM テーブル名 WHERE `検索対象フィールド名`LIKE'%検索対象語句%';
で、「％」の位置によって検索対象語句の一致場所が決定されるというイメージでしょうか。
入力されてるパターンによってANDで条件を付け加えてる、という形です。


で、僕自身の書き方を色々調べた結果なのですが、やはり
「同じ処理は何度も書かない」というのを目指しています。
今後のメンテナンス性を考えると、同じ処理をするのであれば、別のファイルにまとめたりユーザー定義関数を作ったりして、都度そちらを呼んでくる方が、プログラムの簡略化がはかれますし、修正もしやすくなります。

今回は、毎回発生する「DBへの接続の処理」と「SQL文を投げた後のデータの取得処理」をそれぞれ別ファイルにしています。
SQL文は入力のパターンによって違いますが、データを取得する処理は全く同じです。同じなら別でまとめたらいいんじゃないかということで入力パターン都度set/sql.phpをrequire_once・・・ファイルを読み込む処理をしています。
require_onceは「ファイルを一度だけ読み込む」ですが、includeやrequireのように一度の処理内で何度も読み込むわけではないのでこうしています。ただ、この3つのちゃんとした使い分けはちゃんとは分かっていません。includeとrequireは一緒で、複数回読み込むのに対応していますが・・・。

取得した後はそれぞれ必要な変数にセットして、html本体を置いているtemplate.phpを最後に読み込んでいます。
この仕様にしたのは都度echoで出力たり、phpの途中で<html>〜</html>を書いてしまうと、phpプログラムコード内でhtmlの位置づけが分かりづらくなってしまうからです。それなら、入力値によって変わるところだけを変数に入れる処理をして最後にデザインに影響しないところをテンプレートとして置いてヒアドキュメントで全echoする形にして、メンテナンス性の向上をはかりました。

この発展系がJoomlaとかXoopsといったCMSのテンプレートの考え方なんじゃないかなぁと想像しています。




++++++更新履歴++++++

2010.10.12 12:00
とりあえず前方一致のみまで。
エラーは何も選択、入力されてなかったら。

2010.10.13 07:00
部分一致もOK。

2010.10.13 10:30
都道府県必須に切り替え。
ソース整理。

2010.10.14 00:00
エラーメッセージのひとつをJavaScriptのAlertで。
サーバーにて正式公開。