帝国cms会员空间模板显示最近来访访客信息
为了实现用户登录状态下的信息记录以及未登录状态下的IP地区记录功能,你可以按照以下步骤操作:
第一步:创建数据表
在帝国CMS后台执行以下SQL语句创建数据表:
CREATE TABLE `{$dbtbpre}_userkjf` ( `id` int(11) NOT NULL AUTO_INCREMENT, `lfuserid` varchar(20) CHARACTER SET gbk DEFAULT NULL, `bfuserid` varchar(100) CHARACTER SET gbk NOT NULL, `ip` char(50) CHARACTER SET gbk DEFAULT NULL, `ipdl` char(50) CHARACTER SET gbk DEFAULT NULL, `lftime` char(20) CHARACTER SET gbk NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=latin1 AUTO_INCREMENT=65;
第二步:复制代码到 header.temp.php
将以下代码复制到 e/space/template/default/header.temp.php
文件中:
<?php // 取得登陆者信息 $userid = getcvar('mluserid'); // 会员ID $uid = $_GET['userid']; // 当前空间的主人ID if ($uid != $userid) { // 如果访客已登陆,则记录访客信息 if ($userid) { $lfUname = $_COOKIE["lfUname"]; // 获取访客信息 $fkdd = $empire->fetch1("SELECT * FROM {$dbtbpre}userkjf WHERE bfuserid='{$uid}' AND lfuserid='{$userid}'"); if (!$fkdd) { $empire->query("INSERT INTO {$dbtbpre}userkjf (lfuserid, bfuserid, lftime) VALUES ('{$userid}', '{$uid}', '".date('Y-m-d H:i:s')."')"); } } else { // 如果访客未登陆,则记录IP和地区信息 // 取得IP 和地区 $gifo = new get_gust_info(); $ip = $gifo->Getip(); $ipadds = $gifo->Getaddress(); $ipdl = ''; foreach ($ipadds[0] as $value) { $ipdl .= iconv("utf-8", "gbk", $value); } // 获取访客信息 $lfUname = $_COOKIE["lfUname"]; if ($lfUname == '') { $empire->query("INSERT INTO {$dbtbpre}userkjf (bfuserid, ip, ipdl, lftime) VALUES ('{$uid}', '{$ip}', '{$ipdl}', '".date('Y-m-d H:i:s')."')"); setcookie("lfUname", "游客", time() + 1200); // 创建来访客信息,20分钟过期 } } } ?> <?php // 作用取得客户端的ip、地理信息、浏览器、本地真实IP class get_gust_info { // 获得访客真实ip function Getip() { if (!empty($_SERVER["HTTP_CLIENT_IP"])) { $ip = $_SERVER["HTTP_CLIENT_IP"]; } if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { // 获取代理ip $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); } if ($ip) { array_unshift($ips, $ip); } $count = count($ips); for ($i = 0; $i < $count; $i++) { if (!preg_match("/^(10|172.16|192.168)./i", $ips[$i])) { // 排除局域网ip $ip = $ips[$i]; break; } } $tip = empty($_SERVER['REMOTE_ADDR']) ? $ip : $_SERVER['REMOTE_ADDR']; if ($tip == "127.0.0.1") { // 获得本地真实IP return $this->get_onlineip(); } else { return $tip; } } // 获得本地真实IP function get_onlineip() { $mip = file_get_contents("http://city.ip138.com/city0.asp"); if ($mip) { preg_match("/[.*]/", $mip, $sip); $p = array("/[/", "/]/"); return preg_replace($p, "", $sip[0]); } else { return "获取本地IP失败!"; } } // 根据ip获得访客所在地地名 function Getaddress($ip = '') { if (empty($ip)) { $ip = $this->Getip(); } $ipadd = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=" . $ip); // 根据新浪api接口获取 if ($ipadd) { $charset = iconv("gbk", "utf-8", $ipadd); preg_match_all("/[\x{4e00}-\x{9fa5}]+/u", $charset, $ipadds); return $ipadds; // 返回一个二维数组 } else { return "地址未知"; } } } ?> <?php // 会员空间访客显示开始 $fkSQL = "SELECT * FROM {$dbtbpre}userkjf WHERE bfuserid='{$uid}' ORDER BY id DESC LIMIT 5"; $fkSQL = $empire->query($fkSQL); while ($rs = $empire->fetch($fkSQL)) { if ($rs['lfuserid']) { $fkxxrs = $empire->fetch1("SELECT userid, truename, userpic FROM {$dbtbpre}enewsmemberadd WHERE userid='{$rs['lfuserid']}' LIMIT 1"); ?> <li> <a href="/e/space/index.php?userid=<?=$fkxxrs['userid']?>"><img src="<?=$fkxxrs['userpic'] ? $fkxxrs['userpic'] : '/templets/member/common/images/dfboy.png'?>" alt="<?=$fkxxrs['truename']?>" /></a> <a href="/e/space/index.php?userid=<?=$fkxxrs['userid']?>"><?=$fkxxrs['truename']?></a> </li> <?php } else { ?> <li> <a href="#"><img src="../data/images/nouserpic.gif" /></a> <span> <div><?= $rs['ipdl'] ? "来自: " . $rs['ipdl'] : "未知地区" ?></div> <br> <div><?= $rs['lftime'] ?></div> </span> </li> <?php } } // 会员空间访客显示结束 ?>
注意事项
- 表前缀:确保在创建数据表时使用正确的表前缀(
{$dbtbpre}
)。 - 字符集转换:确保在处理中文数据时使用正确的字符集转换。
- API接口:确保使用的IP地址解析API接口有效且能正常访问。
- 安全性和隐私:确保在记录用户信息时遵守相关法律法规,并保护用户隐私。
通过以上步骤,你应该能够实现用户登录状态下的信息记录以及未登录状态下的IP地区记录功能。