« 2006年02月 | トップページ | 2006年12月 »

・[2006年11月29日]PHPのShift_JIS文字化け対策2
・[2006年11月28日]GoogleのSitemaps(サイトマッププロトコル)を作ろう
・[2006年11月20日]MySQLの文字化け対策
・[2006年11月19日]PHPでQRコードを作ってみよう
・[2006年11月17日]XML_Serializerを使ってみよう2
・[2006年11月16日]XML_Serializerを使ってみよう1
・[2006年11月14日]prototype.jsの使い方

2006年11月29日

PHPのShift_JIS文字化け対策2

以前にSJISの文字化け対策を書いてから数ヶ月経過しましたが、対策を書いた後にある仕事で見事に文字化けにハマってしまいました。
その時に新たな?発見をしましたので、今日は文字化け対策について書かせていただきます。

前回も文字化け対策の記事を見たい方は下記のリンクをご参照ください。
PHPのShift_JIS文字化け対策1

文字コードをSJISにして

$str = "一覧表";

このようなPHPプログラムを書いてみてください。

次にプレビューをしてみると、

Parse error: parse error in /xxx/xxxx/xxxxx/xxx.php on line xx

とParseエラーになると思います。

前回の記事をご覧の方や詳しい方は原因が分かると思います。
「表示」という文字が「表\示」に文字化けするのと同じ現象で、表の後ろに「\」が付くために「"」や「'」がエスケープされているのです。
先ほどの例で具体的に説明すると、

$str = "一覧表";

がプログラムでは
$str = "[88EA][9797][955C]";

と読み込んでいますので、「5C」=「\」と判断して「"」をエスケープ処理しているのです。

対策は、非常に簡単で「表」の後ろに「\」を入れるだけです。

$str = "一覧表";


$str = "一覧表\";

Shift_JISの「\」文字化けについては、原因が分かっているので問題なく開発できると思っていたのですが、思わぬところに落とし穴がありました^^;
ちなみにPHPでは

$str = "表示";

と書いても、「\」マークは入りません。それを知っていた為、私の「思い込み」でエスケープされているとは夢にも思わなかったのです(--)
まだまだ甘いなぁ。。。

折角なので、SJISの文字化けについてもう少し触れたいと思います。
プログラマーはSJISでの開発で必ずと言っていいほど、この文字化け問題にぶつかります。
では、いつ「\」がつくのでしょうか?
私が今まで経験したのは以下の2つです。
1.入力フォームの値を受け取ったとき
2.外部ファイル(テキストやExcelファイル)を読み込んだとき
1の「入力フォームの値を受け取ったとき」にが一番多いと思います。
下記のようなスクリプトをプログラムの一番上に設置すると、入力フォームから値を受け取った際に文字化けを起こしません。

if($_SERVER['REQUEST_METHOD'] == "POST") {
  if(ini_get('magic_quotes_gpc') == "1") {
    foreach($_POST as $k => $v) {
      $_POST[$k] = stripslashes($v);
    }
  }
}
if($_SERVER['QUERY_STRING'] != "") {
  if(ini_get('magic_quotes_gpc') == "1") {
  foreach($_GET as $k => $v) {
      $_GET[$k] = stripslashes($v);
    }
  }
}

