这种方法为每个 forumID
单独存储最近访问的 postID
。
它不像针对每个帖子单独跟踪的解决方案那样精细,但它可以减少需要为每个用户存储的数据量,并仍然提供了一种不错的方式来跟踪用户的浏览历史。
<?php
session_start();
if (isset($_GET['reset'])) { unset($_SESSION['activity']); }
$forums = array(
'1' => 'Public Chat',
'2' => 'Member Area',
'3' => 'Moderator Mayhem'
);
$posts = array(
'12345' => array( 'fID'=>'1', 'title'=>'Hello World'),
'12346' => array( 'fID'=>'3', 'title'=>'I hate you all'),
'12347' => array( 'fID'=>'1', 'title'=>'Greetings!'),
'12348' => array( 'fID'=>'2', 'title'=>'Car thread'),
'12349' => array( 'fID'=>'1', 'title'=>'I like turtles!'),
'12350' => array( 'fID'=>'2', 'title'=>'Food thread'),
'12351' => array( 'fID'=>'3', 'title'=>'FR33 V1AGR4'),
'12352' => array( 'fID'=>'3', 'title'=>'CAPSLOCK IS AWESOME!!!!!!!!'),
'12353' => array( 'fID'=>'2', 'title'=>'Funny pictures thread'),
);
$userhist = array(
'1' => '12344',
'2' => '12350',
'3' => '12346'
);
$s = &$_SESSION['activity'];
if (!isset($s)) { $s = $userhist; }
if (isset($_GET['mark'])) {
$mid = (int)$_GET['mark'];
if (array_key_exists($mid, $forums)) {
$s[$mid] = array_search(end($posts), $posts);
}
elseif ($mid == 0) {
foreach ($forums as $fid=>$finfo) {
$s[$fid] = array_search(end($posts), $posts);
}
}
}
if (isset($_GET['post'])) {
$pid = (int)$_GET['post'];
if (array_key_exists($pid, $posts)) {
$hist = &$s[$posts[$pid]['fID']];
if ($pid > $hist) {
$hist = $pid;
}
}
}
echo '<p>[<a href="?mark=all">Read All</a>]</p>' . PHP_EOL;
foreach ($forums as $fid=>$finfo) {
echo '<p>Forum: ' . $finfo;
echo ' [<a href="?mark=' . $fid . '">Mark as Read</a>]<br>' . PHP_EOL;
foreach ($posts as $pid=>$pinfo) {
if ($pinfo['fID'] == $fid) {
echo '- Post: <a href="?post=' . $pid . '">' . $pid . '</a>';
echo ' - ' . ($s[$fid] < $pid ? 'NEW' : 'old');
echo ' - "' . $pinfo['title'] . '"<br>' . PHP_EOL;
}
}
echo '</p>' . PHP_EOL;
}
echo '<hr><pre>$_SESSION = '; print_r($_SESSION); echo '</pre>' . PHP_EOL;
echo '<hr>[<a href="?reset">Reset Session</a>]' . PHP_EOL;
?>
注意: 显然,这个例子仅供演示目的。在处理实际数据库时,一些结构和逻辑可能需要更改。