ホームページ >php教程 >php手册 >PHP+Mysql+jQuery は現在のオンライン ユーザー数をカウントします

PHP+Mysql+jQuery は現在のオンライン ユーザー数をカウントします

WBOY
WBOYオリジナル
2016-06-21 08:50:081059ブラウズ

一定期間内にサイトにアクセスした人の数をカウントしたい ユーザーの訪問数を記録するには、Cookie、セッション、テキスト、またはデータベースを使用できます。この記事では、PHP を Mysql および jQuery と組み合わせて使用​​し、オンライン人数と訪問者の地域分布をカウントする例を示します。

通常、訪問者が Web サイトにアクセスすると、ページにユーザーの Cookie 情報が記録されます。Cookie の有効期限が切れると、ユーザーはオフラインとみなされます。この記事では、PHP を使用して訪問者の IP を記録し、クライアント上の Cookie と有効期限を記録します。同時に、Sina IP アドレス インターフェイスを通じて訪問者の地理的位置を取得します (この例では、都道府県のみを記録します)。それを統計用に mysql テーブルに書き込むと、一定期間内の訪問者の総数や訪問者の地域分布も確認できます。

HTML

現在のオンライン人数を表示するページに div #total を配置し、訪問者の地域分布を表示するために使用するリスト #onlinelist をデフォルトで配置し、後で jQuery を使用してリストに読み込みを行います。マウスが詳細リストを表示する上でスライドするときの制御。

 
<div class="demo"> 
      <div id="total">当前在线:<span id="onlinenum"></span></div> 
    <ul id="onlinelist"> 
        <li><img src=http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2013/0321/"loader.gif"></li> 
    </ul> 
</div> 

CSS

表示効果をレンダリングするために CSS を使用します。以下のコードでは、CSS3 を使用しています。そのため、効果をプレビューするには最新のブラウザーを使用することをお勧めします。

 
.demo{width:150px; margin:20px auto; font-size:14px} 
#total{padding:6px 10px; background:#090 url(arr.png) no-repeat right top; color:#fff;  
cursor:pointer; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px;  
-moz-box-shadow:0 0 3px #ccc; -webkit-box-shadow:0 0 3px #ccc;box-shadow:0 0 3px #ccc;} 
#onlinelist{background:#f7f7f7; border:1px solid #d3d3d3; display:none; -moz-border-radius:5px;  
-webkit-border-radius:5px; border-radius:5px; -moz-box-shadow:0 0 3px #ccc;  
-webkit-box-shadow:0 0 3px #ccc;box-shadow:0 0 3px #ccc;} 
#onlinelist li{height:20px; line-height:20px;padding:4px 6px;border-bottom:1px dotted #d9d9d9} 
#onlinelist li span{float:right} 
#onlinelist li:hover{background:#fff} 

MySQL

訪問者のIP、地域、アクセス時間を記録するためにオンラインでデータテーブルを準備する必要があります。サンプル統計プロセス全体はこのテーブルに依存しており、その構造は次のとおりです:

 
CREATE TABLE IF NOT EXISTS `online` ( 
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `ip` varchar(30) NOT NULL, 
  `province` varchar(64) NOT NULL, 
  `addtime` int(10) NOT NULL DEFAULT '0', 
  PRIMARY KEY (`id`) 
) ENGINE=MyISAM  DEFAULT CHARSET=utf8; 

PHP

online.php は、IP アドレスや地域などの訪問者情報を記録するために使用されます。まず、データ テーブルに訪問者 IP レコードがあるかどうかを確認し、存在する場合は、ユーザーの州と地域を取得し、ユーザーの IP、つまり州と地域をテーブルに挿入します。ここで、訪問者の Cookie レコードがあるかどうかを判断できます。存在しない場合は、Sina IP アドレス データベースから訪問者の地域情報を要求し、Cookie の値と有効期限を設定します。最後に、テーブル内の期限切れのレコードを削除し、レコードの総数をカウントして出力します。詳細はコードのコメントを参照してください。

 
include_once('connect.php'); //连接数据库 
 