フォームからは「POST」と「GET」の2種類のデータを受け取ります。
$_SERVER['REQUEST_METHOD']を参照することにより「POST」データか「GET」データを判断できます。
1行目の
if($_SERVER['REQUEST_METHOD'] == "POST") {

は、「POST」データを受け取ったら任意の処理をします。
つまり1行目から7行目は、「POST」を受け取った際に処理を行います。

8行目の

if($_SERVER['QUERY_STRING'] != "") {

は、URLに引数がある場合に処理を行います。「GET」を受け取った際に処理を行います。
8行目を
if($_SERVER['REQUEST_METHOD'] == "GET") {

としない理由は、「POST」でフォームの値を受け取る時以外は「$_SERVER['REQUEST_METHOD'] 」は「GET」になるからです。
簡単に言うと、特別な処理がない限り「$_SERVER['REQUEST_METHOD'] == "GET"」になるのです。

2行目と9行目の

if(ini_get('magic_quotes_gpc') == "1") {

前回の記事でも紹介した通り、「magic_quotes_gpc」が「On」の場合のみに処理をします。

後は、「POST」と「GET」をforeachでアンエスケープしています。
これでフォームの値は文字化けせずにスクリプトを組むことが出来るかと思います。
私の場合は、上記のような処理をオブジェクト化して使ってます。

今日は、「Shift_JISの文字化け対策2」をご紹介させて頂きました。
少しでも役に立てば幸いです。

前回の「Shift_JISの文字化け対策1」をページへ

| | コメント (0) | トラックバック (0)

2006年11月28日

GoogleのSitemaps(サイトマッププロトコル)を作ろう

先日、米のGoogle,Yahoo,Microsoftの検索エンジン大手の3社が「Sitemaps 0.90」に対応させると、発表がありました。
今まではそれぞれの検索エンジン用のSitemapsを作っていましたが、近い将来統一してくれるそうです。
米で始まったばかりなので、日本ではまだまだ先の話かなぁ。。。
このサイトを立ち上げた当初(1年前)からGoogle用にSitemaps(サイトマップ)を作って実験してきました。作ると言っても自動ですが、、、
やり始めのころはサービスを始めたばかりとのこともあり、目ぼしい機能もなかった上に自動でSitemapsを作っていたので放置してました。
先日、久々にログインをしてみると「インデックス登録日」「インデックス更新日」「ロボットが拾ったキーワード」「検索語句での順位」「ランクの高・中・低ページの割合」等、色々な情報や機能が実装されていました。(いつの間に!?)
今では定期的にチェックしています。SEO対策にも使えそうな機能が沢山あるので興味のある方は登録してみてください。
と言うことで今日はXML形式のSitemapsの作り方を紹介します。

・Google本家のヘルプページ
ウェブマスター向けヘルプセンター
*右上にある「Change Language」で日本語に変換できます。

・今回参考にしたページ
Googleウェブマスターツール XMLの作り方

Googleでは4種類のSitemaps(サイトマップ)が使用可能です。
・サイトマッププロトコル
今回、ご紹介するXML形式のサイトマップです。
・OAI-PMH
これは全然調べてません^^;
・シンジケーション フィード
RSS2.0やAtom0.3をSitemapsとして使えます。
・テキスト ファイル
1行に1つのURLを記述する一番簡単な方法です。

サイトマッププロトコル(XML形式)で作ってみます。
まず、通常通りXML宣言文を記述します。

<?xml version="1.0" encoding="UTF-8"?>

次に、urlsetタグを記述します。

<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">
</urlset>

サイトマッププロトコルでは必ず最初と最後を「<urlset>」で囲みます。
xmlns属性も必ず入れましょう(2006年11月28日現在では0.84ですが、近い将来変わるかもしれません)。これは約束事でHTMLファイルをhtmlタグで囲むのと同じような意味だと思ってください。

urlsetタグの中にurlタグを入れます。

<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">
<url>
</url>
</urlset>

urlタグの中にはインデックスさせたいページのURLや更新日時を書いて行きます。
urlタグ1つにつき、1ページ分の情報を指定します。

次はurlタグの中に情報を書き込んで行きます。

<url>
<loc>http://xxx.xxxxx.xx/</loc>
<lastmod>2006-11-19T16:12:05Z</lastmod>
<changefreq>monthly</changefreq>
<priority>1.0</priority>
</url>

locタグはURLを指定します。この項目は必須です。
lastmodタグは最終更新日時を指定します。時間を省いて年-月-日で指定することも出来ます。オプションなので指定しなくても問題ありません。
changefreqタグはページの更新頻度を指定します。上記の例では「monthly」なので1ヵ月に1回更新してますと言うことです。(ただし、指定した期間に必ずクロールされるとは限りません。あくまで目安です。)changefreqタグもオプションです。
priorityタグは自サイト内のみで優先順位を0.0~1.0の範囲内で指定します。数字が高いほど優先順位が高くなります。これもオプションで、デフォルト(指定なし)では0.5になります。
あくまで自サイト内のみの優先順位の為、全てを1.0にしても順位が上がることはありません。

後は、自由にurlタグを増やしてサイトマッププロトコルを増やして行きましょう。

Sitemaps(サイトマッププロトコル)製作例

1つのSitemapsで最大50,000件又は10MBまで登録できます。50,000件又は10MB以上のページが存在する場合、2つ以上のSitemapsを1つにすることで対応可能です。詳細は下記をご参照ください。
複数のサイトマップを登録する方法

今回はSitemapsについて、ご紹介させていただきました。
最後に、サイトマッププロトコルのタグ一覧表を作りました。

*は必須項目です。

<urlset>*ファイル全体を囲い込みます。

例)<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">~</urlset>

<url>*URLや更新日時(<loc> <lastmod> <changefreq> <priority>)を囲むタグです。
<url>1つにつき、1ページ分の情報を指定します。

例)<url>他のタグ</url>

URLタグ内で使用可能なタグ
*は必須項目です。

<loc>*インデックスに登録するURLを指定します。

例)<loc>http://xxx.xxxxx.xx</loc>

<lastmod>ページの最終更新日時です。年-月-日に省略することも可能です。

例)<lastmod>2006-11-19T16:12:05Z</lastmod>
例)<lastmod>2006-11-19</lastmod>

