Sử dụng PHP để xây dựng một hệ thống kiểu như Twitter trên trang web của bạn

Thật đơn giản để bổ sung dịch vụ vi blog (microblogging) kiểu như Twitter vào bất kỳ ứng dụng nào bằng cách sử dụng PHP

Tìm hiểu cách sử dụng PHP để bổ sung một giao diện giống như Twitter vào các ứng dụng của bạn. Cụ thể, chúng tôi chỉ cho bạn cách cho phép người sử dụng thêm bài đăng, phổ biến các bài đăng đó cho những người sử dụng khác muốn nhận, và cho phép người sử dụng chọn dõi theo các bài viết của những người sử dụng khác.

Thomas Myer, Sáng lập công ty, Triple Dog Dare Media

Thomas Myer là đồng sáng lập của Triple Dog Dare Media, một công ty tư vấn ở Austin, Texas. Thomas viết về các chủ đề quản lý kiến thức, thiết kế thông tin, và tính hữu dụng. Bạn có thể gửi thư điện tử cho ông tại địa chỉ tom@tripledogdaremedia.com



22 01 2011

Nếu bạn đã từng để ý, bạn sẽ biết rằng Twitter là một trong những sự kiện giật gân nhất trong thế giới Web 2.0. Đối với những người còn chưa biết, Twitter (một dịch vụ có sẵn tại Twitter.com) là một dịch vụ vi blog (microblogging) đơn giản cho phép người sử dụng gửi bài (gọi là tweets) lên đến 140 ký tự trả lời cho câu hỏi "Bây giờ bạn đang làm gì?" Những người sử dụng có thể dõi theo những người mà họ thấy thú vị và có những người dõi theo của chính mình. Bằng cách này, thông tin có thể được công bố tới nhóm nhỏ những người dõi theo hoặc được phát tán khắp mọi nơi.

Liếc nhanh đến bất kỳ một tài khoản Twitter đơn lẻ nào cũng bộc lộ ra rằng những người sử dụng thường tạo ra các tweet về rất nhiều chủ đề, từ cái thường ngày (thí dụ, "tôi đang có một bánh sandwich") cho đến thứ cao siêu hơn. Thường thì có các liên kết nhúng với các hình ảnh, các tệp media, và bài đăng blog. Các URL này thường xuyên bị làm rối bởi các dịch vụ như TinyURL, chủ yếu là để giữ cho tổng độ dài ký tự của các bài đăng bằng hoặc dưới 140 ký tự.

Có nhiều người bị lôi cuốn bởi Twitter và đã tạo ra một hình thức nghệ thuật từ định dạng siêu cô đọng này, thậm chí còn có các cuộc chuyện trò với những người sử dụng khác (bằng cách hướng các nhận xét của họ đến chẳng hạn như @user). Từ điểm xuất phát đơn giản này, cả một thiên hà của các ứng dụng di động và các công cụ khác có khả năng Twitter đã nở rộ. Thậm chí hiện nay còn có cả giải thưởng cho những tweet buồn cười nhất, tuyệt vời nhất, đầy sự kiện nhất, cộng với các ứng dụng trực tuyến theo vết trạng thái của các ứng dụng Twitter khác nhau.

Nhiều trang web và dịch vụ khác, chẳng hạn như LinkedIn và Facebook, hiện cho phép người sử dụng của họ cập nhật trạng thái hiện tại của họ theo cách chắc chắn là giống như Twitter. Nói một cách khác, việc cập nhật tình trạng của bạn trên Facebook liên quan đến việc sử dụng một tin nhắn cô đọng, và, tất nhiên, tình trạng đó thường trả lời cho câu hỏi "Bạn đang làm gì đúng lúc này?"

Việc bổ sung dịch vụ vi blog hay công cụ cập nhật tình trạng vào trang web của chính bạn không đòi hỏi nhiều công sức, và nó cung cấp cho những người sử dụng của bạn một cách đơn giản và vui thích để giao tiếp. Mục đích của bài này là để chỉ cho bạn thấy cách thực hiện chính việc đó. Nhưng trước tiên, tôi phải lập ra một vài giả định về bạn.

