JavaScriptでサーバーのPHPにPOSTデータを送り結果を受け取る
JavaScriptでサーバーのPHPにPOSTデータを送り、処理させて結果を受け取る
formでPOSTデータを送ると、画面遷移がおこってしまい、困ることがある。
JavaScriptでPOSTデータを取得し、サーバのPHPに送信して、その結果を受け取ることができれば、 画面遷移が起こらなくなる。
受け取る側のPHPは以下のようなものとする。
test_js.php
<?php
error_reporting(0);
mb_language("ja");
mb_internal_encoding('UTF-8');
$name = $_POST['name'];
$hobby = $_POST['hobby'];
print "{$name}の趣味は、{$hobby}です。";
フォームでは、名前と趣味という2つの項目の入力を求めている。
index.html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>TEST</title>
<style>
#textareas {
width: 80%;
margin: 0 auto;
height: 160px;
}
</style>
</head>
<body>
<h1>TITLE</h1>
<form>
<p>名前:<input type="text" name="name" id="name"></p>
<p>趣味:<input type="text" name="hobby" id="hobby"></p>
<p><button type="button" name="botan" id="button01"
onClick="sendRequest();">ボタン</button></p>
<textarea id="textareas" wrap="off"></textarea>
</form>
<script src="send.js"></script>
</body>
</html>
以下が、POSTデータを取得し、test_js.phpにデータを送り、その結果を 表示するスクリプトである。
IE6以前のブラウザへの対応も一応書いておいた。
send.js
// IE6以前を考慮する場合
function createXmlHttpRequest() {
var xmlhttp = null;
// IE6以前向け
if (window.ActiveXObject) {
try {
// for IE6
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e2) {
// for ID5,IE5.5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
else if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
function sendRequest() {
var name = document.getElementById('name').value;
var hobby = document.getElementById('hobby').value;
// var xmlhttp = createXmlHttpRequest(); // for 〜IE6
var xmlhttp = new XMLHttpRequest();
if (xmlhttp !== null) {
xmlhttp.open("POST", "./test_js.php", false);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var data = "name=" + name + "&hobby=" + hobby;
xmlhttp.send(data);
var res = xmlhttp.responseText;
document.getElementById("textareas").value = res;
}
}
XHR2(XMLHttpRequest2)の場合
さて、XHR2において、多くの拡張があったが、sendメソッドにおいても、”xxx=yyy&zzz=www”という形式以外にも FormDataオブジェクトなど、多くのデータ形式に対応できることになった。
以下がその例である。(IE6以前への対応は考慮しないとする)
send2.js
// XHR2(XMLHttpRequest2)の場合
function sendRequest() {
var name = document.getElementById('name').value;
var hobby = document.getElementById('hobby').value;
var data = new FormData();
data.append("name", name);
data.append("hobby", hobby);
var xmlhttp = new XMLHttpRequest();
if (xmlhttp !== null) {
xmlhttp.open("POST", "./test_js.php", false);
xmlhttp.send(data);
var res = xmlhttp.responseText;
document.getElementById("textareas").value = res;
}
}
FormDataでは、以下のような形式でPHPにPOSTする必要がなくなった。
var data = "name=" + name + "&hobby=" + hobby;
FormDataオブジェクトを使うと、以下の記述は、必要なくなる。
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
「fetch」を使う
上記記事を書いたのは、実は2019年1月15日だった。
それから月日が経ったので、現在では、
非同期通信をおこなうには、現在では「fetch」が推奨されているらしい。
上記、send2.js を fetch を使って書いてみた。
send3.js
function sendRequest() {
var name = document.getElementById('name').value;
var hobby = document.getElementById('hobby').value;
var data = new FormData();
data.append("name", name);
data.append("hobby", hobby);
fetch("/test_js.php", {
method: "POST",
body: data
}).then(response => response.text())
.then(text => {
document.getElementById("textareas").value = text;
})
}
参考
==>上記コードは、このページのコードをほとんどそのまま使っている。
カテゴリー: JavaScript, memo
タグ: ajax, xmlhttp, xmlhttprequest
カウント: 191