<changefreq>ページの更新頻度を指定します。ただし、指定した期間に必ずクロールされるとは限りません。あくまで目安です。

・alwaysアクセスする度に内容が変わるページ
・hourly1時間に1回ペースで内容が変わるページ
・daily1日に1回ペースで内容が変わるページ
・weekly1週間に1回ペースで内容が変わるページ
・monthly1ヶ月に1回ペースで内容が変わるページ
・yearly1年に1回ペースで内容が変わるページ
・neverアーカイブページのURL

例)<changefreq>monthly</changefreq>

<priority>サイト内の優先順位です。0.0~1.0の値を指定します。
数字が高いほど優先順位が高くなります。
デフォルト(指定なし)では0.5になります。
あくまで自サイト内のみの優先順位の為、全てを1.0にしても順位が上がることはありません。

例)<priority>1.0</priority>

・関連記事
Movable TypeでSitemaps(サイトマッププロトコル)を作ってみよう

| | コメント (0) | トラックバック (0)

2006年11月20日

MySQLの文字化け対策

MySQL4.0以前のバージョンからMySQL4.1以上にバージョンアップした際に文字化けが発生することがあります。
もちろん文字化けが起こるのには原因があり、私が初めてこの問題が起こった時に、調査に丸一日かかりました。
今回は、その対策を記述しようと思います。

対策は至って簡単です。MySQLの設定を変えてあげるだけです。
MySQLの設定ファイルが何処にあるのか分からない方もいらっしゃると思いますので、ディレクトリパスを記述しておきます。

・Windows XP C:\WINDOWS\my.ini

・Linux
/etc/my.cnf

尚、環境やインストール時の設定により変わっていることがありますので見つからない場合は、ファイル名で検索してみて下さい。
Linuxの場合は、SSH等でアクセスした後に「find / -name *my.cnf」で検索することが出来ます。ただし、アクセス許可のないページは「find: アクセス許可がありません」等のメッセージが出ます。(場合によっては大量に出ます)

設定ファイルが見つかったら、そのファイルをテキスト編集エディタで開いて下さい。

[mysqld]

という記述があるはずです。その下に
default-character-set=ujis

と付け足してください。
上記はEUCの場合のみですので、
・Shift_JISの場合
ujis の部分を sjis
・UTF-8の場合
ujis の部分を utf8
として下さい。
また、「[mysqld]」がない場合は「[mysqld]」と一緒に記述して下さい。
[mysqld]
default-character-set=ujis

MySQL4.0以前でも、この設定をしていない場合、全角の平仮名やカタカナの並び替えがうまく出来ません。並び替えを行う場合は、必ず設定する必要があります。

| | コメント (0) | トラックバック (0)

2006年11月19日

PHPでQRコードを作ってみよう

今回は、PHPでQRコード作る方法(QRcode Perl CGI & PHP scripts)を紹介します。
動的にQRコードを作れるという事は、PHPやPerl等の動的ページにもページ単位でQRコードを掲載することが可能です。
しかも、そのスクリプトはY.Swetake氏がフリーで配布しています。
フリーで使えるのは私達フリーのプログラマーにとって凄く助かります^^;
注意点:GDが使えることが条件となります。バージョンはGD 1.8.4 またはGD 2.0.10 以上の使用を推奨しています。(swetake.comより)

早速、QRコードを作ってみましょう。
はじめに下記のサイトから「QRcode Perl CGI & PHP scripts」をダウンロードして下さい。
2006年11月19日時点で、バージョンは0.50です。

