connet.lolipop.jp
準備
Ajax通信を行うには様々な手法がありますが、当サイトではサーバーとHTTP間で通信を行うための 「XMLHttpRequest」オブジェクトAPIを使い、Sqliteデータベースからデータを取得する方法につい てご紹介したいと思います(備忘録)。
当サイトの内容はphp・javascript初心者様用です。

では以下のように準備をします。
■作成はphpで行うため、Webアプリケーションの開発に最適な「XAMPP」を利用することにします。
「XAMPP」は初めてという方は、以下から配布されていますので適当な場所にダウンロードして下さい。 https://www.apachefriends.org/jp/
ダウンロード/利用方法などの説明は省略します。

■次に、手動でデータベースにデータを作成するので、それにはフリーで設定が簡単な「DB Browser for SQLite」アプリケーションを利用します。
用意してない場合は、以下のサイトから配布されていますので、適当な場所にダウンロードして下さい。
http://sqlitebrowser.org/
操作の説明は省略します。

最後に、プログラムでデータベースのデータ操作はXAMPPに搭載されている「Sqlite」を使って行います。
SqliteはPHPバージョンが5.3以降なら標準で組み込まれています。
phpでSqliteを動かすには、php.iniファイル内に以下のような設定になっている必要があるので確認してみてください。

xampp/php/php.ini
                
----
----
extension=php_pdo_sqlite.dll
extension=php_sqlite3.dll
----
----                             
ならば大丈夫。
デレクトリ構成
ファイル配置は以下のようにします。
・xampp
   |
   htdocs
    |
    ajaxsample
     | 
     index.html
     prefcity.js
     preflist.php
     citylist.php
     sampleDB.php
     sample.DB   ->データベース名 
※当サンプルプログラムでは、データベースファイルの「sample.DB」をドキュメントルートに 置いてますが、本来ならデータベース開発を行う場合は、セキュリティ上、ドキュメントルートには置かないほうがよいでしょう。
データベースの作成
それでは、「DB Browser for SQLite」を使ってデータベースとその中に2つのテーブルを作成します。

データベース名 -> sample.DB
① 都道府県のテーブル名 -> prefecturesTbl
② 市区町村のテーブル名 -> cityTbl

ついでに、新規テーブルには、以下のようにあらかじめダミーのデータを入力しておいてください。
① テーブル:prefecturesTbl
prefIDprefecture_Name
1北海道
2青森
3岩手

② テーブル:cityTbl
cityIDprefIDcity_Name
1001札幌市
1011函館市
1021釧路市
2002青森市
2012弘前市
2022八戸市
3003盛岡市
3013宮古市
3023大船渡市
データベースにアクセス
データベースに接続、オブジェクトを作成して返す。
sampleDB.php
<?php
  function executeQuery(){
    try {
    	// オブジェクト作成・接続
    	$db = new PDO('sqlite:sample.DB');
    	// データベースハンドルの属性を設定(PDOのエラーレポート表示など)
    	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    	// 都道府県テーブル
    	$db->exec("CREATE TABLE IF NOT EXISTS prefecturesTbl(prefID integer, prefecture_Name text)");
    	// 市区町村テーブル
    	$db->exec("CREATE TABLE IF NOT EXISTS cityTbl(cityID integer, prefID integer, city_Name text)");
    } catch (PDOException $e) { 
    	print '<div>データベースへの接続でエラーが発生しました!。</div>';
    	exit;
    }
    return $db;
  }									 
?>										                
Ajax通信を使ってデータの送受信を行う
XMLHttpRequestオブジェクトAPIを使ってHTMLとPHP間との通信を行う。