Trước tiên, tôi giả định rằng bạn đã biết chút ít về PHP và MySQL. Tôi cũng giả định rằng bạn có quyền truy cập vào một loại máy chủ Web Apache cục bộ sẵn có nào đó đang chạy PHP và MySQL. Để phục vụ bài viết này, tôi phát triển trên một MacBook Pro bằng cách sử dụng Macintosh, Apache, MySQL, và PHP (MAMP), một chương trình miễn phí mà rất tiện cung cấp trọn vẹn một môi trường phát triển trong một gói. Tuy nhiên, bạn sẽ có thể phát triển được trên Microsoft® Windows® hoặc Linux® mà không gặp bất kỳ khó khăn nào. Cuối cùng, tôi giả định rằng bạn có một ứng dụng ngay bây giờ đang chạy liên quan đến những người sử dụng nào đó, và rằng bạn chuẩn bị bổ sung dịch vụ vi blog hoặc tweet cho ứng dụng đó bằng một cách nào đó. Vì lẽ đó, tôi bỏ qua một số phần xoay quanh người sử dụng của ứng dụng này (ví dụ đăng nhập, quản lý hồ sơ, v.v...) để dành thì giờ cho các bài đăng.

Thiết kế mặt sau (back end) của ứng dụng

Ở mức đơn giản nhất, dịch vụ Twitter tập trung vào hai danh từ: người sử dụng và thông báo. Nếu bạn đã xây dựng xong một ứng dụng và muốn bổ sung một dịch vụ giống như Twitter vào đó, rất có thể bạn đã có việc quản lý người sử dụng rồi. Nếu không có, bạn cần phải có cách nào đó xác định duy nhất được từng người sử dụng trong một bảng cơ sở dữ liệu (một khóa chính, thường là một số nguyên), một tên người sử dụng (cũng là duy nhất), một địa chỉ thư điện tử, một mật khẩu, v.v....

Các tweet (hoặc bài đăng) được lưu trong một bảng bài đăng, mỗi bài có một khóa chính (một số nguyên nào đó theo tuần tự), một quan hệ khoá ngoại trở lại người sử dụng đã viết bài, bản thân bài đó (hạn chế đến một số ký tự), và một dấu ấn ngày/giờ.

Phần cuối cùng của vấn đề nan giải này là một bảng cơ sở dữ liệu chỉ ra người sử dụng nào đang dõi theo ai. Toàn bộ những cái cần thiết là một cách nào đó để ghi lại một mã nhận dạng người sử dụng (user ID) và mã nhận dạng người dõi theo (follower ID), làm cho ứng dụng của bạn có khả năng nhanh chóng lập nên danh sách những người dõi theo và dễ dàng phổ biến thông tin cho những người nào đã đăng ký để dõi theo một người nào khác.

Nếu bạn đang theo dõi đến đây, hãy tiếp tục và lập ra ba bảng cơ sở dữ liệu của bạn ngay bây giờ. Sử dụng mã SQL trong Liệt kê 1 để tạo ra bảng đầu tiên, có tên là users (những người sử dụng). Nếu bạn đã có sẵn một bảng những người sử dụng, vui lòng bỏ qua việc này.

Liệt kê 1. Bảng những người sử dụng
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 ;

Bảng thứ hai, có tên là posts (các bài đăng), được trình bày dưới đây.

Liệt kê 2. Bảng các bài
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 ;

Liệt kê 3 cho thấy bảng cuối cùng, có tên là following (đang dõi theo). Chú ý bảng này có hai khóa chính.

Liệt kê 3. Bảng Đang dõi theo
CREATE TABLE `following` (
`user_id` INT NOT NULL ,
`follower_id` INT NOT NULL ,
PRIMARY KEY ( `user_id` , `follower_id` )
) ENGINE = MYISAM ;

Trước khi tiếp tục, hãy tạo một tệp tên là header.php và đặt tất cả các chuỗi ký tự để kết nối MySQL của bạn vào trong đó. Nếu bạn đã có một tệp tin xử lý việc này thì bỏ qua. Chỉ cần chắc chắn bao gồm thêm tệp tin này ở bất cứ đâu vì bạn sẽ cần đến nó. Liệt kê 4 cho thấy tệp tin này trông giống như thế nào đối với bạn.

Liệt kê 4. Ví dụ tệp tin 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 );