swetake.com

ダウンロードが終わったら、ダウンロードした圧縮ファイルを解凍して下さい。
次にPHPを動かせるディレクトリ(仮に「home」とします)に、「qr_img」ディレクトリを作ります。
先ほど解凍したファイルの中から「data」「image」「php」の3つのディレクトリを「qr_img」ディレクトリの中に移動します。
最後に「qr_img」ディレクトリと同じ階層に「qr.php」(テスト用のプログラム)空ファイルを作ります。
最終的に以下のような構成になると思います。

[home]
 └─ qr.php
 │
 └─[ qr_img]
  └─ [data]
  └─ [image]
  └─ [php]

※「QRcode Perl CGI & PHP scripts」は6MB程の容量があります。

qr.phpに下記のimgタグを入れて下さい。

<img src="qr_img/php/qr_img.php?d=test">

下記のようにQRコードが生成されると思います。

このQRコードを読み取ると「test」と表示されます。

imgタグのsrc属性に「qr_img/php/qr_img.php」を指定して、引数dにはURLエンコードしたテキストを入れています。
これだけで、QRコードが自動生成されます。
これだけでは味気ないので、プログラマーらしく?動的に生成してみましょう。
qr.phpのimgタグを消して下記のコードに書き換えて下さい。

<html>
<body>
PHPでQRコードを作成する<br>
<form action="qr.php" method="post">
<textarea name="message" cols="50" rows="5"><?php echo $_POST['message']; ?></textarea><br>
<br>
<input type="submit" value="QRコードを作成する">
</form>
<br>
<?php if($_POST['message'] != ""): ?>
作成したQRコード<br>
<img src="qr_img/php/qr_img.php?d=<?php echo urlencode($_POST['message']); ?>">
<?php endif; ?>
</body>
</html>

PHPでQRコードを自動生成する(完成品)

入力フォームに記入した内容をURLエンコードして、srcの引数にセットしています。
引数「d」以外にどのような項目をセットできるのでしょうか。使用可能な引数を一部ご紹介します。

d:QRコード化するデータ(必ずURLエンコードをすること)
s:画像のサイズ(1-40)
マニュアルには1以上と書いてあったのですが、40以上を指定したら画像なしになりました。
t:「J」でJPEGになります。省略した場合はPINGになります。

ちょっとシステムを改造して以下のようなプログラムを作ってみました。

PHPでQRコードを自動生成する(改良版)

画像サイズの変更やJPEG、PINGを選択出来るようにしました。
引数にセットするだけなので、簡単に作れると思います。

引数ももっと沢山の種類がありますので、気になる方はチェックしてみて下さい。
私がPHP使いなので、PHP版を紹介しましたがPerlでも同じ物が作れるようですので興味のある方は調べてみて下さい。

| | コメント (1) | トラックバック (0)

2006年11月17日

XML_Serializerを使ってみよう2

前回に引き続きXML_Serializerを紹介します。
前回は、XMLをObjectに変換するプログラムをご紹介しましたが、今回は、ObjectをXMLに変換するプログラムをご紹介します。

・XMLをObjectに変換するプログラム(前回の記事)
XML_Serializerを使ってみよう1
・PEAR::XML_Serializerダウンロード
PEAR::XML_Serializer
・インストールに関しては下記をご覧下さい
レンタルサーバーでPEARを使う方法

今回は、前回読み込みに使った「my.xml」と同じものを作ります。
my.xml

<?xml version="1.0" encoding="UTF-8"?>
<myxml>
  <myName>ピヨヒコ</myName>
  <myAge>25</myAge>
</myxml>

まずは下記のような単純なクラスファイルを作ります。
・myXml.php

class MyXml {
  var $myName;
  var $myAge;
}

仮にこのクラスファイルの名前を「myXml.php」とします。

このクラスファイルを使って、XMLの生成をしてみます。
まずはじめに、XML_Serializerと先ほど作ったmyXml.phpをインクルードさせます。

require_once("XML/Serializer.php");
require_once("myXml.php");

次は、myXmlオブジェクトを生成して、「myName」「myAge」各プロパティをセットします。

$myXml = new MyXml();
$myXml->myName = "ピヨヒコ";
$myXml->myAge = "25";

