前回のマインドマップの投稿より一週間が過ぎてしまいました。定期更新は難しいものですが、ブログ投稿を煽っている立場上そうも言っていられません。そこで、前回の続き、JSONをやります。
とはいっても、前回のようにphp-jsonをモジュールを読み込ませておけば、あとは簡単です。配列に対して json_encode 関数でエンコード、json_decode 関数でデコードすればいいだけですし。ここでは、mysql データベースと連携してランダムな列を返すようにします。
それでは、まずmysqlでの準備です。データを格納するのデータベースを "testdb"、接続ユーザを "myuser"、パスワードを "mypass" とすると、以下のコマンドで接続します。
$ su - myuser
$ mysql testdb -p
パスワードを聞かれますので "mypass" と入力すれば、mysql のコマンドプロンプトが出るはずです。SQLコマンドの CREATE TABLE でテーブルを作成し、その後 INSERT で何個かデータを入れてみましょう。
mysql> CREATE TABLE test_json (
mysql> j_id smallint(5) unsigned NOT NULL auto_increment,
mysql> j_name varchar(255) NOT NULL,
mysql> PRIMARY KEY (j_id)
mysql> );
Query OK, 0 rows affected (0.09 sec)
mysql> INSERT INTO test_json(j_name) VALUES ('joe');
mysql> INSERT INTO test_json(j_name) VALUES ('smith');
mysql> INSERT INTO test_json(j_name) VALUES ('bill');
mysql> SELECT * FROM test_json;
+------+--------+
| j_id | j_name |
+------+--------+
| 1 | joe |
| 2 | smith |
| 3 | bill |
+------+--------+
次にPHPスクリプト json_test.php を書きます。データベース接続にはmysql用の関数もあるのですが、ここではより汎用的に使えるPEAR::DBを使います。PEAR::DBの詳しい使いかたはここでは触れませんが、興味のあるかたは各自調べてみてください。完成したファイルは /var/www/html に置きます。
<?php
require_once('DB.php');
$dsn = 'mysql://myuser:mypass@localhost/testdb';
$db = DB::connect($dsn);
if (DB::isError($db)) {
die($db->getMessage());
}
$db->setFetchMode(DB_FETCHMODE_ASSOC);
$sql = "SELECT j_id, j_name FROM test_json ORDER BY rand() LIMIT 0,1";
$result = $db->query($sql);
if (DB::isError($result)) {
die($result->getMessage());
}
$row = $result->fetchRow();
$db->disconnect();
$js = json_encode($row);
header("Content-Type: text/json; charset=utf-8");
print $js;
?>
これで、test_jsonテーブルの中のランダムな一列をJSON方式で返すスクリプトのできあがりです(エラー処理はあまり考慮してません)。wgetでアクセスするとどんなデータが返ってきているかわかります。
$ wget http://localhost/json_test.php
(略)
長さ: 29 [text/json]
100%[====================================>] 29 --.--K/s
16:49:46 (1.11 MB/s) - `json_test.php' を保存しました [29/29]
$ cat json_test.php
{"j_id":"2","j_name":"smith"}
JSONのヘッダはウェブサイトによって書いてあることが違うのですが、UTF-8を指定しておくと多くのブラウザで対応できるようです。また、クライアント側でprototype.jsを使用する場合は、X-JSONヘッダを使うとライブラリの中で簡単に扱えるようです。
次回は、返ってくるJSONを汎用Javascriptライブラリであるdojo.jsでパースしてみようかと思います。こういう処理が手軽にできるようになってたんですねえ。
最近のコメント