Xin lưu ý là bạn cũng được tự do thêm vào bất kỳ loại kiểm tra an ninh nào đối với tệp tin header.php. Thí dụ, bạn có thể kiểm tra xem liệu một mã nhận dạng người sử dụng đã được thiết lập trong một biến phiên làm việc (cho thấy là người sử dụng này đã đăng nhập thực sự) hay chưa. Nếu một người sử dụng chưa đăng nhập, bạn có thể chuyển hướng người sử dụng đó đến một trang đăng nhập. Bài viết này không đi vào tất cả cái đó, nhưng khá dễ bổ sung vào khi bạn cần đến nó.


Tạo biểu mẫu mục nhập

Lúc này bạn đã lập xong các bảng mặt sau, đã đến lúc xem xét PHP để xử lý bất kỳ việc chèn vào và cập nhật dữ liệu. Điều bạn cần ngay bây giờ là một số hàm đơn giản mà sẽ:

  1. Cho phép người sử dụng đăng nhập và bổ sung các bài đăng mới.
  2. Phổ biến các bài đó cho bất cứ ai dõi theo người sử dụng đó.
  3. Cho phép người sử dụng dõi theo những người sử dụng khác.

Tôi thường làm việc trong ngữ cảnh của một khung ứng dụng mô hình-khung nhìn-điều khiển (MVC - Model-View-Controller) chẳng hạn như CodeIgniter vì nó cung cấp cho tôi một bộ công cụ nghiêm chỉnh để tạo ra các loại ứng dụng này. Thí dụ, tôi thường bắt đầu bằng việc tạo ra hai mô hình (một cho những người sử dụng và một cho các bài đăng) mà cho phép tôi tương tác với các bảng users (những người sử dụng), posts (các bài đăng) và following (đang dõi theo), và tiếp tục từ đó.

Do bạn có thể đang làm việc trong một khung làm việc khác, tôi đã quyết định chống lại cách tiếp cận đó ở đây. Thay vào đó, tôi chọn một cách tiếp cận đơn giản hơn, không mang đặc thù của khung làm việc. Hơn nữa, chỉ tạm thời hôm nay, tôi yêu cầu bạn gian lận một chút, hãy thêm bản ghi vào bảng người sử dụng của bạn để tạo ra một loạt những người sử dụng thử nghiệm, được làm sẵn sàng cho ứng dụng của bạn. Tôi tạo ra ba người sử dụng và đặt tên người sử dụng cho họ là jane, tommy, và bill.

Khi đã xong xuôi, hãy tạo ra một tệp tin PHP đơn giản tên là functions.php mà sẽ chứa chức năng chính của bạn. Bạn chuẩn bị tạo ra một ít các hàm trong tệp tin này mà cho phép các hoạt động trong bối cảnh của ứng dụng vi blog của bạn.

Hàm đầu tiên, trình bày trong Liệt kê 5, là một hàm đơn giản cho phép bạn bổ sung nội dung vào bảng bài đăng.

Liệt kê 5. Hàm để thêm nội dung vào bảng bài đăng
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);
}

Để kiểm thử hàm đơn này, bạn cần phải bổ sung hai tệp tin PHP nữa vào hỗn hợp đó. Đầu tiên là tệp tin index.php, chứa một biểu mẫu nhỏ cơ sở ngay lúc này — về sau bạn sẽ bổ sung thêm nhiều hơn vào trang này. Thứ hai là tệp tin PHP mà biểu mẫu sẽ gửi lên đó, tên là add.php. Liệt kê 6 là mã lệnh cho tệp tin index.php. Xin lưu ý rằng bạn đang sử dụng một phiên làm việc PHP để mã hoá cứng một giá trị mã nhận dạng người sử dụng là 1, đó là người sử dụng jane trong cơ sở dữ liệu của tôi. Việc này hoàn toàn ổn bây giờ, nhưng rõ ràng sau đó sẽ cần phải thay đổi.

Liệt kê 6. Mã lệnh của tệp tin 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>

Ngoài ra cũng lưu ý rằng tôi đã để lại một khoảng trống ngay phía trên biểu mẫu để dành cho một thông báo trạng thái, cái mà bạn sẽ thiết lập động trong tệp add.php, như cho thấy dưới đây.

Liệt kê 7. Bổ sung các bài đăng vào cơ sở dữ liệu với tệp tin 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");
?>

Sẽ không có bất kỳ điều gì gây ngạc nhiên về các mã lệnh này. Nó chỉ đơn giản là tiếp nhận trường có tên là body từ biểu mẫu và mã nhận dạng người sử dụng đã thiết lập trong phiên làm việc PHP và sau đó chuyển chúng đến hàm add_post() trong tệp tin functions.php. Sau đó một biến phiên khác sẽ được thiết lập (thông báo cập nhật), và người sử dụng được chuyển hướng trở lại trang index.php.