$ip = get_client_ip(); //获取客户端IP 
$time = time(); 
//查询表中是否有ip为当前访客IP的记录 
$query = mysql_query("select id from online where ip='$ip'"); 
if(!mysql_num_rows($query)){//如果不存在访客IP 
    if($_COOKIE['geoData']){//如果存在cookie,则获取用户的区域 
        $province = $_COOKIE['geoData']; //区域(省份) 
    }else{ 
        $api = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=$ip"; 
        $json = file_get_contents($api);//调用新浪IP地址库 
        $arr = json_decode($json,true);//解析json 
        $province = $arr['province'];//获取省份 
        setcookie('geoData',$province,$time+600); //设置cookie,设置过期时间为10分钟 
    } 
    //将访客信息插入到数据表中 
    mysql_query("insert into online (ip,province,addtime) values ('$ip','$province','$time')"); 
}else{//如果存在,则更新该用户访问时间 
    mysql_query("update online set addtime='$time' where ip='$ip'"); 
} 
//删除已过期的记录 
$outtime = $time-600; 
mysql_query("delete from online where addtime<$outtime"); 
//统计总记录数,即在线用户数 
list($totalOnline) = mysql_fetch_array(mysql_query("select count(*) from online"));  
echo $totalOnline;//输出在线总数 
mysql_close(); 

新浪IPアドレスライブラリの呼び出しについて

get_client_ip() 関数は、ユーザーの実際の IP を取得するために使用されます。

 
function get_client_ip() { 
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) 
        $ip = getenv("HTTP_CLIENT_IP"); 
    else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"),  
"unknown")) 
        $ip = getenv("HTTP_X_FORWARDED_FOR"); 
    else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) 
        $ip = getenv("REMOTE_ADDR"); 
    else if (isset ($_SERVER[&#39;REMOTE_ADDR&#39;]) &&  
$_SERVER[&#39;REMOTE_ADDR&#39;] && strcasecmp($_SERVER[&#39;REMOTE_ADDR&#39;], "unknown")) 
        $ip = $_SERVER[&#39;REMOTE_ADDR&#39;]; 
    else 
        $ip = "unknown"; 
    return ($ip); 
} 

geo.php は、各州(地域)の訪問者数の分布をカウントするために使用されます。データベースにクエリを実行し、州ごとに並べ替えるだけで、フロントエンドの Ajax インタラクションを容易にするために、最終的なデータセットが JSON 形式で出力されることに注意してください。

 
include_once(&#39;connect.php&#39;);//连接数据库 
//查询区域统计 
$sql = "select province,count(*) as total from online group by province order by total desc"; 
$result = mysql_query($sql); 
while($row=mysql_fetch_array($result)){ 
    $list[] = array( 
        &#39;province&#39; => $row['province'], 
        'total' => $row['total'] 
    );     
} 
echo json_encode($list);//以json格式输出 

jQuery

フロントエンド ページが行う必要があるのは、ページが読み込まれるときに訪問者の合計数を表示することです。つまり、ajax を使用して online.php をリクエストします。次に、マウスを統計の矢印の上にスライドさせると、ajax 経由で geo.php をリクエストして、各地域および州のオンライン人口の数を取得し、その結果をドロップダウン形式で表示します。

 
$(function(){ 
    $("#onlinenum").load("online.php"); 
     
    $(".demo").hover(function(){ 
        $("#onlinelist").slideDown("fast"); 
        var str = ''; 
        $.getJSON("geo.php",function(json){ 
            $.each(json,function(index,array){ 
                str = str + "<li><span>"+array['total']+"</span>"+array['province']+"</li>"; 
            }); 
            $("#onlinelist").html(str); 
        }); 
    },function(){ 
        $("#onlinelist").slideUp("fast"); 
    }); 
}); 

最後に、この例は jquery に依存しているため、最初に jquery ライブラリをページにロードすることを忘れないでください。現在のバージョンは jquery-1.9.1 です。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。