phpな休日 BBS sitemap
1. 群馬県の市町村プルダウン

平成18年(2006年)10月1日に高崎市と榛名町が合併し、平成15年には70あった市町村が38になります。いや慌ただしい。
済んだことはともかく現状(高崎市・榛名町合併後)で市町村名をプルダウンリストから入力するためのスクリプトを書きました。
まず、idと市町村名を羅列したテキストファイル(city.cgi)を作成します。文字コードはUTF-8。

01<>前橋市<>
02<>高崎市<>
03<>桐生市<>
04<>伊勢崎市<>
05<>太田市<>
06<>沼田市<>
07<>館林市<>
08<>渋川市<>
09<>藤岡市<>
10<>富岡市<>
11<>安中市<>
12<>みどり市<>
13<>富士見村<>
14<>榛東村<>
15<>吉岡町<>
16<>吉井町<>
17<>上野村<>
18<>神流町<>
19<>下仁田町<>
20<>南牧村<>
21<>甘楽町<>
22<>中之条町<>
23<>長野原町<>
24<>嬬恋村<>
25<>草津町<>
26<>六合村<>
27<>高山村<>
28<>東吾妻町<>
29<>片品村<>
30<>川場村<>
31<>昭和村<>
32<>みなかみ町<>
33<>玉村町<>
34<>板倉町<>
35<>明和町<>
36<>千代田町<>
37<>大泉町<>
38<>邑楽町<>

そのうえで、上記ファイルを読み込んでプルダウンフォームに表示し、POSTで id を送信、送られてきた id を受け取って市町村名を判別するスクリプトを書いてみます。
「idじゃなくても、直接市町村名をPOSTすれば良いじゃん」 という方もおられるでしょうが、私はGETを使うことも多いですし、他に使い回すことも考えるとこんなふうになりました。

順序が逆になりますが、まずは受け取り側は(ソース順ですね)

if (isset($_POST["cityid"])) { //POSTに cityid があれば
$cityid = $_POST["cityid"]; //変数 $cityid に入れる
$city = file("./city.cgi"); //データを開いて
for ($i = 0; $i < count($city); $i++) { //展開する
$id = explode("<>", $city[$i]); //区切り文字 <> で区切る
if ($id[0] == $cityid) { //対象行が見つかったら
$city = $id[1]; //市町村名を $city にセット
break; //処理を終わる
}
}
}

このようにします。変数$cityに値が入れば、あとはprintするなりデータに保存するなりご自由に。

で、受け取るためには送信しなければなりませんので、送信する側ですが

print "<form action='./city.php' method='POST'>";
print "市町村を選択して  ";
$city = file("./city.cgi"); //データを開いて
for ($i = 0; $i < count($city); $i++) { //全行繰り返す
$line = explode("<>", $city[$i]); //区切り文字 <> で区切る
print "<select name='cityid'><option value='";
print $line[0] . "'"; //送信するのは(value値)id
print ">" . $line[1] . "</option>¥n";
print "</select>";
}
print " ";
print "<input type='submit' value='送信'>¥n";
print "</form>¥n";

このように市町村データ(city.cgi)を読み込みながら、プルダウン項目を表示しました。

実際に動くスクリプトを書くと(city.cgi が同一階層に存在することが前提)

