JQueryとPHPで作るシンプルなAJAX

2010/7/25 読まれた回数722
このエントリーを含むはてなブックマーク |  このページを Google Bookmarks に追加 | Yahoo!ブックマークに登録 | このエントリの Delicious history

Ajaxを使うことで、Webのユーザーインターフェイスを
劇的に改善することが出来るんだけれど、
イマイチ良いサンプルが見つからなかったのでJQueryとPHPで実装するサンプルを作ってみたよ

サンプルが見つからない理由

Ajaxはサーバーとクライアントの連携で動いているけれど、
サーバーは多種多様な技術があるので網羅できない。
クライアント側だけ説明すると、サーバー側が抜けるのでそのままではサンプルを動かすことが出来ない。

ということで、ターゲットをPHPとJQueryに限定してサーバーからクライアントまで一貫したサンプルにしてみました。
ソースコードを極力シンプルにして全コード掲載しています。

作る物

クライアントからサーバーに数値を二つ送信し、
二つの値を足した結果をサーバーから取得して画面を更新する。

用意する物

PEARが動くサーバー

今回はJSONを処理するのにPEARのJSONライブラリを使用している
JSONは必須の技術ではないし、PEARを使わなくてもJSONを処理することも出来るけれど、今回は説明を省く

JQuery

jQueryを使うことで複数のブラウザへの対応が簡単になる上に、ソースコードがシンプルになる。
※ただしGoogleのホスティングサービスを使う場合は不要。
JQueryダウンロードDownload(jQuery)よりソースコードがダウンロード可能。
とくにZip化などはされていないのでjQueryのソースコードが直接ブラウザに表示される。
名前を付けて保存で保存する。

フォルダ構成

今回はサーバー上に以下の構成でファイルを作成する。
/
|ajax.html (ユーザーが呼び出すページ、数値を二つ入力するフィールドを持つ)
+js
||ajax.js (ajax.htmlのページに特化したJavaScript)
||jquery.js(ダウンロードしたjQueryをリネームして配置)
+php
|ajax.php(受信した値を加算した内容を戻す)
|json.php(ダウンロードしたpear::jsonライブラリ)

index.html

データの入力とJavaScriptの呼び出しを行うコードを記載する。

ソースコード

 
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="js/jquery.js" ></script>
<script type="text/javascript" src="js/ajax.js"></script>
</head>
<body>
<h1>デモンストレーション</h1>
<p>サーバーサイドで足し算をするAJAXサンプルです。回答は1秒後に帰ってきます</p>
<form id='inputForm' method='post' action=''>
<input type="text" name="x" />+<input type="text" name="y" />=<input type="button" id="send" value="計算する" />
</form>
</body>
</html>

説明

<script type="text/javascript" src="js/jquery.js" ></script>
jQueryを呼び出す。
jQueryはダウンロードしなくても
http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.jsを指定してGoogleのホスティングを使用することも出来る。
<script type="text/javascript" src="js/ajax.js"></script>
ページ特有の処理を行うajax.js(以下で作成)を指定する。

ajax.js

サーバーへPostを投げ、帰ってきた値を表示するJavaScriptを作成し、HTMLで指定した場所へajax.jsの名前で保存する。

ソースコード

$(document).ready(function() {
/**
* 初期処理
*/
$("#send").click(function(){

var form = $("#inputForm");// パラメータを取り込むFormのID
var param = {}; // 配列を初期化


// フォーム内の情報を配列にまとめる
rel = form.serializeArray();
$(form.serializeArray()).each(function(i, v) {
param[v.name] = v.value;

});

$.post("php/ajax.php", param, function(returnValue){
/**
* PHPからレスポンスが帰ってくると実行される、引数はレスポンスの値
*/
alert(returnValue.answer); // 結果はプロパティで取得出来る
},"json");
});
});

説明

