
LAMP環境でWEBシステムを構築していると、しばしばJavascriptとPHPでそれぞれ扱っているデータをやり取りしたくなる時がある。
例えば、サーバーに保存されているデータをブラウザでうまく受け取りたい時や、
ブラウザで操作されたユーザーの行動データをPHPに受け渡したい時、
POST送信や画面遷移をさせずに、javascriptからPHPにデータを受け渡したい場合などの方法は、かなり初歩的だが、やったことの無い人の無いために、僕のやり方をソースコードで公開しておきます。
環境
ファイル一覧と役割
# ブラウザ表示用HTMLソース
index.html
# index.htmlに読み込むjavascriptプログラム
common.js
# 受け渡しを行なうPHPプログラム
collabo.php
# PHPプログラムから参照されるデータファイル
data.txt
上記の非常に簡易な構成を基準に、下記のシナリオを実行してみたいと思います。
プログラム・シナリオ
- 「JavascriptからPHPへデータ送信」index.htmlをブラウザで表示した時に、data.txtに書かれている任意の値を表示する
- 「PHPからjavascriptへデータ送信」ブラウザ上の入力フォームに書かれたデータをページ遷移させずにdata.txtに追記する
ソースコード
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>PHP Collaboration</title>
        <script type="text/javascript" src="common.js"></script>
    </head>
    <body>
      <form name="form1">
        <input type="text" name="test">
        <button type="button" id="btn">送信</button>
      </form>
      <div id="list"></div>
    </body>
</html> 
window.onload = function(){
	
	// data-write
	var btn = document.getElementById("btn");
	btn.onclick = function(){
		var input = document.forms.form1.test;
		var requests = "message="+input.value;
		var url = "./collabo.php?mode=write";
		var xhr = new XMLHttpRequest();
		xhr.open('POST', url, true);
		xhr.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
		xhr.send(requests);
		xhr.onreadystatechange = function(){
			if(this.readyState === 4){
				var list = document.getElementById("list");
				list.innerHTML += "<div>"+this.responseText+"</div>";
				document.forms.form1.test.value = "";
			}
		};
	};
	
	// data-read
	var url = "./collabo.php?mode=read";
	var xhr = new XMLHttpRequest();
	xhr.open('POST', url, true);
	xhr.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
	xhr.send();
	xhr.onreadystatechange = function(){
		if(this.readyState === 4){
			var datas = this.responseText.split("\n");
			var html = "";
			for(var i=0; i<datas.length; i++){
				html += "<div>"+datas[i]+"</div>";
			}
			var list = document.getElementById("list");
			list.innerHTML = html;
		}
	};
}; 
<?php
if($_REQUEST["mode"] === "write"){
	$num = 1;
	if(is_file("data.txt")){
		$data = explode(PHP_EOL , file_get_contents("data.txt"));
		$num = count($data);
	}
	file_put_contents("data.txt" , $num.",".$_REQUEST["message"].PHP_EOL , FILE_APPEND);
	echo $num.",".$_REQUEST["message"];
}
else if($_REQUEST["mode"] === "read"){
	echo file_get_contents("data.txt");
} 
1,abc
2,def
3,ghi 
 
JavascriptからPHPへデータ送信の解説
「送信」ボタンをクリックすると、Javascriptからajax処理でPHPにデータを送信します。
受信したPHPは、そのデータをdata.txtに書き込む処理を行なう。
common.jsの「// data-write」の箇所がその処理になります。
この処理で同時に行うべき内容は、入力した文字列を送信後に項目内をクリアしなければいけません。
そうすることで、次の入力をスムーズに行えるようになります。
また、送信したデータが正常にサーバーに送られた後で、PHP側で、ファイルに書き込んだ内容を返すことで、HTMLページ内のテキストファイル内容を表示に繁栄します(追記)。
PHPからjavascriptへデータ送信の解説
ページを読み込んだらすぐにPHPで読み取ったdata.txtファイルの内容をjavascriptに送ります。
※ただechoするだけですが・・・
javascriptでは、データを全て受け取りますが、単なる文字列なので、データのレコードを改行単位で行なっている仕様を繁栄して、改行を配列に分解します。
その後、divタグで配列のそれぞれをラップして、id="list"の内部に書き込みます。
つまずきポイント
今回はChromeブラウザの最新版(63.0.3239.84)で確認していますが、ブラウザ互換が必要な人、IEや他のブラウザが必須という人は、ajax処理の箇所をjQueryを使うか、以前記事のajaxプログラムを利用してください。
[Javascript] Ajaxライブラリ
ちなみに、このプログラムを少しだけ改良すると、簡易な掲示板が作れるので、初心者の方がWEBシステム開発を行うサンプルとしてご利用ください。
 
0 件のコメント:
コメントを投稿