Nếu bạn thử hàm nhỏ này, cách duy nhất để bạn biết rằng nó đang làm việc là kiểm tra bảng các bài đăng trong cơ sở dữ liệu. Điều đó có đúng là thân thiện với người sử dụng không? Điều mà bạn cần là để cho các bài viết được cập nhật ngay trên trang chủ của bạn. Để làm việc đó, bạn cần phải bổ sung một hàm thứ hai vào tệp tin functions.php và dùng nó trên trang chủ của bạn.


Bổ sung một danh sách các cập nhật

Đã đến lúc phải mở tệp tin functions.php và thêm một hàm thứ hai vào đó. Lúc này hãy đặt tên hàm là show_posts(). Nó sẽ thực hiện đúng việc đó, hiển thị ra tất cả các bài đăng đối với một mã nhận dạng người sử dụng cụ thể, như trình bày dưới đây.

Liệt kê 8. Hàm 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;

}

Nếu bạn chuyển cho hàm cụ thể này một mã nhận dạng người sử dụng, nó sẽ trả về tất cả các bài đăng mà người sử dụng đã viết theo thứ tự thời gian ngược (từ mới nhất đến cũ nhất), tất cả được gói gọn trong một mảng đa chiều đẹp đẽ. Để sử dụng nó, tất cả công việc mà bạn phải làm là gọi ra hàm đó trên index.php và lấy ra tất cả các bài cho người sử dụng này. Vì bạn đang xử lý một lượng nhỏ dữ liệu cho từng bản ghi, loại truy vấn này có khả năng giãn thêm khá tốt.

Liệt kê 9 là đoạn mã bạn thêm vào trang index.php, ngay sau biểu mẫu mà bạn đã đưa vào trước đó. Bằng cách sử dụng hàm show_posts() kết hợp với biến phiên làm việc, bạn có thể thu được tất cả các bài đăng của người sử dụng đã đăng nhập. Nếu không có bài nào, hãy hiển thị một thông báo lỗi nào đó. Nếu có bài, hãy hiển thị lần lượt trong một bảng — hoặc nếu bạn muốn vui mắt hơn, hãy viết phiếu định kiểu (CSS - Cascading Style Sheets) của chính bạn.

Liệt kê 9. Hiển thị bài đăng trên trang 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
}
?>

Hình 1 trình bày giao diện cơ bản mà bạn đã xây dựng nên cho đến nay — không quá tệ đối với vài phút làm việc.

Hình 1. Giao diện cơ bản
Giao diện cơ bản

Phần dễ dàng đã xong. Bây giờ bạn có một ứng dụng cơ bản cho phép người sử dụng đăng tình trạng của họ và nhìn thấy tình trạng đó được hiển thị. Tuy nhiên, có một phần quan trọng bị bỏ qua: Không có ai ở đó để xem các cập nhật tình trạng của bạn, trừ bạn ra. Trong phần tiếp theo, bạn tạo ra một giao diện đơn giản, liệt kê tất cả những người sử dụng trong hệ thống và cho phép những người sử dụng đã đăng nhập thực sự dõi theo những người sử dụng khác và nhìn thấy các cập nhật tình trạng của họ được hoà lẫn vào cái của chính mình.


Dõi theo những người sử dụng khác

Đã đến lúc bổ sung thêm vật liệu vào tệp tin functions.php. Bạn cần một hàm show_users() đem lại cho bạn một danh sách toàn bộ những người sử dụng trong hệ thống. Bạn sẽ sử dụng hàm này để điền một danh sách người sử dụng.

Liệt kê 10. Hàm 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;
}

Bây giờ bạn đã có hàm show_users() bạn có thể tạo ra một tệp tin users.php chạy hàm đó và hiển thị một danh sách tất cả những người sử dụng trong hệ thống, mỗi người có một liên kết gọi là follow (dõi theo) bên cạnh tên người sử dụng.

Liệt kê 11. Một tệp tin users.php chạy hàm show_users()
<?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>

Để truy cập danh sách người sử dụng này, hãy thêm một liên kết tới users.php trong tệp tin index.php, ngay phía trên biểu mẫu:

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

Cái mà bạn nhận được là một bảng các tên người sử dụng rất dễ sử dụng, mỗi người có một liên kết follow.