$(document).ready(function() {
ドキュメントの準備が完了した時の処理を記載する。

$("#send").click(function(){
計算するボタンが押された場合の処理を記載する。
ドキュメントの準備が完了したときの処理の中にあるのに注意。
ドキュメントの準備が完了したときに、計算するボタンがクリックされた時の処理を設定しているのであり、実際に処理が動くのは計算するボタンが押されてからになる。
var form = $("#inputForm");// パラメータを取り込むFormのID
変数formにid inputFormを代入している。

rel = form.serializeArray();
$(form.serializeArray()).each(function(i, v) {
param[v.name] = v.value;
});
formの中身を配列にセットする。
今回の場合、フォーム内にはxとyがあるため
param["x"]にxに入力した値
param["y"]にyに入力した値が代入される

$.post("php/ajax.php", param, function(returnValue){
/**
* PHPからレスポンスが帰ってくると実行される、引数はレスポンスの値
*/
alert(returnValue.answer); // 結果はプロパティで取得出来る
},"json");
今回最大の山場、
非同期でサーバーに送信を行い、戻ってきた値を処理する部分。
サーバーに非同期で送信を行うにはjQueryの$.postを使用する
第1引数にpostの送信先、
第2引数にpostで送信するパラメータ
第3引数に完了時に行う処理(引数はサーバーより返された値)
第4引数に受信するデータの種類を指定する。

ajax.php

ソースコード

<?php
if($_SERVER["REQUEST_METHOD"] != "POST"){
//POST以外ははじく
header("HTTP/1.0 404 Not Found");
return;
}
header("Content-Type: text/html; charset=UTF-8");

//Proposal for "Services_JSON"を使ってJSONを処理する、以下からダウンロード可能
//http://pear.php.net/pepr/pepr-proposal-show.php?id=198
require_once "json.php";

// データはUTF-8で取得される。
// 他のエンコードに変える場合は変換が必要
$x = $_POST['x'];
$x = mb_convert_encoding($x,"EUC-JP","UTF-8");
$y = $_POST['y'];
$y = mb_convert_encoding($y,"EUC-JP","UTF-8");
$r = $x+$y;

$answer = "答えは{$r}";
sleep(1);

// 結果は必ずUTF-8で返すこと
$answer = mb_convert_encoding($answer,"UTF-8","auto");
//JSON形式にすることで複数の値を返すことも可能
$arr = array(
"answer" => $answer
);
$json = new Services_JSON;
$encode = $json->encode($arr); //JSONに変換
echo $encode; //JSONを出力
?>

説明

<?php
if($_SERVER["REQUEST_METHOD"] != "POST"){
//POST以外ははじく
header("HTTP/1.0 404 Not Found");
return;
}
POST以外のメソッドが呼ばれた場合、処理する項目はないので404エラーを出力する。
必要に応じてエラーメッセージを出力してもいい
	header("Content-Type: text/html; charset=UTF-8");
Ajaxの戻り値は必ずUTF-8にすること、
元のページやPHPがUTF-8以外であってもUTF-8で返す必要がある。
require_once "json.php"; 
pearのjson.phpを呼び出す。

$x = $_POST['x'];
$x = mb_convert_encoding($x,"EUC-JP","UTF-8");
$y = $_POST['y'];
$y = mb_convert_encoding($y,"EUC-JP","UTF-8");
今回サーバー側のエンコードがEUC-JPだったため文字コードを変換している。
送信元のHTMLがEUC-JPでもUTF-8で飛んでくるので注意

$r = $x+$y;
$answer = "答えは{$r}";
sleep(1);
サーバーで処理するロジック、
今回は足し算を行うだけのシンプルな処理、
これだけなら普通はJavaScript単独で十分だけれど、ソースコードをシンプルにするために足し算だけにしている。
実際にはDBに登録するなどサーバーでしか行えない処理を行う。

	// 結果は必ずUTF-8で返すこと
$answer = mb_convert_encoding($answer,"UTF-8","auto");
サーバーがUTF-8以外で動いている場合、出力内容をUTF-8に変換してやる必要がある
	//JSON形式にすることで複数の値を返すことも可能
$arr = array(
"answer" => $answer
);
$json = new Services_JSON;
$encode = $json->encode($arr); //JSONに変換

戻り値の配列を作成し、Service_JSONのencodeを使用してJSON形式に変換する。
	echo $encode;	//JSONを出力
?>
ajaxの戻り値といっても特殊なことは必要なく、単にechoないしPrintで出力してやればいい


動作サンプル

関連キーワード

[PHP][IT]

コメントを投稿する

名前URI
コメント

トラックバック URL(β)

iPhone4とXperiaの壁紙

2010/7/23 読まれた回数1262
このエントリーを含むはてなブックマーク |  このページを Google Bookmarks に追加 | Yahoo!ブックマークに登録 | このエントリの Delicious history

IT飲み会に行ってきました。
そこで起きた(起こした?)iPhone VS Android対決

ハイトーンで楽しかったです。
それを和解するために、iPhone4とXperia向けのハイトーンな壁紙を作ってみました。
ヤマハVino
iPhone4
Xperia
Infiniti FX
iPhone4
Xperia
Z34
iPhone4
Xperia
InfinitiFX
iPhone4
Xperia
夕焼け
iPhone4
Xperia
紅茶
iPhone4
Xperia
夏にぴったりな氷
iPhone4
Xperia
夜の街
iPhone4
Xperia
バイク 空
iPhone4
Xperia
夏にぴったり錦鯉
iPhone4
Xperia
個人的にはデバイスが多様になっていくほど、Androidが強くなっていくんじゃないかって思うんだけれど、iPhoneも興味有ったりします。
WindowsPhoneやMeeGo含めていろんな環境が盛り上がり生存競争繰り広げてくれると嬉しい。

関連キーワード

[iPhone][Android][写真][モバイル]

コメントを投稿する

名前URI
コメント

トラックバック URL(β)

iPhone4 バンパー無償配布は怪我の功名

2010/7/17 読まれた回数3597
このエントリーを含むはてなブックマーク |  このページを Google Bookmarks に追加 | Yahoo!ブックマークに登録 | このエントリの Delicious history

iPhone4のバンパー無償配布が発表されたそうです。
良かったね
【速報】アップルが発表したiPhone 4アンテナ解決策は...無料バンパー!

問題

iPhone4で左下の溝に手がかかると電波の入りが悪くなってしまう。
最悪通信不能、通話切断になる。

対策

溝に指がかからないようにバンパーと呼ばれるゴムベルトが無償配布する。
購入済みの人は返金に応じる
バンパー以外のオプションも選択可能
期限は9月30日まで、それ以降は未定

感想

AppleはiPhone4だけで発生する特別な問題じゃないという説明はやめた方がいいと思う。
iPhone3GSはもっと酷いというならiPhone3GS用のバンパーを配布しろってことになるし。
アンテナ剥き出しじゃない端末で発生するならバンパー配っても意味無いってことになる。

当初ユーザーに非があるような説明をしたり、苦しい言い訳を連発してしまったのでAppleは評判を落としたけれど、
きっとあと3ヶ月もしたら、バンパーを無償配布したっていう結果だけが記憶に残って、Appleのサポートはすばらしいという好印象に変わると思う。
だれだって無料で物をもらえるのは嬉しい。
最終的にAppleにとってはアンテナ問題で逆に評判を上げることが出来るんじゃないかな

この問題は任天堂のWiiリモコンを思い起こさせるけれど、
あれも結局任天堂のサポートはすばらしいという好印象に繋がった。
今はAppleは対応が遅すぎたように感じるけれど、
WiiもiPhone4も発売後1ヶ月前後での対応なので実は対応時期はAppleも任天堂と大差ない。

最初からバンパーがついていれば問題は発生しなかったけれど、そうするとAppleの対応すげーって印象も得られなかったわけだから、
僅かな投資でマスメディアに大量に取り上げられて、ユーザー満足度を大いに上げることが出来るので、単純に宣伝費としても美味しい方法だと思う。

AndroidユーザーとしてはiPhoneが益々伸びちゃうなぁと複雑な気持ちになりつつ、MacユーザーとしてはiPhoneアプリ作るぞってモチベーションに繋がってたりする。

おまけ
iPhone4はこんなに凄い 広島弁

関連キーワード

[iPhone][モバイル][IT]

コメントを投稿する

名前URI
コメント

トラックバック一覧

プログラマー's 雑録 JQuery POST [http://pro2.seesaa.net/article/159073298.html]

トラックバック URL(β)

RSSで読むRSSフィードを購読

プロフィール

kenz

新しいものが大好き
仕事ではクラウドをプライベートではAndroidアプリを作ってます。
最近、プログラムしている人が減っているのでSmallBasicの紹介記事でプログラム好きな人が増えてくれたら嬉しい

FriendFeed

日記の一覧

follow me

☆最新コメント

近況報告 
kenz:うん、タイムライン組...

近況報告 
Take:写真をiphotoに...

音楽が異常にいいゲー 
kenz:思った以上に曲数が増...

あわせて読みたいブログパーツ