Ajax を使った郵便番号検索

Ajax を使った郵便番号検索です.

日本郵政公社提供の郵便番号データを,SQLite を使って,検索しています.
Guide to Using XMLHttpRequest を思いっきり参考にしています (というかそのまま).

郵便番号は,ハイフン (-) を抜いた,7 文字を入れてください.

郵便番号:

都道府県:
市区町村:
事業所名:

JavaScript & DHTMLクックブック

JavaScript & DHTMLクックブック - Webエキスパート必携テクニック集
ダニー グッドマン (著), Danny Goodman (原著), 村上 列 (翻訳)
オライリー・ジャパン (2004/01)
ISBN: 4873111749
4,830 円

Amazon で詳細を見る

入門 Ajax

入門 Ajax
高橋 登史朗 (著)
ソフトバンククリエイティブ (2005/11/15)
ISBN: 4797332646
2,499 円

Amazon で詳細を見る

更新履歴

ajaxzip.js

function handleHttpResponse() {
    if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
        var xmlDoc = xmlHttp.responseXML;
        if (xmlDoc.documentElement) {
            var pref    = xmlDoc.getElementsByTagName('pref').item(0).firstChild;
            var city    = xmlDoc.getElementsByTagName('city').item(0).firstChild;
            var ville   = xmlDoc.getElementsByTagName('ville').item(0).firstChild;
            var company = xmlDoc.getElementsByTagName('company').item(0).firstChild;
            if (pref    != null) document.getElementById('pref').value = pref.data;
            if (city    != null) document.getElementById('city').value = city.data;
            if (ville   != null) document.getElementById('ville').value = ville.data;
            if (company != null) document.getElementById('company').value = company.data;
        } else {
            document.getElementById('pref').value = '';
            document.getElementById('city').value = '';
            document.getElementById('ville').value = '';
            document.getElementById('company').value = '';
        }
    }
}

function getAddrss() {
    var zip = document.getElementById('zip').value;
    xmlHttp.open('GET', 'ajaxzip.cgi?z=' + escape(zip), true);
    xmlHttp.onreadystatechange = handleHttpResponse;
    xmlHttp.send(null);
}

function getXmlHttpObject() {
    var xmlhttp;
    /*@cc_on
    @if (@_jscript_version >= 5)
        try {
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (E) {
                xmlhttp = false;
            }
        }
    @else
        xmlhttp = false;
    @end @*/
    if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
        try {
            xmlhttp = new XMLHttpRequest();
            xmlhttp.overrideMimeType("text/xml"); 
        } catch (e) {
            xmlhttp = false;
        }
    }
    return xmlhttp;
}

var xmlHttp = getXmlHttpObject();

ajaxzip.cgi

#!/usr/bin/perl

use strict;
use DBI;
use CGI;

my $db = 'ajaxzip.db';
my $q = new CGI;
my $zip = $q->param('z');

print_result() if ($zip eq "");

my $dbh = DBI->connect("dbi:SQLite:dbname=${db}", '', '') or print_result();
my $sth = $dbh->prepare('SELECT * FROM postal WHERE code LIKE ?') or print_result();
$sth->execute("$zip%") or print_result();

my @row = $sth->fetchrow_array();
print_result() if $sth->err;

$sth->finish();
$dbh->disconnect();

print_result($row[1], $row[2], $row[3], $row[4]);

sub print_result {
    my ($pref, $city, $ville, $company) = @_;

    print "Content-Type: text/xml\n\n";
    
    if ($pref ne '' || $city ne '' || $ville ne '' || $company ne '') {
        printf('<?xml version="1.0" standalone="yes"?><zip><pref>%s</pref><city>%s</city><ville>%s</ville><company>%s</company></zip>', 
                $pref, $city, $ville, $company);
    }
    exit;
}