IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Open source  >

PHP を使って Twitter 風のシステムをサイトに構築する

PHP を使用すれば、どんなアプリケーションにも Twitter のようなマイクロブロギングを簡単に追加できます

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

原文はこちら

原文はこちら


レベル: 中級

Thomas Myer, Consultant and Freelance Writer, Triple Dog Dare Media

2009年 02月 24日

PHP を使ってアプリケーションに Twitter 風のインターフェースを追加する方法を学んでください。具体的には、この記事ではユーザーが投稿を追加できるようにする方法、投稿を受信したいという他のユーザーに投稿を配信する方法、そしてユーザーが他のユーザーの投稿をフォローできるようにする方法を説明します。

Web 2.0 の世界に今まで少しでも気を留めていたとすれば、Twitter が大評判になっていることはご存知のはずです。Twitter を知らないという読者のために説明すると、Twitter (Twitter.com が提供するサービス) は、ユーザーが「いまなにしてる?」という質問に対して 140 文字以内の短い投稿 (「つぶやき」と呼ばれます) で答える単純なマイクロブロギング・サービスです。ユーザーは興味のあるつぶやきを投稿した他のユーザーをフォローすることもできますし、逆に他のユーザーが自分のことをフォローする場合もあります。Twitter はこのようにして、情報を限られたコミュニティーに公開したり、あるいは広範囲に広めたりできるサービスです。

Twitter ユーザーのつぶやきをちらっと見れば、ユーザーが日常的な話題 (例えば、「サンドウィッチを食べてる」など) から崇高な話題に至るまで、多種多様な話題についてつぶやきを作成していることがわかります。投稿には画像やメディア・ファイル、そしてブログ投稿へのリンクが組み込まれていることもよくあります。これらの URL は大抵の場合、TinyURL などのサービスによって短縮されていますが、これは主に、投稿の文字数を合計 140 文字以下に抑えるためです。

Twitter にはまり、その極めて凝縮されたフォーマットを利用して高度なフォームを作り出した人々は大勢います。そうして作られたフォームには、(例えばユーザーの発言を @user に送信するなどの手段で) 他のユーザーと会話するというフォームまであります。このように、単純な Twitter から数えきれないほどの Twitter 対応のモバイル・アプリケーションやその他のツールが誕生しています。今では、最も面白いつぶやき、最も崇高なつぶやき、そして最も真実に満ちたつぶやきに贈られる賞があったり、多種多様な Twitter アプリケーションの普及状態を追跡するオンライン・アプリケーションまであったりします。

現在、LinkedIn、Facebook などのサイトやサービスの多くでは明らかに Twitter 流の方法によって、ユーザーが自分の近況をアップデートできるようにしています。例えば Facebook で近況をアップデートするには、「いま何をしていますか」という質問に短いメッセージで答える形で行います。

マイクロブロギングや近況をアップデートするためのツールをサイトに追加するのは大変な作業ではありません。しかも、それによってサイトのユーザーに楽しく簡単なコミュニケーション手段を提供することができます。その方法を説明するのが、この記事の目標です。しかしまず、本題に入る前に、いくつかの前提を設けておかなければなりません。

まず、PHP および MySQL についての知識があることを前提とします。また、ローカルで使用できる何らかの Apache Web サーバーにアクセス可能であること、さらにこのサーバーが PHP と MySQL を実行していることも前提とします。この記事では、MacBook Pro で Macintosh、Apache、MySQL、PHP (MAMP)、そして 1 つのパッケージですべての開発環境を提供する便利なフリーウェア・プログラムを使用して開発を行いますが、Microsoft® Windows® や Linux® でも問題なく開発できるはずです。最後の前提として、この記事の説明は、何らかの形でユーザーが関係するアプリケーションがすでにあり、実行中のそのアプリケーションにマイグロブロギングまたはつぶやきの機能を追加するという設定で進めます。そのため、アプリケーションの機能のなかでもユーザー自身の設定に関する部分 (ログイン、プロフィールの管理など) は省略し、投稿の機能に焦点を絞って説明します。

アプリケーションのバックエンドを設計する

