jQuery Ajax + PHP
今回はAjaxをやります。サーバ側処理はPHPで書きます。Content-Typeにapplication/jsonを指定のJavaScript
Content-Typeにapplication/jsonを指定のPHP
Content-Type未指定のJavaScript
Content-Type未指定のPHP
Content-Typeにapplication/jsonを指定
Content-Typeにapplication/jsonを指定する方式とContent-Typeを省略する方式で$.ajaxを使ってみます。クライアント側の処理
HTMLとJavaScript
test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jQuery Test</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
$("#btn").click(function() {
var param = {
str1 : $("#txt1").val(),
str2 : $("#txt2").val()
};
$.ajax({
contentType : "Content-Type: application/json; charset=UTF-8",
url : "./ajax.php",
type : "POST",
data : JSON.stringify(param)
}).done(function(data, status, xhr) {
// 正常
show(data);
}).fail(function(xhr, status, error) {
// 異常
$("#msg").append(xhr);
$("#msg").append(":" + status);
$("#msg").append(":" + error);
}).always(function(data, status, xhr) {
// 常に
});
});
});
function show(data) {
var obj = JSON.parse(data);
//ここに結果
$("#msg").html(obj.str);
//ここにリスト
if (obj.ret == "true") {
var str1 = "<table border='1'>";
$.each(obj.ary, function(i, val) {
str1 += "<tr><td>" + i + "</td><td>" + val + "</td></tr>";
console.log(i + ': ' + val);
});
str1 += "</table>";
$("#ret1").html(str1);
} else {
$("#ret1").empty();
}
//ここにマップ
if (obj.ret == "true") {
var str2 = "<table border='1'>";
$.each(obj.map, function(key, val) {
str2 += "<tr><td>" + key + "</td><td>" + val + "</td></tr>";
});
str2 += "</table>";
$("#ret2").html(str2);
} else {
$("#ret2").empty();
}
}
</script>
</head>
<body>
<input type="text" id="txt1" />
<input type="text" id="txt2" />
<br />
<input type="button" id="btn" value="ボタン" />
<div id="msg">
ここに結果
</div>
<br />
<div id="ret1">
ここにリスト
</div>
<br />
<div id="ret2">
ここにマップ
</div>
</body>
</html>
$.ajaxでサーバにリクエストを投げ、done、fail、alwaysでレスポンスを受け取ります。
$.ajaxの引数
引数 | 説明 |
---|---|
contentType | データ形式を指定します |
url | リクエスト先のURLを指定します |
type | POST/GETを指定します |
data | リクエスト先に渡すデータを指定します |
レスポンス受け取りメソッド
メソッド | 説明 |
---|---|
done | 正常終了時に呼ばれます。 引数は、data:戻り値オブジェクト文字列, status:処理ステータス, xhr:処理オブジェクトになります。 |
fail | 異常終了時に呼ばれます。 引数は、xhr:処理オブジェクト, status:処理ステータス, error:エラー文字列になります。 |
always | 正常、異常の両方で呼ばれます。 正常、異常で引数が変わります。正常時は、data, status, xhr、異常時は、xhr, status, errorになります。 |
JSONテキスト⇔オブジェクト変換
メソッド | 説明 |
---|---|
JSON.stringify(オブジェクト) | JavaScriptオブジェクトをJSON文字列に変換します |
JSON.parse(文字列) | JSON文字列をJavaScriptオブジェクトに変換します |
サーバ側の処理
PHPでサーバ処理を記述
ajax.php
<?php
class Cls {
var $ret;
var $str;
var $ary;
var $map;
}
$obj = new Cls();
//送信データを取得
$json = file_get_contents("php://input");
//JSONから連想配列に変換
$data = json_decode($json, true);
if (count($data) == 0 || !isset($data['str1']) || !isset($data['str2'])) {
$obj -> str = "引数str1,str2が指定されていません。" . count($data);
$obj -> ret = "false";
} else {
$str1 = $data['str1'];
$str2 = $data['str2'];
$obj -> str = $str1 . $str2 . "<BR />" . $_SERVER['REQUEST_METHOD'] . "で送信されました";
$obj -> ret = "true";
$obj -> map = array('A' => 'あいう', 'B' => '123', 'C' => 'abc');
$obj -> ary = array('aaa', 'bbb', 'ccc');
}
//連想配列からJSONに変換
$result = json_encode($obj, JSON_UNESCAPED_UNICODE);
//処理結果を戻す(出力)
echo $result;
?>
JavaScriptから送られたJSON文字列をfile_get_contents関数で取得します。以下の形式で使用します。 file_get_contents("php://input")
JSON文字列はjson_decode関数でオブジェクトに変換します。以下の形式で使用します。
json_decode($json, true)
PHP側で一通り処理を行い、JavaScriptに戻すときにオブジェクトからJSON文字列に戻します。
JSON文字列に戻すにはjson_encode関数を使用します。以下の形式で使用します。
json_encode($obj, JSON_UNESCAPED_UNICODE)
JSON_UNESCAPED_UNICODEオプションを指定しないとマルチバイト Unicode文字で返されます。
Content-Typeを未指定
Content-Typeを指定しないと、Content-Typeはapplication/x-www-form-urlencodedになります。クライアント側の処理
HTMLとJavaScript
Content-Typeを未指定で、JSON.stringifyも使用せずそのまま$.ajaxのdataにパラメータを渡しています。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jQuery Test</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
$("#btn").click(function() {
var param = {
str1 : $("#txt1").val(),
str2 : $("#txt2").val()
};
$.ajax({
url : "./test.php",
type : "POST",
data : param
}).done(function(data, status, xhr) {
// 正常
show(data);
}).fail(function(xhr, status, error) {
// 異常
$("#msg").append(xhr);
$("#msg").append(":" + status);
$("#msg").append(":" + error);
}).always(function(data, status, xhr) {
// 常に
});
});
});
function show(data) {
var obj = JSON.parse(data);
//ここに結果
$("#msg").html(obj.str);
//ここにリスト
if (obj.ret == "true") {
var str1 = "<table border='1'>";
$.each(obj.ary, function(i, val) {
str1 += "<tr><td>" + i + "</td><td>" + val + "</td></tr>";
console.log(i + ': ' + val);
});
str1 += "</table>";
$("#ret1").html(str1);
} else {
$("#ret1").empty();
}
//ここにマップ
if (obj.ret == "true") {
var str2 = "<table border='1'>";
$.each(obj.map, function(key, val) {
str2 += "<tr><td>" + key + "</td><td>" + val + "</td></tr>";
});
str2 += "</table>";
$("#ret2").html(str2);
} else {
$("#ret2").empty();
}
}
</script>
</head>
<body>
<input type="text" id="txt1" />
<input type="text" id="txt2" />
<br />
<input type="button" id="btn" value="ボタン" />
<div id="msg">
ここに結果
</div>
<br />
<div id="ret1">
ここにリスト
</div>
<br />
<div id="ret2">
ここにマップ
</div>
</body>
</html>
サーバ側の処理
PHPでサーバ処理を記述
Content-Type未指定の場合、$_POST変数で送信データを取得します。
<?php
//送信データを取得
$str1 = $_POST['str1'];
$str2 = $_POST['str2'];
//戻り値になる連想配列をセット
$obj = [];
$obj['str'] = $str1 . $str2 . "<BR />" . $_SERVER['REQUEST_METHOD'] . "で送信されました";
$obj['ret'] = "true";
$obj['map'] = array('A' => 'あいう', 'B' => '123', 'C' => 'abc');
$obj['ary'] = array('aaa', 'bbb', 'ccc');
//連想配列からJSONに変換
$result = json_encode($obj, JSON_UNESCAPED_UNICODE);
//処理結果を戻す(出力)
echo $result;
?>
ページのトップへ戻る