Hình 2. Danh sách người sử dụng
Danh sách người sử dụng

Trước khi chuyển sang giai đoạn kế tiếp, một việc đáng làm là viết một hàm nhỏ để cho bạn biết là người sử dụng hiện tại đang dõi theo ai. Bằng cách này, những người sử dụng có thể dùng danh sách này để xác định xem liệu họ muốn dõi theo hay không dõi theo một người sử dụng khác.

Trở lại tệp tin functions.php và bổ sung một hàm tên là following(), trình bày trong Liệt kê 12. Bạn chuyển mã nhận dạng người sử dụng hiện tại cho hàm này để nhận lại các mã nhận dạng người sử dụng mà người sử dụng này đang dõi theo.

Liệt kê 12. Hàm 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;

}

Bây giờ bạn có thể chạy hàm này trên users.php và kiểm tra xem liệu một mã nhận dạng người sử dụng cụ thể có ở trong mảng không. Nếu có, hãy sử dụng liên kết không dõi theo. Nếu không, thì mặc định là dõi theo. Liệt kê 13 hiển thị mã được sửa đổi.

Liệt kê 13. Tệp tin users.php đã sửa lại, cho thấy các liên kết dõi theo và không dõi theo
<?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";
}
?>

Bước tiếp theo thì đơn giản: Tạo tệp tin action.php được sử dụng trong các liên kết dõi theo và không dõi theo. Tệp tin này chấp nhận hai tham số GET một dùng cho mã nhận dạng người sử dụng và một dành cho liên kết dõi theo hoặc không dõi theo. Như trình bày trong Liệt kê 14, tệp tin này đơn giản và ngắn như tệp tin add.php.

Liệt kê 14. Tệp tin 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");
?>

Như bạn đã thấy, bạn thực hiện hai hành động rất khác nhau — hoặc follow_user() (dõi theo người sử dụng) hoặc unfollow_user() (không dõi theo người sử dụng) — tuỳ thuộc vào liên kết bạn đã chọn trước đó. Sau đó bạn lập ra một thông điệp và chuyển hướng người sử dụng trở lại trang index.php, nơi mà họ không những sẽ nhìn thấy các thông điệp của chính họ mà còn thấy cả các thông điệp gần đây được những người sử dụng mà họ dõi theo thêm vào. Hoặc trong trường hợp không dõi theo thì các thông điệp của người sử dụng ấy biến mất khỏi danh sách. Sau đây, bạn cần phải bổ sung mẩu mã cuối cùng đó vào index.php. Nhưng ngay bây giờ là lúc bổ sung các hàm follow_user()unfollow_user() vào functions.php.

Bạn phải khá cẩn thận với cả hai hàm này. Bạn không thể nhắm mắt tạo ngay liên kết dõi theo hay không dõi theo cho một người sử dụng đơn giản chỉ vì ai đó nhấn vào liên kết. Trước tiên, bạn phải kiểm tra xem có hay không một mối quan hệ trong bảng following (dõi theo). Nếu đã có thì bạn có thể bỏ qua yêu cầu (trong trường hợp dõi theo) hoặc hành động theo yêu cầu (trường hợp yêu cầu không dõi theo nữa). Để cho đơn giản, hãy viết một hàm check_count() mà bạn có thể sử dụng trong cả hai trường hợp, như chỉ ra dưới đây.

Liệt kê 15. Hàm 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);
	}
}

Bước tiếp theo thì dễ dàng: Hiển thị một danh sách những người sử dụng khác mà người sử dụng này đang dõi theo trên trang chủ. Bạn đã có một hàm show_users() nhưng nó cho thấy toàn bộ những người sử dụng. Bạn có thể dễ dàng chuyển đổi mục đích hàm này bằng cách thêm một đối số không bắt buộc. Đối số này là một mã nhận dạng người sử dụng mà bạn dùng để giới hạn danh sách, chỉ gồm những người sử dụng mà đã có mã nhận dạng ID cụ thể này ở vị trí dõi theo.