prefcity.js
									window.onload = init;
									function init() {
										// ブラウザの判定 
										if (window.XMLHttpRequest) {
											var xmlhttp = new XMLHttpRequest();
										} else {
											alert("IEバージョン7.0以上のブラウザをご利用ください!。");
											return null;
										}
													
										// アドレスへ接続開始
										xmlhttp.open("POST","preflist.php",true);
									
										// 通信完了で関数を呼び出し
										xmlhttp.onreadystatechange = function(e) {
											// サーバーの応答を定義
											if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
												// サーバーからデータ取得
												document.getElementById("preflist").innerHTML = 
												xmlhttp.responseText;
											}
										}        
									
										// ヘッダー
										/* POST送信のときsendメソットに引数を設定しない場合は、必要ない。
										* が、ブラウザによっては送信エラーが生じる恐れがあるかもしれません。
										* なるべく設定して置いた方がよいでしょう。
										*/
										xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
										// リクエスト
										xmlhttp.send();               
									}
									
									function city(obj) {
										// 都道府県のIDを取得
										var prefId = obj.options[obj.selectedIndex].value;
										// 都道府県の名前を取得
										var prefecture_Name = obj.options[obj.selectedIndex].text;
											
										if(prefId == "") {
											document.getElementById("citylist").innerHTML = "";
											return;
										} else {
											if(window.XMLHttpRequest) {
												xmlhttp = new XMLHttpRequest();
											} else {
												alert("IEバージョン7.0以上のブラウザをご利用ください!。");
												return null;
											}
									
											xmlhttp.open("POST","citylist.php",true);
											
											xmlhttp.onreadystatechange = function() {
												if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
													document.getElementById("citylist").innerHTML = 
													xmlhttp.responseText;
												}
											}
									
											// エンコード
											var prefId = encodeURI(prefId);
											var prefecture_Name = encodeURI(prefecture_Name);   
											
											xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
											
											// OPENメソットにPOSTを指定しているため、sendメソットに引数を設定
											xmlhttp.send("prefId="+prefId+"&prefecture_Name="+prefecture_Name);
										}       
									}									 
									
都道府県名の取得
全データを取得して、SELECTボックスに格納します。

preflist.php
									<?php
									require_once "sampleDB.php";
									
									$db = executeQuery();
									$sql="SELECT * FROM prefecturesTbl";
									$result = $db->query($sql);
									
									print '<form>
										<p>これはサーバーにあるデータベースのデータです。</p>
										<select onchange="city(this)" style="width:150px;height:26px;">
										<option value="" selected >都道府県名</option>
									';
									if(!$result){
										echo "DataBase Error!";
										return;
									} else {
										foreach ($result as $row) {
											print '<option value = "'.
											$row['prefID'].'">'.$row['prefecture_Name'].'</option>';
										}
									}  
									print '</select></form>';
									
									?> 								                
									
市区町村名の取得
選択された都道府県名を受け取り、対応する市区町村名を取得します。

citylist.php
										<?php
										require_once "sampleDB.php";
										
										$prefid = '';
										
										if (isset($_POST['prefId'])) {
											$prefid = htmlspecialchars($_POST['prefId']);
										}
										
										//クエリーを送信
										$db = executeQuery();
										$sql="SELECT * FROM cityTbl WHERE prefID =".$prefid;
										$result = $db->query($sql);
										
										print '<form>
											<p>これはサーバーにあるデータベースのデータです。</p>
											<select style="width:150px;height:26px;">
											<option value="" selected>市区町村名</option>
										';
										foreach ($result as $row) {
											print '<option value = "'.$row['cityID'].'">'.$row['city_Name'].'</option>';
										}
										print '</select></form>';
										 
										?> 									                
										
HTML
Getボタンをクリックするとjsファイルのinitメソットが実行。
実行結果は、jsファイルで定義したidの記述位置に表示。
id="preflist"
id="citylist"

index.html
									<!DOCTYPE html>
									<html lang="ja">
									<head>
									<meta http-equiv="content-type" content="text/html; charset=UTF-8">
									<title>Ajax通信のサンプルプログラム</title>
									<script type="text/javascript" src="prefcity.js"></script>
									</head>
									<body>
									<article>
										<h1 style="width:480px;padding:8px;background:#49ECFE;">Ajax通信を使ってサーバーからデータを取得</h1>
										<h2>・全国都道府県リスト</h2>
										<div id="preflist">ロード中......</div><br />
										<h2>・全国市区町村リスト</h2>
										<div id="citylist">ロード中......</div><br /><br />
										<button onclick="init();">Get</button>
									</article>
									</body>
									</html> 								                
									
実行
これで完成です。
それではプログラムを実行してブラウザに表示してみましょう。
・Webサーバー(Apach)を起動
・ブラウザを立ち上げ、アドレスバーに以下のアドレスを入力してください
 http://localhost/ajaxsample/
 更新ボタンをクリック

どうでしょうか、問題なく表示するか確認してみて下さい。
ファイルをダウンロード
Search
Google


↟ このページの先頭へ