#!/usr/bin/perl -w # 住所検索CGI # # Copyright (c) 2008 Poturi, All Rights Reserved. # http://www.poturi.com # # ソースコードの改変・再頒布は自由ですが、 # その際はCopyrightを明記してください。 use DBI; use CGI; use Encode; # addressテーブルのフィールド構成 # --------------------------- # フィールド 属性 # zip varchar(7) not null # address varchar(256) not null # データベースの認証設定 # --------------------------- my ($dsn, $user, $password); $dsn = "DBI:mysql:db_name:localhost"; $user = "db_user"; $password = "password"; # フォーム値の読み出し # --------------------------- my $cgi = new CGI; my ($zip); if ($cgi->param('zip')) { $zip = $cgi->param('zip'); } else { $zip = 0; } if ($cgi->param('address')) { $address = $cgi->param('address'); } else { $address = ""; } # 住所の出力 # --------------------------- my $error_flg = ""; if ($zip) { &get_header; &check_zip(\$zip, \$error_flg); if (!$error_flg) { &get_address; } &get_footer; } elsif ($address) { &get_header; &check_address(\$address, \$error_flg); if (!$error_flg) { &get_zip; } &get_footer; } # サブルーチン # --------------------------- # 郵便番号の値をチェックする sub check_zip { my ($var); $var = $_[0]; # $zipのreference $err = $_[1]; # $error_flgのreference $count = length($$var); if ($$var =~ /[^\d]/ || $count < 3 || $count > 7) { &get_error("3~7桁の半角数字を入力してください。"); $$err = 1; } } # 住所の値をチェックする sub check_address { my ($var); $var = $_[0]; # $addressのreference $err = $_[1]; # $error_flgのreference $count = length(decode('utf-8', $$var)); if ($count == 0) { &get_error("検索語を入力してください。"); $$err = 1; } elsif ($count > 20) { &get_error("20文字以内で検索してください。"); $$err = 1; } } # データベースからの読み出し sub get_address { my $dbh = DBI->connect($dsn, $user, $password); if (!$dbh) { &get_error("データベースに接続できません。"); return; } my $rows = $dbh->selectrow_array("SELECT COUNT(*) FROM address_t"); if(!$rows) { &get_error("データベースが空です。"); return; } else { $dbh->do("SET NAMES utf8"); my $count_query = "SELECT COUNT(zip_c) FROM address_t where zip_c like \"" . $zip . "%\""; my $query = "SELECT zip_c, address_c FROM address_t where zip_c like \"" . $zip . "%\" ORDER BY zip_c"; my $rows = $dbh->selectrow_array($count_query); if (!$rows) { &get_error("${zip}は使われていません。"); } else { my ($sth, @row); $sth = $dbh->prepare($query); $sth->execute(); while(@row = $sth->fetchrow_array) { my ($z, $a); $z = $row[0]; $a = $row[1]; print <<"XML";