基本的に Twitter サービスの中心となるのはユーザーとメッセージの 2 つです。構築済みのアプリケーションに Twitter のようなサービスを追加するのであれば、ユーザー管理はすでに行われていると思いますが、そうでない場合には、データベース・テーブルに含まれる各ユーザーを一意に識別する何らかの方法 (主キー。通常は整数)、ユーザー名 (同じく一意)、E メール・アドレス、パスワードなどが必要となります。

つぶやき (つまり、投稿) は投稿テーブルに保存されます。このテーブル内では、投稿ごとに主キー (何らかの連続した整数)、投稿したユーザーを参照する外部キー関係、投稿自体 (文字数で制限)、日時スタンプが設定されます。

全体を構成する最後の要素は、どのユーザーが誰をフォローしているのかを明らかにするデータベース・テーブルです。ユーザー ID とフォロワー ID を記録する方法さえあれば、アプリケーションは素早くフォロワーのリストを作成し、他のユーザーをフォローするためにサインアップしているフォロワーに容易に情報を配信することができます。

ここからの手順に従うには、この時点で 3 つのデータベース・テーブルを設定してください。最初に、リスト 1 に記載する SQL コードを使用して users テーブルを作成します (既に users テーブルがある場合には、以下のコードは無視してください)。


リスト 1. users テーブル

CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 255 ) NOT NULL ,
`email` VARCHAR( 255 ) NOT NULL ,
`password` VARCHAR( 8 ) NOT NULL ,
`status` ENUM( 'active', 'inactive' ) NOT NULL
) ENGINE = MYISAM ;


次に、以下のコードで posts テーブルを作成します。


リスト 2. posts テーブル