次に、パラメータを準備した後にXML_Unserializerの宣言をします。
$param = array(
  XML_SERIALIZER_OPTION_INDENT => "\t",
  XML_SERIALIZER_OPTION_XML_ENCODING => 'UTF-8',
  XML_SERIALIZER_OPTION_XML_DECL_ENABLED => TRUE,
);
$xml = new XML_Serializer($param);

前回と同じく、$paramというハッシュを準備して、それをXML_Serializer宣言の引数にセットしています。
XML_SERIALIZER_OPTION_INDENTはインデントを指定します。ここでは「\t(TABキー)」を指定します。
XML_SERIALIZER_OPTION_XML_ENCODINGは宣言する文字コードを指定します。宣言するだけで実際には文字コード変換はされませんのでご注意下さい。もし、文字コードを変更したい場合は、mb_convert_encoding()等を使って下さい。
XML_SERIALIZER_OPTION_XML_DECL_ENABLEDを、TRUEにするとXML宣言文を追加します。
ここで紹介した以外にも沢山の設定ができますので興味のある方は調べてみて下さい。

次はいよいよオブジェクトをXMLに変換します。
非常に簡単で以下の一行を加えるだけです。

$xml->serialize($myXml);

最後にデータを表示させます。

header("Content-Type: text/xml; charset=utf-8");
echo $xml->getSerializedData();
exit();

getSerializedData()メソッドで、変換したXMLを参照できます。
今回は直接表示させましたが、fputs()を使ってXMLファイルを作ることも可能です。

今回のスクリプトを1つにまとめると

require_once("XML/Serializer.php");
require_once("myXml.php");

// シリアライズ処理を行うオブジェクト
$myXml = new MyXml();
$myXml->myName = "ピヨヒコ";
$myXml->myAge = "25";

// XMLを生成する
$param = array(
  XML_SERIALIZER_OPTION_INDENT => "\t",
  XML_SERIALIZER_OPTION_XML_ENCODING => 'UTF-8',
  XML_SERIALIZER_OPTION_XML_DECL_ENABLED => TRUE,
);

$xml = new XML_Serializer($param);
$xml->serialize($myXml);

header("Content-Type: text/xml; charset=utf-8");
echo $xml->getSerializedData();
exit();


このようになります。

スクリプトの実行例

2回に渡ってXML_Serializerをご紹介させて頂きましたが、いかがでしたでしょうか?
XMLを使うことで、別サーバーのデータを簡単に扱えるようになったり、異なるプログラム言語同士でデータのやり取りを行うことができます。XMLを自在に操ることが出来ればプログラミングの幅が広がるのではないでしょうか。

PEAR::XML_Serializerのご紹介にあたり下記の「PEAR入門 PHP標準ライブラリを極める!」を参考にさせて頂きました。
PEARのインストール方法や基本的なPEARの使い方について書かれています。細かい部分まで記述してありますので参考になると思います。
Product image for ASIN: 4798109592PEAR入門 PHP標準ライブラリを極める!

・関連記事
XML Libraryを使ってみようを見る
シンプルで簡単にXMLを扱えます。

| | コメント (0) | トラックバック (0)

2006年11月16日

XML_Serializerを使ってみよう1

ここ数年の間に大手の企業からもWEBサービスの提供が増えてきました。
Amazon WEBサービス(英語)」を筆頭に、Yahoo!デベロッパーネットワークや価格.com・じゃらん・Weather Hacks(livedoor天気情報)等、様々なサービスがあります。
情報の取得手段として2種類(REST・SORP)ありますが、現在普及しているのは「REST」と呼ばれる通信手段が主流のようです。
RESTとは、WEBサービスを行っている各サイトにHTTP通信を使ってアクセスを行うとXML形式のデータを取得して、そのXMLのデータを使って各ユーザーが自分のサイトで自由に使うと言うものです。(ただし、データの改ざん等は禁止されていることが多いです)
これらのサービスを使うときにXML解析のプログラムを作ることになりますが、今回はXML解析に役立ちそうなPEAR::XML_Serializerを紹介します。
紹介前に下記のサーバーからPEAR::XML_Serializerをセッティングしておいてください。
PEAR::XML_Serializerは2006年11月16日時点で、バージョンが0.18.0 (beta)の為、正常に動作しないこともあるかと思いますのでご注意下さい。

・PEAR::XML_Serializerダウンロード
PEAR::XML_Serializer
・インストールに関しては下記をご覧下さい
レンタルサーバーでPEARを使う方法