<?php
if (function_exists("mb_language")) {mb_language("Japanese");}
if (function_exists("mb_internal_encoding")) {mb_internal_encoding("UTF-8");}
if (function_exists("mb_http_output")) {mb_http_output("pass");}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>市町村を選択して送信する</title>
</head>
<body>
<?php
if (isset($_POST["cityid"])) { //POSTに cityid がある場合
$cityid = $_POST["cityid"]; //変数 $cityid に入れる
$city = file("./city.cgi"); //データを開いて
for ($i = 0; $i < count($city); $i++) { //展開する
$id = explode("<>", $city[$i]); //区切り文字 <> で区切る
if ($id[0] == $cityid) { //対象行が見つかったら
$city = $id[1]; //市町村名を $city にセット
break; //処理を終わる
}
}
print "<span style='font-size:150%;color:crimson;'>" . $city . "</span>&nbsp;を選択しました。¥n";
}
else { //POSTに cityid がない場合
print "市町村を選択して¥n";
print "<form action='./city.php' method='POST'>¥n";
print "<select name='cityid'>¥n";
$city = file("./city.cgi"); //データを開いて
for ($i = 0; $i < count($city); $i++) { //全行繰り返す
$line = explode("<>", $city[$i]); //区切り文字 <> で区切る
print "<option value='";
print $line[0] . "'"; //送信するのは(value値)id
print ">" . $line[1] . "</option>¥n";
}
print "</select>¥n";
print " <input type='submit' value='送信'>¥n";
print "</form>¥n";
}
?>
</body>
</html>

実行
2. 市町村合併があった場合

phpで公園データベースのようなものを作成していたとして、下記のようなログファイル(park.cgi)があったとします。

01<>前橋市<>総合運動公園<>
01<>前橋市<>敷島公園<>
01<>前橋市<>前橋公園<>
01<>前橋市<>峯公園<>
01<>前橋市<>大室公園<>
02<>高崎市<>群馬の森公園<>
02<>高崎市<>野鳥の森バードハウス<>
02<>高崎市<>和田橋交通公園<>
02<>高崎市<>乗附緑地<>
02<>高崎市<>染料植物園<>
03<>榛名町<>湖畔の宿記念公園<>
03<>榛名町<>県営榛名湖オートキャンプ場<>
03<>榛名町<>榛名ふれあい公園<>

そこで今回の高崎市と榛名町の合併に伴い、この既存のログファイルに対してどう対処しましょう。
ログファイルをダウンロードしてローカルで修正後、修正済みのものを再びアップロードすれば良いのですが、このログには常に複数人が書き込みする権利を持っているので、修正している間に新しい書き込みがあると整合性がとれなくなってしまいます。
一時的に書き込みを禁止する処置をしても良いのですが、せっかくのphpですのでWEB上でログファイルの該当部分を一括書き替えするスクリプト(change.php)を書いてみます。
ログファイルの 03<>榛名町<> という箇所を 02<>高崎市<> に書きかえればよいことになります。

<?php
if (function_exists("mb_language")) {mb_language("Japanese");}
if (function_exists("mb_internal_encoding")) {mb_internal_encoding("UTF-8");}
if (function_exists("mb_http_output")) {mb_http_output("pass");}
$city = file("./park.cgi"); //データを開いて
for ($i = 0; $i < count($city); $i++) { //展開する
$id = explode("<>", $city[$i]); //区切り文字 <> で区切る
if ($id[0] == "03") { //対象行が見つかったら
$edit = "02<>高崎市<>" . $id[2] . "<>¥n"; //置き換えする1行
array_splice($city,$i,1,"$edit"); //1行置き換え
}
}
$data = fopen("./park.cgi", "w"); //書き込みモードでファイルを開
flock($data, LOCK_EX); //ファイルロック
foreach($city as $value) { //配列処理して
fputs($data, $value);} //書き込む
flock($data, LOCK_UN); //ファイルロック解除
fclose($data); //ファイルを閉じる
?>

どうでしょう。これでもう市町村合併も怖くない? まさか、"市町村分裂"なんてことはないですよね。
実際にログファイルの保存まではしませんが、書き替え処理を下記で体験できます。

実行


Fatal error: Uncaught Error: Undefined constant "Y.n.j" in /home/users/2/secret.jp-final/web/phpholiday/27/index.cgi:207 Stack trace: #0 /home/users/2/secret.jp-final/web/phpholiday/index.php(334): include() #1 {main} thrown in /home/users/2/secret.jp-final/web/phpholiday/27/index.cgi on line 207