Những gì đang diễn ra trong phần mã vừa được viết lại trong Liệt kê 16 là một phép kiểm tra đơn giản đối số $user_id đầu vào. Nếu mã nhận dạng người sử dụng này lớn hơn 0, hãy dùng một truy vấn để rút ra bất kỳ mã nhận dạng người sử dụng nào mà người sử dụng này dõi theo. Sử dụng hàm implode() để chuyển mảng các giá trị đó thành một danh sách phân cách bằng dấu phẩy. Sau đó chèn chuỗi ký tự này — trông giống như and id in (1,2,3...n)— vào truy vấn SQL hiện thời, do đó hạn chế chỉ liệt kê những người sử dụng nào mà người sử dụng đang xét có dõi theo.

Liệt kê 16. Mã được viết lại để giới hạn danh sách người sử dụng do truy vấn rút ra
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;
}

Tiếp theo, bạn bổ sung mã trong Liệt kê 17 vào trang chủ để hiển thị tất cả những người sử dụng đang được dõi theo đó.

Liệt kê 17. Sửa đổi lại index.php để hiển thị những người sử dụng đang được dõi theo
<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
}
?>

Bổ sung bài đăng từ những người sử dụng khác

Để thêm bài đăng từ những người sử dụng khác vào thanh sự kiện (timeline) của người sử dụng, bạn chỉ cần sử dụng lại một số mã đã được viết trước đây. Thí dụ, bạn đã biết cách để có một danh sách những người sử dụng mà người sử dụng hiện tại đang dõi theo. Bạn cũng biết cách làm thế nào để rút ra tất cả các bài đăng của một người sử dụng nào đó. Bạn chỉ cần tinh chỉnh hàm thứ hai để có thể chấp nhận một danh sách những người sử dụng chứ không phải chỉ là một người sử dụng đơn lẻ.

Tất cả những gì bạn cần làm bây giờ là chuyển hàm đầu tiên lên cao hơn trong tệp tin index.php để bạn có thể tận dụng nó sớm hơn, sau đó sử dụng danh sách các mã nhận dạng người sử dụng mà bạn nhận được từ hàm đó để rút ra một số lượng hạn chế các bài từ các thanh sự kiện của họ — bạn không cần tất cả các bài, chỉ cần khoảng năm bài. Hãy nhớ rằng bạn cần đặt các bài đăng của những người sử dụng khác đó theo trình tự ngược thời gian (bài mới nhất ở trên đầu).

Điều quan trọng nhất nên làm trước tiên: Thêm một đối số hạn định vào hàm show_posts() đặt nó bằng 0 theo mặc định. Nếu giới hạn đó lớn hơn 0, bạn thêm một giới hạn vào câu lệnh SQL của bạn để lấy bài. Một việc khác bạn làm là làm cho đối số $userid thành một mảng mà bạn phân tích thành một trường phân cách bằng dấu phẩy, sau đó sẽ chuyển cho câu lệnh SQL. Điều này là một chút công việc phát sinh thêm, nhưng nó sẽ đền bù lại một cách hào phóng vì tất cả các bài đăng sau đó sẽ hiển thị theo thứ tự đảo ngược, như bạn nhìn thấy.

Liệt kê 18. Cập nhật show_posts() để chấp nhận một mảng những người sử dụng
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;

}

Bây giờ trở lại tệp tin index.php và làm tiếp về việc chuyển giao nhiều hơn một mã nhận dạng người sử dụng cho show_posts(), như trình bày dưới đây. Thật sự đó là một điều đơn giản, vì bạn đã thu thập được những người sử dụng. Bạn chỉ cần rút ra các khoá bằng cách sử dụng array_keys() và thêm các biến phiên làm việc của bạn vào hỗn hợp này. Ít nhất thì việc này gửi đi một mảng với một giá trị trong đó (mã nhận dạng người sử dụng hiện đã đăng nhập). Nhiều nhất thì nó sẽ gửi mã nhận dạng người sử dụng đã đăng nhập và mã nhận dạng của từng người sử dụng mà người sử dụng đó đang dõi theo.

Liệt kê 19. Trao một mảng những người sử dụng cho hàm 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);

Kết luận

Trong bài này, bạn đã học cách xây dựng một dịch vụ vi blog đơn giản dựa trên PHP tương tự như Twitter và công cụ cập nhật trạng thái của Facebook. Với chút may mắn, bạn có thể làm những gì mà bạn đã tìm hiểu ở đây, bổ sung nó vào ứng dụng của bạn, và đo cắt nó theo nhu cầu của bạn.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=618754
ArticleTitle=Sử dụng PHP để xây dựng một hệ thống kiểu như Twitter trên trang web của bạn
publish-date=01222011