CREATE TABLE `posts` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user_id` INT NOT NULL ,
`body` VARCHAR( 140 ) NOT NULL ,
`stamp` DATETIME NOT NULL
) ENGINE = MYISAM ;

そして最後のテーブル、following はリスト 3 のコードで作成します。このテーブルには 2 つの主キーがあることに注意してください。


リスト 3. following テーブル

CREATE TABLE `following` (
`user_id` INT NOT NULL ,
`follower_id` INT NOT NULL ,
PRIMARY KEY ( `user_id` , `follower_id` )
) ENGINE = MYISAM ;

作業を進める前に、header.php というファイルを作成し、MySQL に接続するために必要なすべてのストリングをこのファイルで設定してください。これに相当するファイルがすでにある場合には、新規に作成する必要はありません。ただし今後の作業で必要になるため、該当する箇所には必ず、そのファイルを組み込んでください。リスト 4 に、header.php ファイルのサンプルを記載します。


リスト 4. サンプル header.php ファイル

$SERVER = 'localhost';
$USER = 'username';
$PASS = 'password';
$DATABASE = 'microblogger';
   

if (!($mylink = mysql_connect( $SERVER, $USER, $PASS))){
	echo  "<h3>Sorry, could not connect to database.</h3><br/>
	Please contact your system's admin for more help\n";
	exit;
}

mysql_select_db( $DATABASE );

この header.php ファイルには、あらゆるタイプのセキュリティー・チェックを自由に追加してもらって構いません。その一例は、(ユーザーが実際にログインしていることを示す) セッション変数にユーザー ID が設定されているかを確認するためのチェックです。こうすれば、ユーザーがログインしていない場合、そのユーザーをログイン・ページにリダイレクトすることができます。この記事では詳しく説明しませんが、このようなセキュリティー・チェックが必要な場合にはごく簡単に追加することができます。




上に戻る


入力フォームを作成する

バックエンドのテーブルは設定できたので、次はデータの挿入と更新を処理する PHP について検討します。今この時点で必要なのは、以下の役割に対応する単純な関数です。

  1. ユーザーがログインして投稿を追加できるようにする
  2. 追加された投稿を、そのユーザーをフォローする全員に配信する
  3. ユーザーが他のユーザーをフォローできるようにする

私は普段、CodeIgniter などのモデル・ビュー・コントローラー (MVC) アプリケーション・フレームワークのコンテキストで作業を進めています。MVC アプリケーション・フレームワークには、この種のアプリケーションを作成するための本格的なツール一式が揃っているからです。例えば通常なら、私はまず users、posts、および following テーブルを操作するための 2 つのモデル (1 つはユーザー用、もう 1 つは投稿用) を作成し、それから作業を進めます。

読者はこれとは異なるフレームワークですでに作業を進めている可能性があるので、今回はこの手法を適用しないことにしました。代わりに選んだのは、フレームワークに依存しない、もっと単純な手法です。さらに今回に限っては、少しインチキをして users テーブルにレコードを追加し、アプリケーションで使用するための一連のテスト・ユーザーを作成しておきます。私は 3 人のテスト・ユーザーを作成し、ユーザー名をそれぞれ janetommybill としています。

テスト・ユーザーを用意したら、次に主要な機能を含めるための functions.php という単純な PHP ファイルを作成します。このファイルのなかに、マイクロブロギング・アプリケーションのコンテキスト内で動作する関数をいくつか作成することになります。

最初に作成する関数 (リスト 5 を参照) は、コンテンツを posts テーブルに追加するための単純なものです。


リスト 5. posts テーブルにコンテンツを追加する関数

function add_post($userid,$body){
	$sql = "insert into posts (user_id, body, stamp) 
			values ($userid, '". mysql_real_escape_string($body). "',now())";

	$result = mysql_query($sql);
}

この単純な関数をテストするには、さらに 2 つの PHP ファイルを追加する必要があります。1 つは index.php ファイルです。このファイルには、とりあえず基本となる単純なフォームを含めますが、このページには後からさらに内容を追加します。追加するもう 1 つの PHP ファイルは、フォームを投稿する add.php という名前のファイルです。リスト 6 に、index.php ファイルのマークアップを記載します。注意する点として、ここでは PHP セッションを使用して、ユーザー ID の値をデータベース内での jane のユーザー ID である 1 にハードコーディングしています。今のところはこの方法でまったく問題ありませんが、後で変更が必要になることは明らかです。


リスト 6. index.php ファイルのマークアップ

<?php 
session_start();
include_once('header.php');
include_once('functions.php');

$_SESSION['userid'] = 1;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
	<title>Microblogging Application</title>
</head>
vbody>

<?php
if (isset($_SESSION['message'])){
	echo "<b>". $_SESSION['message']."</b>";
	unset($_SESSION['message']);
}
?>
<form method='post' action='add.php'>
<p>Your status:</p>
<textarea name='body' rows='5' cols='40' wrap=VIRTUAL></textarea>
<p><input type='submit' value='submit'/></p>
</form>

</body>
</html>

もう 1 つの注意点として、ステータス・メッセージのすぐ上にはスペースを残してあります。このスペースは、以下に示すように add.php で動的に設定します。


リスト 7. add.php ファイルによるデータベースへの投稿の追加

<?php
session_start();
include_once("header.php");
include_once("functions.php");

$userid = $_SESSION['userid'];
$body = substr($_POST['body'],0,140);

add_post($userid,$body);
$_SESSION['message'] = "Your post has been added!";

header("Location:index.php");
?>

上記のコードには、特に驚く点は何もないはずです。このコードは、フォームの body フィールド、そして PHP セッションで設定されたユーザー ID を取得して、この 2 つを functions.php ファイル内の add_post() 関数に渡すだけに過ぎません。そして別のセッション変数を設定し (投稿が追加されたことを示すメッセージを設定し)、ユーザーを index.php ページにリダイレクトします。

この小さな関数をテストする場合、関数が機能しているかどうかを知る唯一の手段は、データベース内の posts テーブルをチェックすることだけです。しかしそれではユーザー・フレンドリーな方法とは言えません。必要なのは、投稿がホーム・ページ上でアップデートされるようにすることです。そのためには、functions.php に 2 番目の関数を追加し、その関数をホーム・ページで使用する必要があります。




上に戻る


近況アップデートの一覧を追加する

ここで、functions.php ファイルを開いて 2 番目の関数を追加します。今回追加する関数の名前は、show_posts() です。以下に示すように、この関数はその名の通り、特定ユーザー ID のすべての投稿を表示します。


リスト 8. show_posts() 関数

function show_posts($userid){
	$posts = array();

	$sql = "select body, stamp from posts
	 where user_id = '$userid' order by stamp desc";
	$result = mysql_query($sql);

	while($data = mysql_fetch_object($result)){
		$posts[] = array( 	'stamp' => $data->stamp, 
							'userid' => $userid, 
							'body' => $data->body
					);
	}
	return $posts;

}

この特定の関数にユーザー ID を渡すと、そのユーザーが作成したすべての投稿が、新しい順に多次元の配列にバンドルされて返されます。この関数を使用するには、index.php で関数を呼び出すだけです。すると、該当するユーザーのすべての投稿を取得することができます。レコードごとに扱うデータはわずかな量なので、投稿数が増えてもこのようなクエリーで十分に対応することができます。

index.php ページには、リスト 9 のコードを以前組み込んだフォームのすぐ下に追加します。show_posts() 関数をセッション変数と併せて使用することで、ログイン・ユーザーによるすべての投稿を取得することができます。投稿が 1 つもない場合には何らかのエラー・メッセージを表示し、投稿がある場合には、表の中に投稿を 1 つずつ表示します。この表示をもっと趣向を凝らしたものにしたいというのであれば、独自の CSS (Cascading Style Sheets) を追加してください。


リスト 9. index.php ページでの投稿の表示

<?php
$posts = show_posts($_SESSION['userid']);

if (count($posts)){
?>
<table border='1' cellspacing='0' cellpadding='5' width='500'>
<?php
foreach ($posts as $key => $list){
	echo "<tr valign='top'>\n";
	echo "<td>".$list['userid'] ."</td>\n";
	echo "<td>".$list['body'] ."<br/>\n";
	echo "<small>".$list['stamp'] ."</small></td>\n";
	echo "</tr>\n";
}
?>
</table>
<?php
}else{
?>
<p><b>You haven't posted anything yet!</b></p>
<?php
}
?>

図 1 に、これまでの手順で作成した基本的なインターフェースを示します。ほんの数分の作業にしては、なかなかの出来映えです。


図 1 . 基本的なインターフェース


簡単な部分は、ここまでです。ユーザーが自分の近況を投稿し、その近況の表示を確認できる基本的なアプリケーションは完成しましたが、これには重要な部分が欠けています。それは、近況のアップデートが表示されるのは当の本人だけで、他のユーザーには表示されないことです。次のセクションでは、システム内のすべてのユーザーの一覧を表示し、ログイン・ユーザーが実際に他のユーザーをフォローして、自分のステータスと一緒に他のユーザーの近況のアップデートも見られるようにする単純なインターフェースを作成します。




上に戻る


他のユーザーをフォローする

ここからは、functions.php ファイルにより実質的な内容を追加していきます。必要となるのは、システム内のすべてのユーザーの一覧を表示する show_users() 関数です。この関数を使用して、ユーザーの一覧が作成されることになります。


リスト 10. show_users() 関数

function show_users(){
	$users = array();
	$sql = "select id, username from users where status='active' order by username";
	$result = mysql_query($sql);

	while ($data = mysql_fetch_object($result)){
		$users[$data->id] = $data->username;
	}
	return $users;
}

show_users() 関数が用意できたので、次は、この関数を実行してシステム内のすべてのユーザーの一覧を表示し、それぞれのユーザー名の隣に follow というリンクを表示する users.php ファイルを作成します。


リスト 11. show_users() 関数を実行する users.php ファイル

<?php 
session_start();
include_once("header.php");
include_once("functions.php");

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
	<title>Microblogging Application - Users</title>
</head>
<body>

<h1>List of Users</h1>
<?php
$users = show_users();

if (count($users)){
?>
<table border='1' cellspacing='0' cellpadding='5' width='500'>
<?php
foreach ($users as $key => $value){
	echo "<tr valign='top'>\n";
	echo "<td>".$key ."</td>\n";
	echo "<td>".$value ." <small><a href='#'>follow</a></small></td>\n";
	echo "</tr>\n";
}
?>
</table>
<?php
}else{
?>
<p><b>There are no users in the system!</b></p>
<?php
}
?>
</body>
</html>

このユーザーの一覧にアクセスするための手段として、index.php ファイルのフォームのすぐ上に、users.php へのリンクを追加します。

<p><a href='users.php'>see list of users</a></p>

これで、ユーザー名のそれぞれに follow リンクが設定された使いやすいユーザー一覧表が完成します。


図 2. ユーザーの一覧


次の段階に移る前に、現行ユーザーが現在フォローしているユーザーを示すための簡単な関数を作成しておくとよいでしょう。そうすれば、ユーザーがこの一覧を使って、フォローしたいユーザー、あるいはフォローするのをやめるユーザーを決定することができます。

functions.php ファイルに戻って、リスト 12 に記載するfollowing() 関数を追加してください。この関数に現行のユーザー ID を渡すと、このユーザーが現在フォローしているすべてのユーザー ID が返されます。


リスト 12. following() 関数

function following($userid){
	$users = array();

	$sql = "select distinct user_id from following
			where follower_id = '$userid'";
	$result = mysql_query($sql);

	while($data = mysql_fetch_object($result)){
		array_push($users, $data->user_id);

	}

	return $users;

}

ここで、users.php でこの関数を実行すれば、特定のユーザー ID が配列に含まれているかどうか (つまり特定のユーザー ID をフォローしているかどうか) を確認することができます。含まれている (フォローしている) 場合には unfollow リンクを使用し、含まれていない (フォローしていない) 場合にはデフォルトの follow リンクを設定します。リスト 13 に変更後のコードを記載します。


リスト 13. follow および unfollow リンクを表示するように変更した users.php ファイル

<?php
$users = show_users();
$following = following($_SESSION['userid']);

if (count($users)){
?>
<table border='1' cellspacing='0' cellpadding='5' width='500'>
<?php
foreach ($users as $key => $value){
	echo "<tr valign='top'>\n";
	echo "<td>".$key ."</td>\n";
	echo "<td>".$value;
	if (in_array($key,$following)){
		echo " <small>
		<a href='action.php?id=$key&do=unfollow'>unfollow</a>
		</small>";
	}else{
		echo " <small>
		<a href='action.php?id=$key&do=follow'>follow</a>
		</small>";
	}
	echo "</td>\n";
	echo "</tr>\n";
}
?>

次は簡単なステップで、follow リンクと unfollow リンクの両方で使用する action.php ファイルを作成します。このファイルは、user ID 用、そして follow または unfollow 用の 2 つの GET パラメーターを受け入れます。リスト 14 に記載するように、このファイルは add.php ファイルと同じく単純で、短いものです。


リスト 14. action.php ファイル

<?php
session_start();
include_once("header.php");
include_once("functions.php");

$id = $_GET['id'];
$do = $_GET['do'];

switch ($do){
	case "follow":
		follow_user($_SESSION['userid'],$id);
		$msg = "You have followed a user!";
	break;

	case "unfollow":
		unfollow_user($_SESSION['userid'],$id);
		$msg = "You have unfollowed a user!";
	break;

}
$_SESSION['message'] = $msg;

header("Location:index.php");
?>

上記を見るとわかるように、このファイルでは、前の段階でどちらのリンクを選択したかに応じて、follow_user() または unfollow_user() というまったく異なる 2 つのアクションを実行します。続いてメッセージを設定してから、ユーザーを index.php ページにリダイレクトします。このページにはユーザー自身のつぶやきだけでなく、そのユーザーがフォローする他のユーザーによる最新のつぶやきも表示されます。あるいはユーザーが unfollow を選択した場合には、ユーザーのつぶやきは表示されません。この部分のコードについては、もう少ししてから index.php に追加します。ここでは、follow_user() 関数と unfollow_user() 関数を functions.php に追加します。

この 2 つの関数には少し注意が必要です。ユーザーがリンクをクリックしたからと言って、やみくもにユーザーをフォローしたり、フォローを解除したりすることはできません。まずは、following テーブルが関係を持っているかどうかを確認する必要があります。既存の関係がある場合には、そのリクエストを無視するか (follow リンクがクリックされた場合)、あるいはリクエストに対処することができます (unfollow リンクがクリックされた場合)。単純にするため、どちらの場合にも使用できる check_count() 関数を作成します。この関数は以下のとおりです。


リスト 15. check_count() 関数

function check_count($first, $second){
	$sql = "select count(*) from following 
			where user_id='$second' and follower_id='$first'";
	$result = mysql_query($sql);

	$row = mysql_fetch_row($result);
	return $row[0];

}

function follow_user($me,$them){
	$count = check_count($me,$them);

	if ($count == 0){
		$sql = "insert into following (user_id, follower_id) 
				values ($them,$me)";

		$result = mysql_query($sql);
	}
}


function unfollow_user($me,$them){
	$count = check_count($me,$them);

	if ($count != 0){
		$sql = "delete from following 
				where user_id='$them' and follower_id='$me'
				limit 1";

		$result = mysql_query($sql);
	}
}

次に行うステップは、ユーザーがフォローしている他のユーザーを一覧にしてホーム・ページに表示するという簡単な作業です。すでに使用している show_users() 関数は、すべてのユーザーを表示するようになっていますが、オプションの引数を追加することによってこの関数の用途を簡単に拡張することができます。追加する引数はユーザー ID であり、following テーブル内でこのユーザー ID をフォロワーとして持つユーザーだけが一覧として表示されるようにするためのものです。

リスト 16 に新しく作成し直したコードを記載します。ここで何が行われているかと言うと、受け取った $user_id 引数の簡単なチェックです。ユーザー ID がゼロよりも大きい場合には、クエリーを使って、その ID がフォローしているすべてのユーザー ID を抽出します。そして implode() 関数を使用して、これらのユーザー ID の値の配列をカンマ区切りリストに変換します。変換後のストリング (and id in (1,2,3...n) のようなストリング) を既存の SQL クエリーに挿入することによって、そのユーザーがフォローしているユーザーのみが表示されるようにするのです。
リスト 16. クエリーによって抽出されたユーザーのみが表示されるように変更したコード

function show_users($user_id=0){

	if ($user_id > 0){
		$follow = array();
		$fsql = "select user_id from following
				where follower_id='$user_id'";
		$fresult = mysql_query($fsql);

		while($f = mysql_fetch_object($fresult)){
			array_push($follow, $f->user_id);
		}

		if (count($follow)){
			$id_string = implode(',', $follow);
			$extra =  " and id in ($id_string)";

		}else{
			return array();
		}

	}

	$users = array();
	$sql = "select id, username from users 
		where status='active' 
		$extra order by username";


	$result = mysql_query($sql);

	while ($data = mysql_fetch_object($result)){
		$users[$data->id] = $data->username;
	}
	return $users;
}

次に、リスト 17 のコードをホーム・ページに追加してください。このコードによって、ユーザーがフォローしているすべてのユーザーが表示されます。


リスト 17. ユーザーがフォローしているユーザーを表示する、変更後の index.php

<h2>Users you're following</h2>

<?php
$users = show_users($_SESSION['userid']);

if (count($users)){
?>
<ul>
<?php
foreach ($users as $key => $value){
	echo "<li>".$value."</li>\n";
}
?>
</ul>
<?php
}else{
?>
<p><b>You're not following anyone yet!</b></p>
<?php
}
?>




上に戻る


他のユーザーからの投稿を追加する

他のユーザーからの投稿をユーザーのタイムラインに追加するには、前に作成したコードを再利用するだけで済みます。例えば、現行ユーザーがフォローしているユーザーの一覧を取得する方法はすでに説明しました。また、特定のユーザーによるすべての投稿を抽出する方法も説明しました。この後者の場合の関数を調整するだけで、単独のユーザーだけでなく、複数のユーザーの投稿を一覧として受け取ることができるようになります。

ここで必要となる作業は、上記で説明した前者の関数を index.php ファイルの先頭の方に移動させ、この関数をもっと早い段階で利用できるようにすることで、この関数で取得したユーザー ID の一覧を使用して各ユーザーのタイムラインから限られた数の投稿 (すべての投稿は必要ありません。5 つくらいで十分です) を抽出することだけです。他のユーザーによる投稿は、新しい順に配置する必要があることを忘れないでください (最新の投稿を先頭に配置)。

まず重要なことから取り掛かることにしましょう。show_posts() 関数に、表示投稿数を制限するための引数を追加し、そのデフォルトをゼロに設定してください。この引数の値がゼロより大きい場合は、投稿を取得する SQL 文には制限が追加されます。もう 1 つ行うことは、$userid 引数を配列にし、この配列をカンマ区切りのフィールドへと展開して SQL 文に渡されるようにします。これは少し余分な作業ですが、この後わかるように、この SQL によってすべての投稿が逆順に表示されることになるため、作業するだけの価値は大いにあります。


リスト 18. ユーザーの配列を受け取るように更新した show_posts()

function show_posts($userid,$limit=0){
	$posts = array();

	$user_string = implode(',', $userid);
	$extra =  " and id in ($user_string)";

	if ($limit > 0){
		$extra = "limit $limit";
	}else{
		$extra = '';	
	}

	$sql = "select user_id,body, stamp from posts 
		where user_id in ($user_string) 
		order by stamp desc $extra";
	echo $sql;
	$result = mysql_query($sql);

	while($data = mysql_fetch_object($result)){
		$posts[] = array( 	'stamp' => $data->stamp, 
							'userid' => $data->user_id, 
							'body' => $data->body
					);
	}
	return $posts;

}

それでは、index.php ファイルに戻って、複数のユーザー ID を show_posts() に渡すように手を加えます (リスト 19 参照)。対象ユーザーは収集済みなので、これは実に簡単な作業です。array_keys() を使ってキーを抽出し、セッション変数を構成に加えるだけで、少ない場合でも 1 つの値 (現在ログインしているユーザーの ID) が含まれる配列が返されることになります。多い場合にはログイン・ユーザーの ID と、そのユーザーがフォローしているすべてのユーザーの ID が返されます。


リスト 19. show_posts() 関数に渡されるユーザーの配列

$users = show_users($_SESSION['userid']);
if (count($users)){
	$myusers = array_keys($users);
}else{
	$myusers = array();
}
$myusers[] = $_SESSION['userid'];

$posts = show_posts($myusers,5);




上に戻る


まとめ

この記事では、Twitter や Facebook の近況アップデート・ツールのような PHP ベースの単純なマイクロブロギング・サービスを作成する方法を説明しました。読者の皆さんが、ここで学んだ内容をそれぞれのアプリケーションで適用し、必要に応じて調整できることを願っています。



参考文献

学ぶために
  • Mr. Tweet をフォローするお勧めのユーザーを調べてください。

  • Guy Kawasaki による「How to use Twitter as a Twool」は、豊富な情報を提供してくれます。

  • makeuseof.com の 15 の Twitter リソース・リストにアクセスしてください。

  • PHP.net は、PHP 開発者のための情報源です。

  • Recommended PHP reading list」を読んでください。

  • developerWorks ですべての PHP 関連記事を調べてください。

  • developerWorks の Twitter をフォローしてください。

  • IBM developerWorks の PHP project resources にアクセスして、PHP の腕を磨いてください。

  • ソフトウェア開発者を対象とした興味深いインタービューや討論については、developerWorks ポッドキャストをチェックしてください。

  • PHP でデータベースを使用するには Zend Core for IBM を調べてみてください。シームレスにすぐに使えて、インストールも簡単なこの PHP 開発および実動環境は、IBM DB2 V9 をサポートします。

  • developerWorks の Technical events and webcasts で最新情報を入手してください。

  • 世界中で近日中に予定されている IBM オープンソース開発者を対象とした会議、見本市、ウェブキャストやその他のイベントをチェックしてください。

  • オープンソース技術を使用して開発し、IBM の製品と併用するときに役立つ広範囲のハウツー情報、ツール、およびプロジェクト・アップデートについては、developerWorks Open source ゾーンを参照してください。

  • 無料の developerWorks On demand demos で、IBM およびオープンソースの技術と製品機能を調べて試してみてください。


製品や技術を入手するために
  • Twitter アカウントを取得してください。

  • IBM ソフトウェアの試用版を使用して、次のオープンソース開発プロジェクトを革新してください。ダウンロード、あるいは DVD で入手できます。

  • IBM 製品の評価版をダウンロードして、DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® のアプリケーション開発ツールとミドルウェア製品を使ってみてください。


議論するために


著者について

Thomas Myer は、テキサス州オースチンにあるコンサルティング会社、Triple Dog Dare Media の共同創立者です。彼は、ナレッジ・マネージメント、情報設計、そしてユーザビリティーに関する著作活動を行っています。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


    日本IBMについて プライバシー お問い合わせ