使い方を覚えて頂く為に、シンプルなXMLを準備してそれを読み込ませてみます。

今回、準備したテスト用のXMLは下記の通りです。
my.xml

<?xml version="1.0" encoding="UTF-8"?>
<myxml>
  <myName>ピヨヒコ</myName>
  <myAge>25</myAge>
</myxml>

早速、XMLを読み込みスクリプトの製作を始めます。
はじめにXML_Unserializer.phpを読み込みます。

require_once("XML/Unserializer.php");

次に、パラメータを準備した後にXML_Unserializerの宣言をします。

$param = array(
  'complexType' => "object",
);
$xml = new XML_Unserializer($param);

$paramというハッシュを準備して、それをXML_Unserializer宣言の引数にセットしています。
$paramの「complexType」は、"object"と"array"の2種類があり、"object"をセットすると読み込んだXMLをオブジェクトとして扱うことができます。"array"をセットした場合は、XMLを配列(ハッシュ)として扱うことができます。
今回は、objectで使ってみます。

今度は、XMLを読み込みます。

$xml->unserialize("my.xml", TRUE);

第一引数には、ファイルパスを記述しています。
第一引数は、HTTP通信のアクセスでも可能です。ただし、相手サーバーから拒否された場合は読み込み出来ません。(「.htaccess」での制限がかかってたり、サーバーが落ちている場合等)
第二引数には、第一引数がファイルパスの場合「TRUE」、XMLを直接記述した場合には「FALSE」を指定するか何も指定しません。

最後に

var_dump($xml->getUnserializedData());

と、記述してXMLがオブジェクト化されていることが確認できます。

スクリプトを1つにまとめると

require_once("XML/Unserializer.php");

// XMLを読み込む
$param = array(
  'complexType' => "object",
);

$xml = new XML_Unserializer($param);
$xml->unserialize("my.xml", TRUE);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php var_dump($xml->getUnserializedData()); ?>
</body>
</html>


このようになります。

スクリプトの実行例

今回は、PEAR::XML_SerializerのUnserializer(XML読み込みプログラム)をご紹介させていただきました。
次回は、XMLを書き出すSerializerをご紹介させて頂きます。

XML_Serializerを使ってみよう2を見る

また、PEAR::XML_Serializerのご紹介にあたり下記の「PEAR入門 PHP標準ライブラリを極める!」を参考にさせて頂きました。
PEARのインストール方法や基本的なPEARの使い方について書かれています。細かい部分まで記述してありますので参考になると思います。
Product image for ASIN: 4798109592PEAR入門 PHP標準ライブラリを極める!

| | コメント (0) | トラックバック (0)

2006年11月14日

prototype.jsの使い方

かなり久しぶりの投稿になります^^;
全く更新せずにほっときました。。。やっとやる気が出てきましたので、これからまったりと更新して行こうと思います。
今回は、prototype.jsのAjaxの機能を紹介します。
prototype.jsとはjavascriptのフレームワークのことで、フレームワークを使うメリットは
・ブラウザに依存することなく、記述することができる
・複雑な記述を簡潔にしてある
他にもあると思いますが、ざっと思いつく限りこんな感じです。
デメリットはprototype.js特有の記述をする為、人によっては見難くなると思います。
更にブラウザの依存がなくなると言っても、全てを吸収しきれるわけではないので注意して下さい。

以下のサイトからダウンロードして下さい。
prototype.js本家

参考までに、以下の「prototype.js の開発者向けメモ」で詳細まで使い方を紹介してくれています。
prototype.js の開発者向けメモ

まずは、「prototype.jsのテスト」ページをご覧下さい。
こちらのページが今回の完成品になるのですが、入力フォームにテキストを入力してボタンをクリックすると入力フォームに入力した内容が表示されるようになっています。
このぐらいであれば、Ajaxを使うまでもなく通常のjavascriptだけでも行けるのですが練習用にこのような形にしてみました。

prototype.js本家のサイトにある「Just the .js, please」リンクをクリックして、prototype.jsをダウンロードします。
次に適当なディレクトリ(ここでは「home」とします)を作ってその中に「js」ディレクトリを作り、「js」ディレクトリの中にprototype.jsを入れます。
「home」ディレクトリの中に、index.phpとajax.phpの2つのファイルを作ります。

最終的に以下のような構成になります。

