Using Example 21-9, members.php, your users will be able to find other members and choose to add them as friends (or drop them if they are already friends). This program has two modes. The first shows a user’s profile, and the second lists all members and their relationships to you.
In the first mode a test is made for the GET
variable 'view'
. If it exists, a user wants to view
someone’s profile; the program does that using the showProfile
function, along with providing a
couple of links to the user’s friends and messages.
After that the two GET
variables, 'add'
and 'remove'
, are tested. If one or the other has
a value, it will be the username of a user to either add or drop as a
friend. This is achieved by looking up the user in the MySQL friends
table and either inserting a friend’s
username or removing it from the table.
Of course, every posted variable is first passed through sanitizeString
to ensure it is safe to use
with MySQL.
The final section of code issues a SQL query to list all
usernames. The code places the number returned in the variable $num
before outputting the page
heading.
A for
loop then iterates
through each and every member, fetching their details and then looking
them up in the friends
table to see
if they are either being followed by or are a follower of the user.
Anyone who is both a follower and a followee is classed as a mutual
friend.
The variable $t1
is nonzero
when the user is following another member, and $t2
is nonzero when another member is
following the user. Depending on these values, text is displayed after
each username showing that user’s relationship (if any) to the current
user.
Icons are also displayed to show the relationships. A double-pointed arrow means that the users are mutual friends, a left-pointing arrow indicates the user is following another member, and a right-pointing arrow indicates that another member is following the user.
Finally, depending on whether the user is following another member, a link is provided to either add or drop that member as a friend.
When you call up Example 21-9 in a browser, it will look like Figure 21-5. See how the user is invited to “follow” a nonfollowing member, but if the member is already following the user, a “recip” link to reciprocate the friendship is offered. In the case of a member the user is already following, the user can select “drop” to end the following.
<?php // members.php include_once 'header.php'; if (!$loggedin) die(); echo "<div class='main'>"; if (isset($_GET['view'])) { $view = sanitizeString($_GET['view']); if ($view == $user) $name = "Your"; else $name = "$view's"; echo "<h3>$name Profile</h3>"; showProfile($view); echo "<a class='button' href='messages.php?view=$view'>" . "View $name messages</a><br /><br />"; die("</div></body></html>"); } if (isset($_GET['add'])) { $add = sanitizeString($_GET['add']); if (!mysql_num_rows(queryMysql("SELECT * FROM friends WHERE user='$add' AND friend='$user'"))) queryMysql("INSERT INTO friends VALUES ('$add', '$user')"); } elseif (isset($_GET['remove'])) { $remove = sanitizeString($_GET['remove']); queryMysql("DELETE FROM friends WHERE user='$remove' AND friend='$user'"); } $result = queryMysql("SELECT user FROM members ORDER BY user"); $num = mysql_num_rows($result); echo "<h3>Other Members</h3><ul>"; for ($j = 0 ; $j < $num ; ++$j) { $row = mysql_fetch_row($result); if ($row[0] == $user) continue; echo "<li><a href='members.php?view=$row[0]'>$row[0]</a>"; $follow = "follow"; $t1 = mysql_num_rows(queryMysql("SELECT * FROM friends WHERE user='$row[0]' AND friend='$user'")); $t2 = mysql_num_rows(queryMysql("SELECT * FROM friends WHERE user='$user' AND friend='$row[0]'")); if (($t1 + $t2) > 1) echo " ↔ is a mutual friend"; elseif ($t1) echo " ← you are following"; elseif ($t2) { echo " → is following you"; $follow = "recip"; } if (!$t1) echo " [<a href='members.php?add=".$row[0] . "'>$follow</a>]"; else echo " [<a href='members.php?remove=".$row[0] . "'>drop</a>]"; } ?> <br /></div></body></html>
On a production server, there could be thousands or even hundreds of thousands of users, so you would probably substantially modify this program to include support for searching the “about me” text, paging of the output a screen at a time, and so on.