[home]
 └─ ajax.php
 └─ index.php
 │
 └─[ js]
  └─ prototype.js

次に「index.php」のbodyタグ内に入力用のフォームを作ります。

<input type="text" id="message" value=""><br>
<input type="button" value="prototype.jsをテストする" onClick="sampleAjax();">

続いてheadタグ内に

<script src="./js/prototype.js" type="text/javascript"></script>

を記述して「prototype.js」を読み込ませます。

その下に、Ajax用のjavascriptを記述して行きます。

function sampleAjax() {
  var url = 'ajax.php?message=' + encodeURI($('message').value);
  var ajax = new Ajax.Request(url , {method: 'get', onComplete: ajaxReturn});
}

ここでちょっと見慣れないスクリプトがあります。
「$('message').value」
これは何でしょう?実はこれが「prototype.js」の強力な機能の1つです。
inputタグのidに「message」と付けましたが、これを「$(id名)」とするだけでフォームに記述した内容を取り出すことができます。
つまり
document.フォーム名.message.value

$('message').value
としています。
id要素で記述できるタグなら何でも情報を取り出すことができるようです。

次の
new Ajax.Request(url , {method: 'get', onComplete: ajaxReturn});
これで、Ajaxを動かしています。これもprototype.js特有のやり方です。
Ajax.Request(url , {method: 'xxxx', onComplete: xxxx})
url:対象のURL(GETで渡す場合は、「?」の後ろに引数を指定する)
method:「get」か「post」を指定('「シングルクォーテーション」で囲む)
onComplete:対象のURLから処理が終わった後に呼び出す関数名

更に、以下のスクリプトを追加します。

function ajaxReturn(request) {
  alert(request.responseText);
}

「Ajax.Request」の「onComplete」で「ajaxReturn」と記述しました。Ajaxの処理後に、ajaxReturnの関数を呼び出してくれます。
では、ajaxReturnの引数にある「request」は何でしょう?
これはurlから返された値を参照する為に使用します。

例えば、ajax.phpに

<?php
  echo "フォームに入力された内容は:「".$_GET['message']."」です";
?>

と記述してあったとします。ajax.phpでechoされた値が、「ajaxReturn」の引数「request」の中に格納されるのです。
request.responseText
で、受け取ったテキストをそのまま取り出すことが可能になります。

今までのスクリプトをまとめると

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>prototype.jsのテスト</title>
<script src="./js/prototype.js" type="text/javascript"></script>
<script type="text/javascript">
<!--

// Ajaxサンプルプログラム
function sampleAjax() {
  var url = 'ajax.php?message=' + encodeURI($('message').value);
  var ajax = new Ajax.Request(url , {method: 'get', onComplete: ajaxReturn});
}

// Ajax処理後に動作するプログラム
function ajaxReturn(request) {
  alert(request.responseText);
}

//-->
</script>
</head>

<body>
<input type="text" id="message" value=""><br>
<input type="button" value="prototype.jsをテストする" onClick="sampleAjax();">
</body>
</html>


このような感じになります。

今回はprototype.jsを使ったAjaxの基本機能を紹介しました。
javascriptのフレームワークはこの他にも「jQuery」や「Yahoo!UIライブラリ」等、数多く存在します。
それぞれに特徴がありますので、一通り体験した上で自分にあったフレームワークをお使いになることをお勧めします。(私も他のフレームワークを勉強中です^^;)

・関連記事
jQueryを使ってみよう
Yahoo! UIライブラリを使ってみよう
HTML_AJAXを使ってみよう

今回の紹介に当たって、以下の本を参考にしました。
下記の本は、PHPやMySQLの基本からAjaxの基本まで紹介しています。
プログラムのことは分からないけど、1から勉強したい人やAjaxの基礎だけを勉強したい初心者向けです。
Product image for ASIN: 489362234Xはじめに読みたいAjax ~入門から実践まで~

下記の本は、はじめに読みたいAjaxで物足りなかった人や、最低限の知識(PHP,Javascriptの基本)をマスターしている中級者向けです。
prototype.jsやYahoo!UIライブラリについても沢山掲載してあります。
Product image for ASIN: 4896273052Ajaxハッカーズ・プログラミング―基礎からprototype.js、Yahoo!UIライブラリ、HTML_AJAXの活用までWebアプリケーション制作のプログラミング・テクニック


| | コメント (0) | トラックバック (0)